Author:Christopher_L1n | CSDN Blog | 未经允许,禁止转载

Hive -> Hive 集群间迁移数据库表

阅读提示

为了代码易读性,脚本中加入冗余的参数赋值,可删除,直接使用$1、$2…等。

为了一步步检查输出是否正确,脚本中使用了大量临时文件,请读者自行精简。

尽可能在各小节尾整理各节的脚本。

本教程采用方案是直接覆盖目标库表的,类似overwrite。若要增量更新数据,可参考写在后面的方式,自行限定过滤条件,更新目标表。

建库

可通过下述语句在目标集群建库:

CREATE DATABASE IF NOT EXISTS dbname;

若无权限,可先获取ADMIN权限:

SET ADMIN;

整理为shell脚本:

#! /bin/bash

dbname=$1

tmpPath=$2

echo "CREATE DATABASE IF NOT EXISTS $dbname;" > tmpPath

beeline -f $tmpPath

获取该库下所有表名

可通过下述语句在源集群执行获取所有源库的所有表名:

USE dbname;

SHOW TABLES;

将上述文件写入hiveShowTB文件后,可写shell脚本:

#! /bin/bash

# $1 应为hiveShowTB文件,$2为输出文件,二者都建议绝对路径

beeline -f $1 > $2

此为输出:

+----------------+--+

| tab_name |

+----------------+--+

| tbname0 |

| tbname1 |

+----------------+--+

应删除无用字符,可使用sed处理:

# $hiveShowTB即上述hiveShowTB文件

cat $hiveShowTB | sed '/\+-/d' | sed 's/|//g' | sed 's/ //g' | sed 's/^$//g' > output

将本节的脚本整理一下:

#! /bin/bash

sqlTmp=$1

dbname=$2

tablesTmpOutput=$3

tablesOutput=$4

echo "USE $dbname;" > $sqlTmp

echo "SHOW TABLES;" >> $sqlTmp

beeline -f $sqlTmp > $tablesTmpOutput

cat $tablesTmpOutput | sed '/\+-/d' | sed 's/|//g' | sed 's/ //g' | sed 's/^$//g' > $tablesOutput

获取建表语句

在源集群执行下述语句,可获得指定表的建表语句:

USE dbname;

# 会丢失COMMENT注释内容,注释需要使用DESC TABLE tbname;来获取

# 本教程只是为了尽快写一个简单的拷贝工具,请读者自行实现获取COMMENT注释内容

SHOW CREATE TABLE tbname;

整理为shell脚本:

#! /bin/bash

dbname=$1

# 存放临时文件和建表文件的路径

storagePath=$2

# 指定库下所有表名的文件,由上一节脚本生成

tables=$3

cmdTmp="$storagePath/$dbname.cmdtmp"

ctTmp="$storagePath/$dbname.cttmp"

create="$storagePath/$dbname.create"

# 生成获取建表信息的SQL语句,整合到文件中

echo "USE $dbname;" > $cmdTmp

while read tablename

do

echo "SHOW CREATE TABLE $tablename;" >> $cmdTmp

done < $tables # $tables 为 纯表名文件

# 获取建表信息

beeline -f $cmdTmp > $ctTmp

# 删去无用字符

cat $tbTmp | sed '/Connecting to/d' | sed '/Debug is/d' | sed '/Acquire TGT/d' | sed '/Principal is/d' | sed '/Commit /d' | sed '/Connectd to/d' | sed '/Transaction isolation/d' | sed '/rows selected/d' | sed '/jdbc:hive2/d' | sed '/Closing:/d' | sed '/\+-/d' | sed 's/|//g' | sed '/createtab_stmt/d' | sed '/^$/d' > $create

即获得dbname.create文件。

建表

# 可添加到上一节的脚本末尾

beeline -f 上述dbname.create文件

有些表有依赖,若有表未成功创建,可再执行一遍,因此建议手动执行这节代码,而不是添加到上一节脚本中。

准备数据

配置完集群间互信,使用hadoop distcp在集群间拷贝表数据,拷贝直接覆盖目标库的各表文件。

拷贝表数据后,恢复元数据即可完成拷贝表数据:

#! /bin/bash

# 第一个参数:数据库名

dbname=$1

# 第二个参数:纯表名文件

tbListFile=$2

# 存放临时文件、日志和结果文件的路径,建议绝对路径

storagePath=$3

rpPath="$storagePath/$dbname.repair"

logPath="$storagePath/$dbname.log"

echo "USE $dbname;" > $rpPath

while read tablename

do

echo "MSCK REPAIR TABLE $tablename;" >> $rpPath

done < $tbListFile

# 这里的日志有问题,没有把建表时的输出打进来

beeline -f $rpPath >> $logPath

写在后面

