大数据HDFSHiveFTP的内网间的相互传递(附脚本获取数据)
Posted 纯码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据HDFSHiveFTP的内网间的相互传递(附脚本获取数据)相关的知识,希望对你有一定的参考价值。
汝之观览,吾之幸也!本文讲解生产中会遇到的问题,一般集群都部署在外网,如果集群部署在内网,那么怎么同步之前的
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<<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_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、在空间大小很多的情况下可以做一月,一年的一次性同步
以上是关于大数据HDFSHiveFTP的内网间的相互传递(附脚本获取数据)的主要内容,如果未能解决你的问题,请参考以下文章