干货总结: Hive 数据导入 HBase

业务场景

Hive离线计算好的数据, 需要同步到HBase供在线业务查询.
思路是用 Hbase 自带的 ImportTsv 工具。

Hive 跑批

建表语句, 要用文本格式, 即 Tsv 格式, 分割符可以自己定义

CREATE TABLE IF NOT EXISTS tableA(
    rowkey STRING,
    ...
)
PARTITIONED BY(dt STRING)  -- format: 2017-06-01
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

跑批语句, 注意设置不要compress,否则 ImportTsv 工具无法识别

SET hive.exec.compress.output=false;
INSERT OVERWRITE TABLE tableA
PARTITION( tx_date = \"$CALC_DATE\" )
SELECT ..

生成中间的HFile

hbase --config config_dir org.apache.hadoop.hbase.mapreduce.ImportTsv \
    -Dmapreduce.job.queuename=queue \
    -Dimporttsv.bulk.output=hdfs:///hfile_path \
    -Dimporttsv.columns="HBASE_ROW_KEY,column_family:column_name.." \
    hbase_namespace:table_name \
    hdfs://hive_table_dir
  • config_dir 是 hbase 的配置目录, 里面包含 hbase-site.xml

这个步骤ImportTsv 会去读取 hive_table_dir 中的文件,并分析 hbase table 的region 分布, 生成对应region的hfile, 放到 hfile_path中

bulkload

hbase --config config_dir org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles \
    hdfs:///hfile_path \
    hbase_namespace:table_name

将上一步的hfile导入hbase table

总结

  • Hive 表必须是带分隔符的文本格式,而且不能压缩(比如启用了mapreduce的output snappy压缩也不行)
  • ImportTsv 可以直接一条条插入 hbase,这时 mapper 解析一条, 就插一条, 没有reduce阶段; 相比bulkload, 大批量数据性能不好
  • bulkload的优点是快,生成的 hfile 直接注册到 region server, 数据对应用立即可见, 没有wal log, 没有flush;如果配置了 hbase 备集群, 需要同时 bulkload 一份过去 (hbase主备同步基于 wal log);

相关推荐