如果采用的是将源集群的数据打包为dat、csv等文件,可以通过下述语句加载数据:

LOAD DATA INPATH "/user/hive/.../xxx.dat" INTO TABLE tablename;

若载数出现异常:

FAILED: SemanticException Unable to load data to destination table. Error: The file that you are trying to load does not match the file format of the destination table.

这是由于SequenceFile表不能使用LOAD指令加载数据,它只能导入sequence类型的数据。

解决方法

新建一张临时表,以STORED AS TEXTFILE限定存储方式,然后将数据载入临时表,再由临时表复制到目标表:

CREATE TEMPORARY TABLE tmptablename LIKE tablename STORED AS TEXTFILE;

LOAD DATA INPATH "hdfsfilepath" INTO TABLE tmptablename;

INSERT INTO TABLE tablename SELECT * FROM tmptablename;

mysql中overwrite,打造集群间HIVE数据库表半自动迁移(overwrite)工具相关推荐

  1. mysql中ndb_restore_mysql ndb集群与恢复

    一.实验环境 管理节点:192.168.50.219 数据节点:192.168.50.217,192.168.50.218 sql节点:192.168.50.216 装ndb前,先删除原先系统自带my ...

  2. 项目中使用Quartz集群分享--转载

    原文:http://hot66hot.iteye.com/blog/1726143 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖 ...

  3. hbase 学习(十三)集群间备份原理

    集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份 ...

  4. 集群间实现Session共享

    上一篇,同一tomcat不同项目下session共享方案:http://blog.csdn.net/qinmengdecluntan/article/details/72832648 一.引言 针对企 ...

  5. 一周碎碎念,2021.11.7,两个MGR集群间还可以构建传统的主从复制通道吗

    叨叨最近遇到的一些事以及见闻.思考. 1. GreatSQL编译环境Dockerfile更新了 用于构建GreatSQL编译环境的Dockerfile发现几个小瑕疵,于是更新了下. 利用Docker环 ...

  6. mysql集群与分布式数据库_Mysql集群与分布式数据库区别

    mysql集群与分布式数据库的区别 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执 ...

  7. Hadoop集群间文件拷贝

    Hadoop集群间文件拷贝 distcp使用 DistCp Version 2(分布式copy)是用于集群间/集群内的文件copy工具, 使用MapReduce实现分布式.错误处理.恢复和报告.dis ...

  8. Ambari在离线环境中安装Hadoop集群

    2019独角兽企业重金招聘Python工程师标准>>> http://www.hackbase.com/article-973-1.html (WJW)Ambari在离线环境中安装H ...

  9. Centos 6.4下 MySQL配置主从服务(集群)

    Centos 6.4下 MySQL配置主从服务(集群) 我们前面两篇文章都分别介绍了Mysql的安装及配置.备份及还原,今天我们继续前面的环境介绍一下Centos 6.4下MySQL配置主从实现数据同 ...

最新文章

  1. 独家 | 关于Facebook数据泄露你需要知道的事
  2. 在asp.net中控制回车键
  3. 好几天没写Blog了。
  4. 由捧哏巨匠谈创新的难度
  5. spring boot-html和templates
  6. 苹果计算机格式化磁盘,苹果电脑怎么格式化
  7. Seaweedfs 详细说明
  8. ps中批处理图片压缩
  9. 崔云php_佘家村里的“茉莉香”
  10. 如何修复Windows 10中最烦人的东西
  11. matlab加载xls文件报错,服务器出现意外情况,远程过程调用失败
  12. 笔记本电脑如何同时上内外网(通过usb外接网卡实现虚拟机连外网)
  13. 全球及中国海上撇油系统行业市场深度分析与十四五前景预测报告2022-2028年
  14. 读书笔记 | 自动驾驶中的雷达信号处理(第9章 汽车雷达的应用概述)
  15. 一、Python-劳务报酬计算器(新手练习)
  16. 解决Cannot invoke “java.sql.Connection.prepareStatement(String)“because “this.conn“ is null
  17. 项目管理 | 如何进行项目风险识别?
  18. 迷茫?生命科学如何破局冰山!道翰天琼认知智能机器人平台API接口大脑为您揭秘-64
  19. JavaScript进阶学习(Web APIs)
  20. Java三种多线程实现睡眠排序

热门文章

  1. 前端自学日记-day2
  2. 程序员刷 leetcode 经常陷入刷了忘忘了刷的尴尬局面怎么办?
  3. Python编码---转自金角大王
  4. 手机AP处理器简介:MTK-Marvell-Mtekvision
  5. DataX 快速入门
  6. css实现文字占两行
  7. 1加7 pro (oneplus7 pro) drivedroid测试
  8. IDEA插件恢复mysql结构数据
  9. 英语面试-询问问题篇
  10. JS中数组和字符串的方法大全