【大数据】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=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、在空间大小很多的情况下可以做一月,一年的一次性同步

你可能感兴趣的:(大数据,Linux,linux,大数据,hive,hdfs)