一、理论知识
(一)加载数据到HBase的三种方法:
- 通过MR job,使用TableOutputFormat加载到表中。(效率较低)
核心的原理还是使用htable的put方法,不过由于使用了mapreduce分布式提交到hbase,速度比单线程效率高出许多。 - 通过客户端API,写入表中。(效率较低)
- 通过Bulk load 运行MR job将数据输出为hbase内部格式,再加载数据到集群。(使用更少的CPU和网络资源)
(二)Bulk load两步走
- 通过MR job,使用HFileOutputFormat2,生成StoreFiles。
每一个输出的HFile 文件,都在一个单独的region内,所以需要使用TotalOrderPartitioner 进行分区。
保证map任务的输出为相互不交叉的主键空间范围,也就是对应hbase中region里的主键范围。 - 完成文件加载,将数据导入hbase集群中。
完成数据加载有两种方式:
#命令行--- completebulkload
#代码---ImportTsv.java HFileOutputFormat 或 LoadIncrementalHFiles
(三)生成HFile的方法
- 命令方式:
使用 importtsv 工具将 TSV 格式数据转换为 HFile。(自动生成MR任务) - 代码方式:
2.1 通过HFileOutputFormat2 类编写 MapReduce 程序来生成 HFile 。
案例1:https://github.com/jrkinley/hbase-bulk-import-example
案例2:https://www.cnblogs.com/smartloli/p/9501887.html
2.2 Spark bulk load:Using thin record bulk load.
案例1:(Hbase官网文档)Chapter 110 Bulk Load
(四)加载HFile的方法
- 命令方式:
1.1 使用 completebulkload 将 HFile 导入到 HBase中。
1.2 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles HDFS_Dir_Path HBase_table_name - 代码方式:
调用LoadIncrementalHFiles 的doBulkLoad 方法来导入。
(五)常用命令
- 创建HBase表格,并做预分区:
hbase org.apache.hadoop.hbase.util.RegionSplitter pre_split_table HexStringSplit -c pre_split_nums -f column_family
pre_split_table:需要创建和预分区的表格名称。 pre_split_nums:分区的个数。 column_family:列族名称。
- HBase中表的行数统计:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter table_name
table_name:Hbase表的名称。
- 将HFile文件导入HBase集群中,生成表数据:
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /hdfs_dir_path table_name
hdfs_dir_path:HDFS中存储HFile文件的目录(该目录下一级应该还有一个以列族名命名的子目录) table_name:HBase表的名称
二、代码实操
需求:下载纽约出租车数据(https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page),将CSV文件导入到HBase中。
- 方法一:命令行方式
#将纽约出租车数据文件导入hbase表格(taxi_nyc_2013_01)中
hbase org.apache.hadoop.hbase.mapreduc