1. 程式人生 > >linux下進行hive數據遷移

linux下進行hive數據遷移

大小 .com 留言 sep 執行命令 %s 增加 執行 推薦

嘗試了阿裏雲上推薦的數據遷移方式

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數據遷移