mysql中overwrite,打造集群间HIVE数据库表半自动迁移(overwrite)工具
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)工具相关推荐
- mysql中ndb_restore_mysql ndb集群与恢复
一.实验环境 管理节点:192.168.50.219 数据节点:192.168.50.217,192.168.50.218 sql节点:192.168.50.216 装ndb前,先删除原先系统自带my ...
- 项目中使用Quartz集群分享--转载
原文:http://hot66hot.iteye.com/blog/1726143 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享 一:CRM对定时任务的依赖 ...
- hbase 学习(十三)集群间备份原理
集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份 ...
- 集群间实现Session共享
上一篇,同一tomcat不同项目下session共享方案:http://blog.csdn.net/qinmengdecluntan/article/details/72832648 一.引言 针对企 ...
- 一周碎碎念,2021.11.7,两个MGR集群间还可以构建传统的主从复制通道吗
叨叨最近遇到的一些事以及见闻.思考. 1. GreatSQL编译环境Dockerfile更新了 用于构建GreatSQL编译环境的Dockerfile发现几个小瑕疵,于是更新了下. 利用Docker环 ...
- mysql集群与分布式数据库_Mysql集群与分布式数据库区别
mysql集群与分布式数据库的区别 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执 ...
- Hadoop集群间文件拷贝
Hadoop集群间文件拷贝 distcp使用 DistCp Version 2(分布式copy)是用于集群间/集群内的文件copy工具, 使用MapReduce实现分布式.错误处理.恢复和报告.dis ...
- Ambari在离线环境中安装Hadoop集群
2019独角兽企业重金招聘Python工程师标准>>> http://www.hackbase.com/article-973-1.html (WJW)Ambari在离线环境中安装H ...
- Centos 6.4下 MySQL配置主从服务(集群)
Centos 6.4下 MySQL配置主从服务(集群) 我们前面两篇文章都分别介绍了Mysql的安装及配置.备份及还原,今天我们继续前面的环境介绍一下Centos 6.4下MySQL配置主从实现数据同 ...
最新文章
- 独家 | 关于Facebook数据泄露你需要知道的事
- 在asp.net中控制回车键
- 好几天没写Blog了。
- 由捧哏巨匠谈创新的难度
- spring boot-html和templates
- 苹果计算机格式化磁盘,苹果电脑怎么格式化
- Seaweedfs 详细说明
- ps中批处理图片压缩
- 崔云php_佘家村里的“茉莉香”
- 如何修复Windows 10中最烦人的东西
- matlab加载xls文件报错,服务器出现意外情况,远程过程调用失败
- 笔记本电脑如何同时上内外网(通过usb外接网卡实现虚拟机连外网)
- 全球及中国海上撇油系统行业市场深度分析与十四五前景预测报告2022-2028年
- 读书笔记 | 自动驾驶中的雷达信号处理(第9章 汽车雷达的应用概述)
- 一、Python-劳务报酬计算器(新手练习)
- 解决Cannot invoke “java.sql.Connection.prepareStatement(String)“because “this.conn“ is null
- 项目管理 | 如何进行项目风险识别?
- 迷茫?生命科学如何破局冰山!道翰天琼认知智能机器人平台API接口大脑为您揭秘-64
- JavaScript进阶学习(Web APIs)
- Java三种多线程实现睡眠排序