HBase 之数据的导入与导出

  • 使用Hbase的Put API 不适合快速的导入大数据
  • 使用Hbase的bulkload工具 大量数据导入最有效的方式,importtsv是个内置工具,以MapReduce任务的方式,可以将TSV文件转换成Hbase底层格式
  • 使用MapReduce任务 从其他格式或者数据是动态产生,比较灵活,但是设计不当,会造成性能底下。
  • Sqoop 导入 将Hadoop和关系型数据库的数据互相转移的工具,通过mapReduce任务。
  • DataX 不好用
  • Kettle 不会用

Sqoop 工具

自己安装Sqoop会有版本兼容性问题,CDH自带了,另外Sqoop V2不支持关系型数据库直接转换

  1. 将MySQL JDBC 复制到 sqoop 的lib目录

  2. 运行, -m 参数表示开启多少任务

bin/sqoop help
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root -P
bin/sqoop import --connect jdbc:mysql://localhost:3306/test \
--table csv \
--hbase-table test:demo --hbase-create-table \
--column-family d \
--hbase-row-key id \
--username root -P
-m 4

Importtsv 工具

Importtsv 有两种执行方式方式:

  • 使用put方法直接从tsv文件向 HBase 导入数据,适合少量数据
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c tablename INPUTFILE
  • 为completebulkload准备StoreFile,然后通过completebulkload直接迁移到HBase,这种方式需要两个步骤:

Step.1

hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=a,b,c -Dimporttsv.bulk.output=IMPORTOUTPUTDIR HBASETABLE INPUTFILE

Step.2

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles IMPORTOUTPUTDIR HBASETABLE

两种方式示例:

上传文件到HDFS

sudo -u hdfs hdfs dfs -Ddfs.replication=1 -put content_b.tsv /tmp/import/
  • HBase 直接导入
sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.columns=HBASE_ROW_KEY,d:md5,d:title,d:catid,d:modelid,d:published,d:publishedby,d:time,d:datetime,d:status \
test:content_b /tmp/import/content_b.tsv

可选参数

-Dimporttsv.separator=,
  • 转换StoreFile 导入

将content.csv文件导出成HBase所需要的StoreFile文件,由于hdfs 权限问题,我们需要: sudo -u hdfs

sudo -u hdfs hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.columns=HBASE_ROW_KEY,d:md5,d:title,d:catid,d:modelid,d:published,d:publishedby,d:time,d:datetime,d:status \
-Dimporttsv.bulk.output=/tmp/export/content \
test:content \
/tmp/import/content.tsv

可选参数

-Dimporttsv.separator=,

导入之前,可能要修改下文件权限

sudo -u hdfs hdfs dfs -chmod -R 777 /tmp/import/ /tmp/export

导入HBase

sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /tmp/export/content_b test:content_b

Region 预分区方法

create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

create 'test:region', { NAME => 'd', VERSIONS=> 1, COMPRESSION => 'SNAPPY', BLOOMFILTER=>'ROW'}, {NUMREGIONS => 3, SPLITALGO => 'HexStringSplit'}
create 'test:content_b', { NAME => 'd', VERSIONS=> 1, COMPRESSION => 'SNAPPY', BLOOMFILTER=>'ROW'}, { SPLITS=>['20000000', '40000000', '60000000','80000000']}

create 'test', { NAME => 'd', VERSIONS=> 1, COMPRESSION => 'SNAPPY', BLOOMFILTER=>'ROW'}, {NUMREGIONS => 4, SPLITALGO => 'HexStringSplit'}

HBase 导出

工具介绍

  • HBase 自带的MR工具 Export,导出成序列化文件,适用与备份与迁移

  • 借助Pig