汝之观览,吾之幸也!本文讲解生产中会遇到的问题,一般集群都部署在外网,如果集群部署在内网,那么怎么同步之前的 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=0
until [[ $year_month_day == $next_day ]]
do
year_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_folder
check_hdfs_folder() {
echo "-------check hdfs folder-------"
`hadoop fs -test -d $1`
}
# check_folder
check_folder() {
echo "-------check local folder -------"
if [ -e $1 ];then
echo "folder already exists"
else
echo "folder mkdir success"
mkdir -p $1
fi
}
# upload_file_to_ftp
upload_file_to_ftp() {
`ftp -v -n FTP的Ip< 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_file delete_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 address yearPath=/user/hive/warehouse/Hive库名/$1/y_=$2/ # local server address localPath=/home/datax/datax/shuju echo "-----------hdfs yearPath ------------"$yearPath check_hdfs_folder $yearPath echo "-----------hdfs file ------------"$? if [ $? == 0 ];then check_folder $localPath/$1/$2 monthPath=$yearPath/m_=$3 echo "-----------hdfs monthPath ------------"$monthPath check_hdfs_folder $monthPath if [ $? == 0 ];then check_folder $localPath/$1/$2/$3 for((day=1; day<=31; day++)); do if [ $day -lt 10 ];then daydir=0$day else daydir=$day fi dayPath=$yearPath/m_=$3/d_=$daydir echo "-----------hdfs dayPath ------------"$dayPath check_hdfs_folder $dayPath if [ $? == 0 ];then check_folder $localPath/$1/$2/$3/$daydir echo "-----------hdfs to local start------------" `hadoop fs -put $dayPath/* $localPath/$1/$2/$3/$daydir/` echo "-----------hdfs to local end------------" fi sleep 5s echo "-----------upload_file_to_ftp start------------" upload_file_to_ftp $1 $2 $3 $daydir echo "-----------upload_file_to_ftp end------------" sleep 5s done fi fi echo "-----------delete_filedir start------------" delete_file $1 $2 $3 echo "-----------delete_filedir end------------" end_time=`date "+%Y-%m-%d %H:%M:%S"` echo "-----------start_time------------"$start_time echo "-----------end_time------------"$end_time } # 表名 2021 01 hadoop_to_local $1 $2 $3 执行脚本命令 sh hadoop-ftp.sh 表名 年份 月份 # 备注:在源服务器下执行 3、删除本地下载的服务器文件 等目的源服务器已同步到FTP数据并且已上传到目的源HDFS 脚本 delete-ftp.sh #!/bin/bash for((day=$4; day<=$5; day++)); do if [ $day -lt 10 ];then daydir=0$day else daydir=$day fi file_path=/home/shuju/$1/$2/$3/$daydir/* echo "----------delete ftp file_path----------"$file_path rm -rf $file_path echo "----------delete ftp file success----------" done 执行脚本命令 #表名 2022 08 1 5 sh 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=$3 i=0 until [[ $year_month_day == $next_day ]] do year_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-31 sh alter_partition.sh 表名 开始日 结束日 # 备注:本地执行,之后把partition.txt的放到目的源服务器,目的Hive库执行 2、从FTP上下载文件到目标源服务器并同步到HDFS,同时删除当前服务器下载的文件 脚本 ftp-hadoop.sh #!/bin/bash # check_hdfs_folder check_hdfs_folder() { echo "-------check hdfs folder-------" `hadoop fs -test -e $1` } # mkdir_hdfs_folder mkdir_hdfs_folder() { echo "-------mkdir_hdfs_folder-------" `hadoop fs -mkdir -p $1` } # delete_hdfs_file delete_hdfs_file() { echo "-------delete_hdfs_file-------" `hadoop fs -rm -rf $1` } # check_folder check_folder() { echo "-------check local folder -------" if [ -e $1 ];then echo "folder already exists" else mkdir -p $1 fi } # check_file check_file() { echo "-------check ftp file -------" if [ -f $1 ];then return 0 else return 1 fi } # upload_file_to_ftp download_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_file delete_file() { rm -rf /data1/shuju/$1/$2/$3/$4/ } # local_to_hadoop local_to_hadoop() { start_time=`date "+%Y-%m-%d %H:%M:%S"` # HDFS address monthPath=/user/hive/warehouse/目标Hive库名/$2/y_=$3/m_=$4 echo "-----------hdfs monthPath ------------"$monthPath check_hdfs_folder $monthPath if [ $? == 0 ];then for((day=1; day<=31; day++)); do if [ $day -lt 10 ];then daydir=0$day else daydir=$day fi echo "-----------ftp to local start------------" download_ftp_to_local $1 $2 $3 $4 $daydir echo "-----------ftp to local end------------" sleep 5s # add partition dayPath=$monthPath/d_=$daydir echo "-----------hdfs dayPath ------------"$dayPath echo "-----------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 $daydir echo "-----------delete_file end------------" done end_time=`date "+%Y-%m-%d %H:%M:%S"` echo "-----------start_time------------"$start_time echo "-----------end_time------------"$end_time fi } # 源表名 目标表名 年份 月份 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、在空间大小很多的情况下可以做一月,一年的一次性同步 好文推荐
发表评论