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