採用hive自帶的方法生成Hfile,並將上億大數據量導入HBASE
1.0引入Hbase自帶的jar
由於採用CDH6.1的版本,hive直接使用Hbase方法會出現異常,hive採用hbase的方法,故需要將對應Hbase中的數據引用進來。
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-annotations-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-client-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-common-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-endpoint-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-examples-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-external-blockcache-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-hadoop2-compat-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-hadoop-compat-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-http-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-it-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-mapreduce-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-metrics-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-metrics-api-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-procedure-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-protocol-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-protocol-shaded-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-replication-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-resource-bundle-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-rest-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-rsgroup-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-server-2.1.0-cdh6.3.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-shaded-miscellaneous-2.2.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-shaded-netty-2.2.1.jar ;
add jar /opt/cloudera/parcels/CDH-6.3.1-1.cdh6.3.1.p0.1470567/lib/hbase/lib/hbase-shaded-protobuf-2.2.1.jar ;
2.0建Hfile表
我們採用HIVE指定文件存放格式的基本方法,將數據直接插入HIVE表中。HIVE 建表語句爲:
create table tmp.ODS_PRODC_CONTRACT_STATE_HFILE(
KEY STRING COMMENT 'HBASE_ROWKEY'
,iid STRING COMMENT '主鍵'
,pid STRING COMMENT '本次包ID'
,fid STRING COMMENT '本次文件ID'
,upload_date STRING COMMENT '批次日期'
,create_time STRING COMMENT '記錄生成時間'
......
)
STORED AS
INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.hbase.HiveHFileOutputFormat'
TBLPROPERTIES ('hfile.family.path' = '/user/hive/warehouse/ods.db/hive-hbase/ODS_PRODC_CONTRACT_STATE_HFILE2/record');
注意:此處的record應該與HBase中的family相同。
insert overwrite table tmp.ODS_PRODC_CONTRACT_STATE_HFILE
SELECT key
,iid
,pid
,fid
,upload_date
,create_time
......
FROM tmp.ods_prodc_contract_state10w order by key
;
插入相關數據之後可以在對應的HDFS中查看相關文件是否存在。
直接查詢該表會發現沒有相關數據。這裏的第一個字段會默認爲Hbase的KEY,但是這裏的key的名稱可以不爲key,其他的也可以。還有數據中不允許存在同樣的KEY,如果出現同樣的KEY會報錯。同時KEY的值應當具有順序,如果順序不同也會出錯。
3.0將數據導入Hbase中
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/hive/warehouse/ods.db/hive-hbase/ODS_PRODC_CONTRACT_STATE_HFILE ODS_PRODC_CONTRACT_STATE_HIVE
注意這裏的路徑應當去掉列族,也就是去掉record。否則會出現無法找到有效列族,導致數據無法錄入。
錄入數據:
查看數據量
注意:執行加載的指令後,原來HFILE會被轉移,再次LOAD會發現沒有對應文件。
親測有效。
最終花費了半天的時間將77億條HIVE數據遷移到了Hbase中。