业务场景
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);