Hbase BulkLoad

Hbase快速数据导入工具BulkLoad:利用Hbase的数据以特定的格式存储在HDFS内这一原理,通过MapReduce作业直接生成这种数据格式文件,然后上传到HDFS上合适的位置,完成大量数据快速入库。

Hbase数据带入方式

  • HBase Client 调用方式
  • MapReduce 任务方式
  • BulkLoad 工具方式
  • Sqoop 工具方式

BulkLoad优劣势

优势

  • 如果一次性入导入Hbase表的数据量巨大,不仅处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 “Bulk Loading”方法,即HBase提供的HFileOutputFormat类。
  • 利用Hbase的数据以特定的格式存储在HDFS内这一原理,直接生成这种HDFS中存储的数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。配合mapreduce完成,高效便捷,而且不占用region资源,增添负载。

劣势

  • 仅适合初次数据导入,即表内数据为空。
  • HBase集群与Hadoop集群为同一集群,即HBase所基于的HDFS为生成HFile的MR的集群。

BulkLoad使用

  1. 从数据源(通常为文本文件或其它数据库)提取数据并上传到HDFS。
  2. 利用一个MapReduce作业准备数据:通过编排一个MapReduce作业,需手动编写map函数,作业需要使用rowkey(行键)作为输出Key,KeyValue、Put或者Delete作为输出Value。MapReduce作业需要使用Hbase提供的HFileOutputFormat2来生成Hbase底层存储的HFile数据格式文件。为了有效的导入数据,需要配置HFileOutputFormat2使得每一个输出文件都在一个合适的区域中。
  3. 告诉RegionServers数据的位置并导入数据,这一步需要使用Hbase中的LoadIncrementalHFiles,将文件在HDFS上的位置传递给它,它就会利用RegionServer将数据导入到相应的区域,完成与Hbase表的关联。

命令行导入

直接导入数据

在Hbase中创建空表,如userinfo,使用Hbase自带的ImportTsv工具导入/opt/userinfo.tsv数据文件

1
$ hadoop jar $HBASE_HOME/lib/hbase-server-1.1.2.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,cf1:name,cf1:sex,cf2:class userinfo /opt/userinfo.tsv

分步导入数据

  • 将userinfo.tsv文件上传到HDFS某个目录,并在Hbase中创建userinfo表
1
$ hadoop fs -put /opt/userinfo.tsv /data_dir/source_file
  • 利用ImportTsv工具的Dimporttsv.bulk.output参数项指定生成的HFile文件位置/date_dir/bulkload_data/output
1
$ hadoop jar $HBASE_HOME/lib/hbase-server-1.1.2.jar importtsv -Dimporttsv.bulk.output=/date_dir/bulkload_data/output -Dimporttsv.columns=HBASE_ROW_KEY,cf1:name,cf1:sex,cf2:class userinfo /opt/userinfo.tsv
  • 利用completebulkload完成bluk load数据导入
1
$ hadoop jar $HBASE_HOME/lib/hbase-server-1.1.2.jar completebulkload /date_dir/bulkload_data/output userinfo

相关说明

  1. 将数据文件生成HFile方式是所有的加载方案里面是最快的,前提是:Hbase表须为空!如果表中已经有数据,HFile再次导入的时候,HBase的表会触发split分割操作
  2. 最终输出结果,无论是Map还是Reduce,输出建议只使用
  3. 指定的列和源文件字段必须全部匹配,不匹配则一定导入失败
  4. 命令行导入时默认的分隔符为tab符
  5. RowKey可以在任何位置:
    假设存在数据4列(逗号为分隔符)
    1,2,3,4
    第一列RowKey
    RowKey,2,3,4
    第三列RowKey
    1,2,RowKey,4
  6. 常用参数说明:
    -Dimporttsv.skip.bad.lines=false –> 若遇到无效行则失败
    ‘-Dimporttsv.separator=|’或‘-Dimporttsv.separator=,’ –> 指定分割符
    -Dimporttsv.timestamp=currentTimeAsLong –> 导入时使用指定的时间戳
    -Dimporttsv.mapper.class=my.Mapper –> 使用用户指定的Mapper类(默认的org.apache.hadoop.hbase.mapreduce.TsvImporterMapper)

参考链接

http://www.ibm.com/developerworks/cn/opensource/os-cn-data-import/index.html
http://www.aboutyun.com/thread-11652-1-1.html

Kyle Joe wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!