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数据迁移的一些过程和遇到的问题,如果有什么疑问可以留言。