0


【大数据】HDFS、Hive、FTP的内网间的相互传递(附脚本获取数据)

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

标签: linux 大数据 hive

本文转载自: https://blog.csdn.net/m0_37172770/article/details/126613913
版权归原作者 纯码农 所有, 如有侵权,请联系我们删除。

“【大数据】HDFS、Hive、FTP的内网间的相互传递(附脚本获取数据)”的评论:

还没有评论