linux下進行hive數據遷移
嘗試了阿裏雲上推薦的數據遷移方式
https://yq.aliyun.com/articles/66042
首先確定一個默認的導出的hive數據庫
vi ~/.hiverc use test;
然後在hdfs上創建一個臨時目錄
hdfs dfs -mkdir /tmp/test
通過hive生成默認的導出數據庫的表 轉換成導出的hql文件
hive -e "show tables " | awk ‘{printf "export table %s to |/tmp/test/%s|;\n",$1,$1}‘ | sed "s/|/‘/g" > /home/hive/qcf/export.hql
手動運行hql文件 把hive數據庫中的表和數據先存儲到hdfs中創建的臨時目錄中
hive -f export.hql
將hdfs上存儲到臨時目錄的數據下載到本地集群
hdfs dfs -get /tmp/test /home/test
下載完成在把數據文件遷移到新的hadoop集群中
遷移完成後把遷移的數據放到新的集群環境的臨時目錄中
hdfs dfs -put /home/test /tmp/test
把上面的腳本備份一下由導出腳本通過sed命令轉換成導入腳本
cp export.hql import.sql
sed -i ‘s/export table/import table/g‘ import.sql
sed -i ‘s/ to / from /g‘ import.sql
在新的集群中也要設置hive的默認導入數據庫
vi ~/.hiverc use test;
執行命令
hive -f import.sql
到此hive數據遷移過程已經完成
由於hive中的數據過大所以在執行hive -f操作的時候盡量通過linux的後臺進行運行
同時在做導出操作時會發現hive報錯 原因是hive缺少hadoop中的兩個jar包
hadoop-common-2.6.2.jar hadoop-distcp-2.6.2.jar
使用是將這兩個jar包放到hive/lib目錄下面
導出過程也會遇到hive在執行是 java.lang.OutOfMemoryError: GC overhead limit exceeded
這個問題我是通過修改hive-env.sh文件來修改的
在else 中增加-Xmx4096m 加大初始化堆內存的大小,根據linux系統實際運行內存決定
if [ "$SERVICE" = "cli" ]; then
if [ -z "$DEBUG" ]; then
export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:+UseParNewGC -XX:- UseGCOverheadLimit"
else
export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xms10m -Xmx4096m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit"
fi
fi
之後在導入數據的時候也遇到一個問題 java.lang.OutOfMemoryError: Java heap space
這個問題沒有得到解決 導致數據無法正常導入
然後我就直接將本地文件put到hive的/warehouse/*.db 的目錄中
數據轉存到對應的實際上並沒有在hive數據庫中存在映射關系
我們需要手動創建分區 分區創建好之後 put進去的數據就會在hive命令中可以被查到了
本篇文章只是描述和分享一下hive數據遷移的一些過程和遇到的問題,如果有什麽疑問可以留言。
linux下進行hive數據遷移