汝之观览,吾之幸也!本文讲解生产中会遇到的问题,一般集群都部署在外网,如果集群部署在内网,那么怎么同步之前的 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、在空间大小很多的情况下可以做一月,一年的一次性同步

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: