同一个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/