hive库之间同步表

同一个Hadoop集群

方法1 hdfs dfs -cp

#! /bin/bash
#需求描述:把hive import_db库里的多张表同步到 export_db库
#日期时间:

#仅是打印记录一下时间
startTime=$(date "+%Y-%m-%d %H:%M:%S")


#获取表,把要同步的表放在文件 table_list 每行一张表,格式为 db_name.table_name
list=$(cat table_list)
#遍历表
for i in list
do
	#获取库名、表名存入变量
	dbname=`echo $i |awk -F. '{print $1}'`
	tbl=`echo $i |awk -F. '{print $2}'`
	
	#首先判断目标表是否存在,若存在则进入下一轮循环
	hdfs dfs -test -e /user/hive/warehouse/export_db.db/$tbl
	if [ ! $? -eq 0 ] ;then
	
		echo "1、读取源表 $tbl 结构,并修改建表语句"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "show create table $i" >create_table_ddl.out
		
		cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/MapredParquetOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
		n=`cat table_ddl.sql |grep LOCATION |wc -l`
		if [ $n -eq 1 ];then
			echo "-------表输出格式不是 1 MapredParquetOutputFormat--------"
			cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/HiveIgnoreKeyTextOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
			n=`cat table_ddl.sql |grep LOCATION |wc -l`
			if [ $n -eq 1 ];then
				echo "-------表输出格式不是 2 HiveIgnoreKeyTextOutputFormat--------"
				cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/OrcOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
				echo "-------表输出格式是 3 OrcOutputFormat--------"
			else
			echo "-------表输出格式是 2 HiveIgnoreKeyTextOutputFormat--------"
			fi
		else
			echo "-------表输出格式是 1 MapredParquetOutputFormat--------"
		fi
		
		echo "2、创建 $tbl 表"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -f table_ddl.sql
		
		echo "3、执行 hdfs dfs -cp "
		hdfs dfs -cp /user/hive/warehouse/import_db.db/$tbl/* /user/hive/warehouse/export_db.db/$tbl
		
		echo "4、修复 $tbl 表"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "msck repair table export_db.$tbl"
		
	else
		echo "目标表已存在,进入下一轮循环"
		continue
	fi
done

endTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "开始时间:$startTime"
echo "结束时间:$endTime"
echo "执行结束!"

方法2 开启动态分区,insert overwrite

#! /bin/bash
#需求描述:把hive import_db库里的多张表同步到 export_db库
#日期时间:

#仅是打印记录一下时间
startTime=$(date "+%Y-%m-%d %H:%M:%S")


#获取表,把要同步的表放在文件 table_list 每行一张表,格式为 db_name.table_name
list=$(cat table_list)
#遍历表
for i in list
do
	#获取库名、表名存入变量
	dbname=`echo $i |awk -F. '{print $1}'`
	tbl=`echo $i |awk -F. '{print $2}'`
	
	#首先判断目标表是否存在,若存在则进入下一轮循环
	hdfs dfs -test -e /user/hive/warehouse/export_db.db/$tbl
	if [ ! $? -eq 0 ] ;then
	
		echo "1、读取源表 $tbl 结构,并修改建表语句"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "show create table $i" >create_table_ddl.out
		
		cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/MapredParquetOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
		n=`cat table_ddl.sql |grep LOCATION |wc -l`
		if [ $n -eq 1 ];then
			echo "-------表输出格式不是 1 MapredParquetOutputFormat--------"
			cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/HiveIgnoreKeyTextOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
			n=`cat table_ddl.sql |grep LOCATION |wc -l`
			if [ $n -eq 1 ];then
				echo "-------表输出格式不是 2 HiveIgnoreKeyTextOutputFormat--------"
				cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/OrcOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
				echo "-------表输出格式是 3 OrcOutputFormat--------"
			else
			echo "-------表输出格式是 2 HiveIgnoreKeyTextOutputFormat--------"
			fi
		else
			echo "-------表输出格式是 1 MapredParquetOutputFormat--------"
		fi
		
		echo "2、创建 $tbl 表"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -f table_ddl.sql
		
		echo "3、insert overwrite "
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "set hive.exec.dynamic.partition=true;set hive.exec.dynamic.partition.mode=nonstrict;set hive.exec.dynamic.partitions.pernode=1000;set hive.exec.max.dynamic.partitions=500;insert overwrite table export_db.$tbl partition(etl_date) select * from $dbname.$tbl;"
		
	else
		echo "目标表已存在,进入下一轮循环"
		continue
	fi
done

endTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "开始时间:$startTime"
echo "结束时间:$endTime"
echo "执行结束!"

不同Hadoop集群之间

使用 distcp

Hadoop distcp是一个用于在Hadoop集群之间高效复制大量数据的工具。它可以在不同的Hadoop集群之间或同一集群的不同命名空间之间复制数据。
Hadoop DistCp(Distributed Copy)是一种用于在Hadoop集群之间复制数据的工具。它可以在不同的Hadoop存储系统之间,例如HDFS、HBase、Hive等之间复制数据。

#! /bin/bash
#需求描述:把一个Hadoop集群hive import_db库里的多张表同步到另外一个Hadoop集群 export_db库
#日期时间:

#仅是打印记录一下时间
startTime=$(date "+%Y-%m-%d %H:%M:%S")


#获取表,把要同步的表放在文件 table_list 每行一张表,格式为 db_name.table_name
list=$(cat table_list)
#遍历表
for i in list
do
	#获取库名、表名存入变量
	dbname=`echo $i |awk -F. '{print $1}'`
	tbl=`echo $i |awk -F. '{print $2}'`
	
	#首先判断目标表是否存在,若存在则进入下一轮循环
	hdfs dfs -test -e /user/hive/warehouse/export_db.db/$tbl
	if [ ! $? -eq 0 ] ;then
	
		echo "1、读取源表 $tbl 结构,并修改建表语句"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "show create table $i" >create_table_ddl.out
		
		cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/MapredParquetOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
		n=`cat table_ddl.sql |grep LOCATION |wc -l`
		if [ $n -eq 1 ];then
			echo "-------表输出格式不是 1 MapredParquetOutputFormat--------"
			cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/HiveIgnoreKeyTextOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
			n=`cat table_ddl.sql |grep LOCATION |wc -l`
			if [ $n -eq 1 ];then
				echo "-------表输出格式不是 2 HiveIgnoreKeyTextOutputFormat--------"
				cat create_table_ddl.out |sed -n '/CREATE EXTERNAL/,/OrcOutputFormat/p' |sed -r 's/(\||EXTERNAL)//g' |sed "s/$dbname/export_db/g" >table_ddl.sql
				echo "-------表输出格式是 3 OrcOutputFormat--------"
			else
			echo "-------表输出格式是 2 HiveIgnoreKeyTextOutputFormat--------"
			fi
		else
			echo "-------表输出格式是 1 MapredParquetOutputFormat--------"
		fi
		
		echo "2、创建 $tbl 表"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -f table_ddl.sql
		
		echo "3、执行 distcp "
		Hadoop distcp -Dmapred.job.max.running=1000 -Ddistcp.bandwidth=1000 hdfs://172.1.1.0:8020//user/hive/warehouse/$dbname/$tbl/* hdfs://172.2.1.2:8020/user/hive/warehouse/export.db/$tbl
		
		echo "4、修复 $tbl 表"
		beeline -u "jdbc:hive2://localhost:10000/default;principal=xxxx" -e "msck repair table export_db.$tbl"
		
	else
		echo "目标表已存在,进入下一轮循环"
		continue
	fi
done

endTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "开始时间:$startTime"
echo "结束时间:$endTime"
echo "执行结束!"

Hadoop distcp是一个用于在Hadoop集群之间复制数据的工具。
而-Dmapred.job.max.running参数用于设置在同一时间内允许运行的最大MapReduce作业数。
默认情况下,此参数的值为0,表示没有限制。如果将其设置为1,则同一时间只能运行一个MapReduce作业。如果将其设置为2,则同一时间最多可以运行两个MapReduce作业,以此类推。

hadoop distcp -Dmapred.job.max.running=<max_running_jobs> <src_path> <dst_path>
<max_running_jobs>是允许同时运行的最大MapReduce作业数,<src_path>是源路径,<dst_path>是目标路径。


-Ddistcp.bandwidth选项用于限制distcp命令的带宽使用率。默认情况下,distcp命令使用所有可用的带宽,但是可以使用-Ddistcp.bandwidth选项来限制带宽使用率。
例如,以下命令将distcp命令的带宽限制为每秒1000 MB:
-Ddistcp.bandwidth=1000


-bandwidth <arg>:以 MB/second 为单位指定每个 map 的带宽
-m <arg>:限制同步启动的 map 数,默认每个文件对应一个 map,每台机器最多启动20个 map
-update:如果目标文件的名称和大小与源文件不同,则覆盖;如果目标文件大小和名称与源文件相同则跳过

示例:
hadoop distcp  -bandwidth 0.7  -m 100 -update  hdfs://172.1.1.0:8020//user/hive/warehouse/import.db/table_name/etl_date=20231129  hdfs://172.1.1.2:8020/user/hive/warehouse/export.db/table_name/


 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值