[博学谷学习记录]超强总结,用心分享|HBase的Bulk Load批量加载操作

HBase的批量加载: 将一批数据一次性全部写入到HBase中

原生写入流程: 读取数据 --> hbase的内存 --> storeFile ---> HFile ---> 分裂 到更多的Region中

HBase的bulk load的应用场景: 适合于需要一次性写入大量的数据场景

演示步骤:

将CSV文件转换为HFile文件格式

package com.itheima.hbase.bulkload;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class BulkLoadMapper extends Mapper<LongWritable,Text,ImmutableBytesWritable,Put> {

ImmutableBytesWritable k2 = new ImmutableBytesWritable();

@Override

protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

//1. 获取一行数据

String line = value.toString();

//2. 判断数据是否为空

if(line != null && !"".equals(line.trim())){ // 注意: "" 前面千万别丢 !

//3. 执行数据切割操作. 从中找到k2和v2

String[] fields = line.split(",");

// 3.1 获取 rowkey,封装k2

k2.set(fields[0].getBytes());

// 3.2 获取 行数据, 封装 v2 put对象

Put v2 = new Put(fields[0].getBytes());

v2.addColumn("C1".getBytes(),"code".getBytes(),fields[1].getBytes());

v2.addColumn("C1".getBytes(),"rec_account".getBytes(),fields[2].getBytes());

v2.addColumn("C1".getBytes(),"rec_bank_name".getBytes(),fields[3].getBytes());

v2.addColumn("C1".getBytes(),"rec_name".getBytes(),fields[4].getBytes());

v2.addColumn("C1".getBytes(),"pay_account".getBytes(),fields[5].getBytes());

v2.addColumn("C1".getBytes(),"pay_name".getBytes(),fields[6].getBytes());

v2.addColumn("C1".getBytes(),"pay_comments".getBytes(),fields[7].getBytes());

v2.addColumn("C1".getBytes(),"pay_channel".getBytes(),fields[8].getBytes());

v2.addColumn("C1".getBytes(),"pay_way".getBytes(),fields[9].getBytes());

v2.addColumn("C1".getBytes(),"status".getBytes(),fields[10].getBytes());

v2.addColumn("C1".getBytes(),"timestamp".getBytes(),fields[11].getBytes());

v2.addColumn("C1".getBytes(),"money".getBytes(),fields[12].getBytes());

//4. 写出去

context.write(k2,v2);

}

}

}

  • 驱动类

package com.itheima.hbase.bulkload;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.Connection;

import org.apache.hadoop.hbase.client.ConnectionFactory;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Table;

import org.apache.hadoop.hbase.io.ImmutableBytesWritable;

import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

public class BulkLoadDriver {

public static void main(String[] args) throws Exception {

//1. 创建Job对象

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum","node1:2181,node2:2181,node3:2181");

Job job = Job.getInstance(conf, "BulkLoad");

//2. 设置提交Yarn的必备参数

job.setJarByClass(BulkLoadDriver.class);

//3. 设置MR的八大步骤

// 3.1 设置输入类和输入的路径

job.setInputFormatClass(TextInputFormat.class);

TextInputFormat.addInputPath(job,new Path("hdfs://node1:8020/hbase/bulkload/input/bank_record.csv"));

// 3.2 设置 Mapper类 和 输出 k2和v2

job.setMapperClass(BulkLoadMapper.class);

job.setMapOutputKeyClass(ImmutableBytesWritable.class);

job.setMapOutputValueClass(Put.class);

// 3.3 设置shuffle: 分区 3.4 排序 3.5 规约 3.6 分组 (此处全部都是默认值)

// 3.7 设置Reduce 和 输出 k3 和 v3的类型: 没有reduce

job.setNumReduceTasks(0);

// 建议: 不管有没有reduce, 都设置其k3和v3的类型, 如果没有reduce, 直接使用k2和v2的类型

job.setOutputKeyClass(ImmutableBytesWritable.class);

job.setOutputValueClass(Put.class);

// 3.8 设置输出类 和 输出的路径: 输出 HFile类型

job.setOutputFormatClass(HFileOutputFormat2.class);

// 3.8.1 设置HFile的相关信息: 表信息 Region信息

Connection hbaseConn = ConnectionFactory.createConnection(conf);

Table table = hbaseConn.getTable(TableName.valueOf("TRANSFER_RECORD"));

HFileOutputFormat2.configureIncrementalLoad(job,table,hbaseConn.getRegionLocator(TableName.valueOf("TRANSFER_RECORD")));

// 3.8.2 设置HFile的输出路径地址

HFileOutputFormat2.setOutputPath(job,new Path("hdfs://node1:8020/hbase/bulkload/output"));

// 4 提交任务

boolean flag = job.waitForCompletion(true);

System.exit(flag ? 0 : 1);

}

}

加载HFile到HBase中

hbase org.apache.hadoop.hbase.tool.LoadIncrementalHFiles 数据路径 HBase表名

注意:

数据路径 指的就是MR的输出路径

hbase org.apache.hadoop.hbase.tool.LoadIncrementalHFiles hdfs://node1.itcast.cn:8020/hbase/bulkload/output TRANSFER_RECORD

# 博学谷IT 技术支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值