HBase Bulk Load的基本使用

本文介绍了如何使用HBase Bulk Load工具将大量文本文件数据高效导入HBase表的方法。包括工具选型、BulkLoad的工作原理及使用步骤,并提供了一个具体的案例。

1.需求

最近在项目中需要将大量存在于文本文件中的数据批量导入到hbase表中,并且涉及到将多个文本文件中的数据合并到同一张hbase表中,而这些文本文件中的字段并不是完全相同的

2.工具选型

因为项目当中查询数据采用的是Phoenix,因此,最初想利用Phoenix的Bulk CSV Data Loading来实现,但是简单调研之后,发现并不适合我们本次的需求,后面我会补充一篇文章来对hbase的bulkload和Phoenix的Bulk CSV Data Loading进行一个简单的对比

3.HBase Bulk Load概览

HBase Bulk Load分为两个步骤,第一个步骤采用MapReduce将文件中的数据转换成hbase内部的数据格式,第二个步骤直接将生成的StoreFiles导入到HBase当中,使用Bulk Load导数据比直接使用HBase API能够明显地降低CPU和网络资源的使用率

4.HBase Bulk Load使用说明

4.1.ImportTsv

ImportTsv是一个能够将Tsv格式的数据处理成可以直接导入到HBase中的数据格式(StoreFiles)的工具,基本使用方式如下:

HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,d:c1,d:c2 -Dimporttsv.bulk.output=hdfs://storefileoutput datatsv hdfs://inputfile

这一步执行完毕后会在hdfs的/storefile-outputdir中生成中间文件StoreFiles,接着调用completebulkload就可以将数据最终导入到hbase中
注:

  • 上面的Dimporttsv.columns=HBASE_ROW_KEY为固定写法,指定我们的数据的第一列为row key;
  • d:c1中d为需要导入hbase表的列族,c1为列族中的列;
  • -Dimporttsv.bulk.output=hdfs://storefileoutput为生成的中间文件StoreFiles的存放路径
  • datatsv为hbase的表名;
  • hdfs://inputfile为tsv文件的路径;

补充几个可选参数:

-Dimporttsv.skip.bad.lines=false -遇到错误行则任务自动失败
-Dimporttsv.separator=, -自定义行内分隔符为comma
-Dimporttsv.timestamp=currentTimeAsLong -导入数据时使用自定义的时间戳(基本不用)
-Dimporttsv.mapper.class=my.Mapper -使用自定义的Mapper类来替代默认的 org.apache.hadoop.hbase.mapreduce.TsvImporterMapper
4.2CompleteBulkLoad

completebulkload 会将上一步生成的StoreFiles导入到HBase中,导入成功后自动删除这些中间文件

HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase classpath` ${HADOOP_HOME}/bin/hadoop jar ${HBASE_HOME}/hbase-server-VERSION.jar completebulkload <hdfs://storefileoutput> <tablename>

5.温馨提示

如果需要BulkLoad的数据量过大,在hbase建表的时候请提前做好合适的pre-split

6.一个简单的小例子

6.1hbase建表语句
create 'user', '0', SPLITS => ['1', '2', '3', '4', '5','6', '7', '8', '9']
6.2ImportTsv

注:6.2和6.3中的命令和jar包路径均为hdp2.5的默认安装位置

HADOOP_CLASSPATH=`/usr/hdp/current/hbase-master/bin/hbase classpath` /usr/hdp/current/hadoop-client/bin/hadoop jar /usr/hdp/2.5.0.0-1245/hbase/lib/hbase-server-1.1.2.2.5.0.0-1245.jar importtsv -Dimporttsv.separator=, -Dimporttsv.columns=HBASE_ROW_KEY,0:id_name,0:id_no,0:id_type,0:user_status,0:if_receive,0:mobile_no -Dimporttsv.bulk.output=hdfs:///bulkdata/a user hdfs:///data/WB10_user1019_im.txt
6.3Complete Bulk Load
HADOOP_CLASSPATH=`/usr/hdp/current/hbase-master/bin/hbase classpath` /usr/hdp/current/hadoop-client/bin/hadoop jar /usr/hdp/2.5.0.0-1245/hbase/lib/hbase-server-1.1.2.2.5.0.0-1245.jar completebulkload hdfs:///bulkdata/a user

至此,HBase Bulk Load的基本使用方法已经介绍完了,如需了解更多内容,请参考HBase官方文档

<think> 我们参考上述提供的引用内容,来回答用户关于HBase BulkLoad执行逻辑的问题。 根据引用[1]:BulkLoad首先使用MapReduce将待写入集群数据转换为HFile文件,再直接将这些HFile文件加载到在线集群中。分为两个阶段: 1. HFile生成阶段:运行一个MapReduce任务,其中mapper需要自己实现,而Reduce由HBase实现(具体来说,是使用HFileOutputFormat2来生成HFile)。 2. HFile导入阶段:使用completebulkload工具将HFile加载到在线HBase集群。 引用[4]提到,在生成HFile时,需要保证传递的Cell必须是有序的(因为HFile内部要求有序),并且使用了HFileOutputFormat2类来配置MapReduce作业。 引用[5]展示了具体步骤:先清空表(如果需要),然后开发MapReduce程序生成HFile,最后使用completebulkload将HFile导入到HBase表中。 因此,我们可以将执行逻辑分为两个主要步骤: 第一步:通过MapReduce作业生成HFile文件 - 需要自定义Mapper,将输入数据转换为Put或Delete对象(即HBase的写入操作),或者直接生成KeyValue(Cell)对象。 - 在MapReduce作业中设置OutputFormat为HFileOutputFormat2,它会将输出写成HFile格式,并存储在HDFS上的指定目录中。 - 注意:在生成HFile时,数据必须按照目标表的Region边界进行分区,并且每个分区内的数据要按照RowKey排序(因为HFile要求有序)。 第二步:将生成的HFile加载到HBase表中 - 使用HBase自带的completebulkload工具(通常通过命令行执行),将第一步生成的HFile目录加载到目标表中。 - 这个工具实际上会移动HFile到HBase的数据目录(通常是/hbase/data/命名空间/表名/区域名/列族名/),并通知RegionServer将这些文件上线。 值得注意的是,在第二步中,移动HFile文件的过程是很快的,因为它只是HDFS上的文件移动操作,不需要经过RegionServer的写入流程(避免写WAL和MemStore),因此不会产生写放大,性能很高。 另外,引用[3]提到HBase与Hive的整合,虽然与BulkLoad没有直接关系,但说明了对HBase数据分析的一种方式。 下面我们用更结构化的方式描述执行逻辑: ### HBase BulkLoad执行逻辑 1. **HFile生成阶段(MapReduce作业)**: - **输入数据**:待导入的数据,通常存储在HDFS上(如文本文件、序列文件等)。 - **Map阶段**:自定义Mapper读取输入数据,将每一行数据转换为一个或多个KeyValue(Cell)对象。注意,输出的Key必须是`ImmutableBytesWritable`(代表行键),Value是`KeyValue`或`Put`/`Delete`(取决于使用的OutputFormat)。 - **分区和排序**:MapReduce作业需要根据目标HBase表的Region边界进行分区(使用TotalOrderPartitioner),并且在每个分区内按照RowKey的字典序排序。HFileOutputFormat2的configureIncrementalLoad方法会自动设置这些。 - **Reduce阶段**:实际上,HFileOutputFormat2使用了一个内置的Reducer(也可以不用Reducer,但通常使用一个Reducer来按Region分区并排序),它将相同Region的数据收集起来,并按照RowKey、列族、列限定符、时间戳排序,然后写入HFile。 - **输出**:在HDFS上生成HFile文件,每个列族一个目录,目录内包含多个HFile(每个Region一个或多个)。 2. **HFile加载阶段**: - 使用`completebulkload`命令(或通过API调用LoadIncrementalHFiles工具)将生成的HFile加载到HBase表中。 - 该工具会检查HFile的完整性,并将HFile移动到HBase表对应的列族目录下。 - 然后,RegionServer会检测到新的HFile,并将其上线(即可以作为查询的数据源)。这个过程不会阻塞RegionServer的读写。 注意事项: - 在生成HFile时,要确保RowKey的顺序与目标表的Region划分一致,否则在加载时可能会失败(因为HFile的RowKey范围必须完全落在某个Region的范围内)。 - 在加载HFile之前,目标表必须已经存在,并且列族要与HFile中的列族匹配。 通过以上步骤,BulkLoad避免了常规写入路径(即通过RegionServer的Put操作),从而大大减轻了RegionServer的负担,特别适合大规模数据初始化导入。 §§相关问题§§ 1. HBase BulkLoad过程中如何保证数据的有序性? 2. 使用BulkLoad导入数据时,如果目标表正在被访问,会有影响吗? 3. 除了MapReduce,还能用其他方式生成HFile吗? 4. BulkLoad适合实时写入的场景吗? </think> ### HBase BulkLoad执行逻辑 HBase BulkLoad是一种高效的大数据批量导入技术,核心逻辑分为两个阶段: #### 1. **HFile生成阶段** - **输入**:原始数据(如HDFS上的文本/序列文件) - **处理流程**: 1. **MapReduce作业**: - **Mapper**:自定义逻辑将原始数据转换为HBase的`KeyValue`结构(行键+列族+列+值+时间戳)[^1][^4] $$ \text{Mapper:} \quad (\text{rowKey}, \text{columnFamily}, \text{qualifier}, \text{value}, \text{timestamp}) $$ - **Reducer**:由HBase的`HFileOutputFormat2`实现,自动完成: - 按行键字典序排序 - 按目标表的Region边界分区 - 生成HFile文件(列族独立存储)[^1][^4] 2. **输出**:在HDFS生成合规的HFile文件(列族目录结构) #### 2. **HFile导入阶段** - **执行命令**: ```bash hadoop jar hbase-VERSION.jar completebulkload /hdfs/hfile/path tableName ``` - **关键操作**: 1. **Region定位**:根据HFile的行键范围匹配目标Region 2. **原子性移动**:将HFile从临时目录移动到HBase数据目录(`/hbase/data/表名/Region名/列族/`) 3. **元数据更新**:更新`.regioninfo`文件引用新HFile[^2][^5] 4. **上线生效**:RegionServer自动加载新文件,无需重启 #### ⚠️ 注意事项 1. **数据有序性**:输入数据必须按行键预排序,否则需在MapReduce中显式排序[^4] 2. **表结构匹配**:HFile的列族必须与目标表一致 3. **原子性保证**:`completebulkload`操作是原子的,失败会自动回滚[^5] 4. **性能优势**:绕过WAL和MemStore,直接写HFile,吞吐量提升10倍+ > 示例流程:将`/input/user.txt`通过BulkLoad导入表`myuser2`[^5] > `MapReduce生成HFile → completebulkload加载 → 数据立即可查`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值