Hive小文件合并遷移

1 需求

Hive數(shù)據(jù)庫內(nèi)有4張表,每張表有1TB左右數(shù)據(jù),按天分區(qū),需要將這4張表的數(shù)據(jù)遷移到另一個(gè)集群。因?yàn)閮蓚€(gè)Hadoop集群都開啟了kerberos身份認(rèn)證,直接進(jìn)行數(shù)據(jù)遷移不太好實(shí)現(xiàn),所以需要先將A集群的數(shù)據(jù)下載到本地,再遷移到B集群本地,最后從B本地上傳到B集群的Hive庫里。不過有一個(gè)問題,因?yàn)镠ive庫表中有大量的小文件,若直接下載上傳這些小文件,速度特別的慢,所以得先進(jìn)行一步小文件合并工作。需求和方案明確后進(jìn)行具體操作。

2 小文件合并

我們通過SparkSQL進(jìn)行小文件合并,首先開啟spark-shell申請足夠多的資源:

spark-shell --master yarn --driver-memory 20g  --driver-cores 4 --executor-cores 6 --num-executors 18 -- executor-memory 18g 

依次合并Hive表各分區(qū)的小文件,將幾十萬個(gè)小文件合并為50個(gè)大文件:

sqlContext.read.parquet(“/wa/hive/fms/t_flowdata/time_part=2017-03-20/”).repartition(50).write.parquet(“/apps/hive/fms/t_flowdata/time_part=2017-03-20/”);
sqlContext.read.parquet(“/wa/hive/fms/t_flowdata/time_part=2017-03-21/”).repartition(50).write.parquet(“/apps/hive/fms/t_flowdata/time_part=2017-03-21/”);
……

3 下載上傳文件

在A集群下載合并后的Hive表文件到本地目錄,為提高下載效率可以開多個(gè)終端,每個(gè)終端下載不同分區(qū)數(shù)據(jù)到不同磁盤目錄中。

hdfs dfs –get /apps/hive/fms/t_flowdata/ /data/data1/

A集群數(shù)據(jù)下載完成后需要傳到B集群本地目錄,然后通過HDFS命令上傳到B集群的Hive庫中:

scp –r /data/data1/t_flowdata B:/data/data1/
hdfs dfs –put /data/data1/  /wa/hive/fms/t_flowdata/

我們將A集群Hive庫里的表文件導(dǎo)入了B集群的Hive庫。最后需要連接B集群Hive庫,添加導(dǎo)入的表分區(qū)元數(shù)據(jù)給對應(yīng)表,以使可以通過sql查詢到B集群Hive庫里的導(dǎo)入分區(qū)數(shù)據(jù)。

beeline –u “jdbc:hive2://node10:10000/;principal=hive/node10@HADOOP.COM”
use fms;
alter table t_flowdata add partition(time_part=’ 2017-03-20’);
alter table t_flowdata add partition(time_part=’ 2017-03-21’);

至此,跨越兩個(gè)開啟kerberos認(rèn)證的Hadoop集群,遷移包含大量小文件的Hive庫數(shù)據(jù)的任務(wù)完成。
注意:小文件合并步驟必不可少,兩個(gè)集群間大量小文件的傳輸性能會(huì)異常的低下。而且還會(huì)給namenode增加很大的壓力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容