Hive的遷移涉及兩個技術點:
- 僅遷移元數據(參考網易雲提出的思路,https://sq.163yun.com/blog/article/173577620075286528);
- 元數據及Hive數據全量遷移。
考慮到多數場景是遷移整個Hive數據庫,該篇文章只介紹遷移的第二種,即元數據及Hive數據全量遷移。
這里使用的export/import這兩個指令
主要的流程:
- 將舊集群的hive數據導出至其hdfs中
- 將舊集群hdfs中的導出數據下載到本地中
- 將本地的導出數據上傳至新的集群hdfs中
- 將新集群hdfs中的數據導入至新集群中的hive中
● 將舊集群的hive數據導出至其hdfs中
數據導出
設置hive啟動默認數據庫
在家目錄中新建.hiverc文件,配置默認的數據庫(即你需要導出的數據庫)
vim ~/.hiverc
use export_db;
在hdfs上創建導出目錄
hdfs dfs -mkdir -p /tmp/export_db_export
導出舊集群的hive數據
生成導出腳本
hive -e "show tables;" | awk '{printf "export table %s to |/tmp/export_db_export/%s|;\n",$1,$1}' | sed "s/|/'/g" | grep -v tab_name > ~/export.hql
導出數據
hive -f ~/export.hql
● 將導出的數據下載到本地
數據中轉
下載數據
hdfs dfs -get /tmp/export_db_export ~/export_db
● 將本地的導出數據上傳至新的集群hdfs中
數據遷移
前提:已將導出的數據目錄遷移至新集群
上傳數據
hdfs dfs -put ~/export_db /tmp/export_db_export
● 將新集群hdfs中的數據導入至新集群中的hive中
數據導入
生成導入腳本
我們將之前的export.hql腳本修改下就可以當做我們的import.hql腳本
cp ~/export.sql ~/import.sql
sed -i 's/export /import /g' ~/import.sql
sed -i 's/ to / from /g' ~/import.sql
導入數據
這里也需要設置hive的默認數據庫
vim ~/.hiverc
use import_db;
導入數據
hive -f ~/import.sql
至此Hive數據的遷移就完成.
在部分有安全控制的集群環境下,hive連接被禁用了。這時候需要使用beeline連接hive並進行數據遷移,下面給大家介紹下如何使用beeline來進行數據遷移
使用beeline進行導出腳本的生成
beeline -u jdbc:hive2://cdh01:10000 -e "use export_db;show tables;"| awk '{printf "export table %s to |/tmp/export_db_export/%s|;\n",$2,$2}' | sed "s/|/'/g"|sed '1,3d'|sed '$d' > ~/export.hql
執行導出腳本
sed -i '1i use export_db;' ~/export.hql
beeline -u jdbc:hive2://cdh01:10000 -n hdfs -f ~/export.hql
這里使用distcp來進行hdfs文件在新集群的上傳
hadoop distcp hdfs://cdh01:8020/tmp/export_db_export/ hdfs://cdh02:8020/tmp/export_db_export
新的集群hdfs目錄需要提前創建
修改import.hql
cp ~/export.hql ~/import.hql
sed -i 's/export /import /g' ~/import.hql
sed -i 's/ to / from /g' ~/import.hql
sed -i '1d' ~/import.hql
sed -i '1i use import_db;' ~/import.hql
導入數據
create database import_db;
beeline -u jdbc:hive2://cdh02:10000 -n hdfs -f ~/import.hql
至此數據遷移完成