汝之观览,吾之幸也!本文讲解生产中会遇到的问题,一般集群都部署在外网,如果集群部署在内网,那么怎么同步之前的
Hive数据到外网,或者两个内网间怎么同步Hive数据,本文主要以shell脚本演示。
一、前提
内网间的网闸一般都有专门的公司运营,我们主要说怎么把数据存FTP,怎么从FTP取数据。
重点:
1、先在Hive库建好需要同步的表,表结构一致,表名可不一致
2、如果原有Hive库有分区,则需要先建好分区,不可直接创建目录
3、两边的Hive文件格式需要保持一致
4、数据需要放在相同目录下
5、保证源服务器、FTP服务器、目标服务器的空间大小,以免造成空间不足无法传递
二、HDFS->FTP
1、FTP上创建目录
根据源库的日期格式进行分区在FTP所在服务器建目录,从需要的年份日期开始建目录
脚本 create_dir.sh
#!/bin/bash# FTP用户目录file_path="/home/test"next_day=$(date -d day +%Y-%m-%d)i=0until[[$year_month_day==$next_day]]doyear_month_day=$(date -d "2021-01-01 $i days" +%Y-%m-%d)year=$(date -d "$year_month_day" +%Y)month=$(date -d "$year_month_day" +%m)day=$(date -d "$year_month_day" +%d)file_date_path=$file_path/表名/$year/$month/$day/
mkdir -p $file_date_path# 需要配置FTP用户权限,不然没法上传chown test:test $file_date_path((i++))done
执行脚本命令
sh create_dir.sh
#备注 在FTP服务器下执行,先赋权 chmod 777 create_dir.sh
2、下载HDFS文件到本地服务器并上传到FTP
脚本 hadoop-ftp.sh
#!/bin/bash# check_hdfs_foldercheck_hdfs_folder(){echo"-------check hdfs folder-------"`hadoop fs -test -d $1`}# check_foldercheck_folder(){echo"-------check local folder -------"if[ -e $1];thenecho"folder already exists"elseecho"folder mkdir success"mkdir -p $1fi}# upload_file_to_ftpupload_file_to_ftp(){`ftp -v -n FTP的Ip<<EOF
user FTP账号 FTP账号密码
binar
cd /home/shuju/$1/$2/$3/$4
lcd /home/datax/datax/shuju/$1/$2/$3/$4
prompt
mput *
bye
EOF
`# cd:FTP文件目录 lcd:源数据下载到本地地址}# delete_filedelete_file(){rm -rf /home/datax/datax/shuju/$1/$2/$3/
}# hadoop_to_local hadoop_to_local(){start_time=`date"+%Y-%m-%d %H:%M:%S"`# HDFS addressyearPath=/user/hive/warehouse/Hive库名/$1/y_=$2/
# local server addresslocalPath=/home/datax/datax/shuju
echo"-----------hdfs yearPath ------------"$yearPath
check_hdfs_folder $yearPathecho"-----------hdfs file ------------"$?if[$?==0];then
check_folder $localPath/$1/$2monthPath=$yearPath/m_=$3echo"-----------hdfs monthPath ------------"$monthPath
check_hdfs_folder $monthPathif[$?==0];then
check_folder $localPath/$1/$2/$3for((day=1; day<=31; day++));doif[$day -lt 10];thendaydir=0$dayelsedaydir=$dayfidayPath=$yearPath/m_=$3/d_=$daydirecho"-----------hdfs dayPath ------------"$dayPath
check_hdfs_folder $dayPathif[$?==0];then
check_folder $localPath/$1/$2/$3/$daydirecho"-----------hdfs to local start------------"`hadoop fs -put $dayPath/* $localPath/$1/$2/$3/$daydir/`echo"-----------hdfs to local end------------"fisleep 5s
echo"-----------upload_file_to_ftp start------------"
upload_file_to_ftp $1$2$3$daydirecho"-----------upload_file_to_ftp end------------"sleep 5s
donefifiecho"-----------delete_filedir start------------"
delete_file $1$2$3echo"-----------delete_filedir end------------"end_time=`date"+%Y-%m-%d %H:%M:%S"`echo"-----------start_time------------"$start_timeecho"-----------end_time------------"$end_time}# 表名 2021 01
hadoop_to_local $1$2$3
执行脚本命令
sh hadoop-ftp.sh 表名 年份 月份
# 备注:在源服务器下执行
3、删除本地下载的服务器文件
等目的源服务器已同步到FTP数据并且已上传到目的源HDFS
脚本 delete-ftp.sh
#!/bin/bashfor((day=$4; day<=$5; day++));doif[$day -lt 10];thendaydir=0$dayelsedaydir=$dayfifile_path=/home/shuju/$1/$2/$3/$daydir/*
echo"----------delete ftp file_path----------"$file_pathrm -rf $file_pathecho"----------delete ftp file success----------"done
执行脚本命令
#表名 2022 08 1 5sh delete-ftp.sh 表名 年份 月份 开始日 结束日
# 备注:在FTP服务器下执行
三、网闸同步
网闸同步由专门的公司处理,只要保证源FTP到目标FTP可进行文件传输即可,同时确保网闸给需要同步的文件格式赋权。
四、FTP->HDFS
1、在Hive上创建对应的分区
脚本 alter_partition.sh
#!/bin/bash#next_day=$(date -d day +%Y-%m-%d)next_day=$3i=0until[[$year_month_day==$next_day]]doyear_month_day=$(date -d "$2$i days" +%Y-%m-%d)year=$(date -d "$year_month_day" +%Y)month=$(date -d "$year_month_day" +%m)day=$(date -d "$year_month_day" +%d)echo"alter table "$1" add partition(y_="$year",m_="$month",d_="$day");">>D://partition.txt
((i++))done
执行脚本命令
# 表名 2022-01-01 2022-12-31sh alter_partition.sh 表名 开始日 结束日
# 备注:本地执行,之后把partition.txt的放到目的源服务器,目的Hive库执行
2、从FTP上下载文件到目标源服务器并同步到HDFS,同时删除当前服务器下载的文件
脚本 ftp-hadoop.sh
#!/bin/bash# check_hdfs_foldercheck_hdfs_folder(){echo"-------check hdfs folder-------"`hadoop fs -test -e $1`}# mkdir_hdfs_foldermkdir_hdfs_folder(){echo"-------mkdir_hdfs_folder-------"`hadoop fs -mkdir -p $1`}# delete_hdfs_filedelete_hdfs_file(){echo"-------delete_hdfs_file-------"`hadoop fs -rm -rf $1`}# check_foldercheck_folder(){echo"-------check local folder -------"if[ -e $1];thenecho"folder already exists"elsemkdir -p $1fi}# check_filecheck_file(){echo"-------check ftp file -------"if[ -f $1];thenreturn0elsereturn1fi}# upload_file_to_ftpdownload_ftp_to_local(){`ftp -v -n 目标源FTP的IP<<-EOF
user 目标源FTP账号 目标源FTP密码
binary
cd /dev/shuju/$1/$3/$4/$5
lcd /data1/shuju/$2/$3/$4/$5
prompt
mget *
bye
EOF
`#备注:cd 目标源FTP地址 lcd 目标源服务器文件存放地址}# delete_filedelete_file(){rm -rf /data1/shuju/$1/$2/$3/$4/
}# local_to_hadooplocal_to_hadoop(){start_time=`date"+%Y-%m-%d %H:%M:%S"`# HDFS addressmonthPath=/user/hive/warehouse/目标Hive库名/$2/y_=$3/m_=$4echo"-----------hdfs monthPath ------------"$monthPath
check_hdfs_folder $monthPathif[$?==0];thenfor((day=1; day<=31; day++));doif[$day -lt 10];thendaydir=0$dayelsedaydir=$dayfiecho"-----------ftp to local start------------"
download_ftp_to_local $1$2$3$4$daydirecho"-----------ftp to local end------------"sleep 5s
# add partitiondayPath=$monthPath/d_=$daydirecho"-----------hdfs dayPath ------------"$dayPathecho"-----------local to hdfs start------------"`hadoop fs -put /data1/shuju/$2/$3/$4/$daydir/* $dayPath/`echo"-----------local to hdfs end------------"sleep 5s
echo"-----------delete_file start------------"
delete_file $2$3$4$daydirecho"-----------delete_file end------------"doneend_time=`date"+%Y-%m-%d %H:%M:%S"`echo"-----------start_time------------"$start_timeecho"-----------end_time------------"$end_timefi}# 源表名 目标表名 年份 月份
local_to_hadoop $1$2$3$4
执行脚本命令
sh ftp-hadoop.sh 源表名 目标表名 年份(2022) 月份(08)# 备注 在目标源HDFS服务器上执行
3、删除目标源FTP文件
rm -rf 目标源FTP路径/表名
# 备注 在目标源FTP服务器上执行
五、在HIVE上查看数据
按照前面步骤操作成功即可在目标Hive中查询到同步的数据
六、题外
后期会做统一的同步更新,做好一键部署的升级版本,也可用datax做数据同步;
注意:
1、确保两边的FTP空间大小,避免空间太小导致一次只能传几天的数据进行同步
2、确保两边本地存放的空间大小,避免下载到本地空间太小
3、在空间大小很多的情况下可以做一月,一年的一次性同步
版权归原作者 纯码农 所有, 如有侵权,请联系我们删除。