ftp提取文件到hdfs
实际场景中,我们经常需要通过ftp协议把不同数据源的文件统一汇入到hdfs数据中心,经过实践,有以下的三种方法,分别列出其优缺点及适用场景。
一、先把文件ftp到本地,然后用命令上传到HDFS
HDFS上传命名
hdfs dfs –put [local_path] [hdfs_path]
优点:文件在本地可以进行本地化的一系列操作后,再放回hdfs中
缺点:文件传输经过两层,并且从源服务器到本地提取是单机串行,比较消耗时间。
适用于文件放入hfds前需要预处理的情景,如:.zip压缩文件不被hadoop支持的,所以我们可以先在本地转压缩方式然后再放入hdfs中。
1.ftp下载到本地
两种方法:
1)ftp工具下载
mget_ftp()
{
user=
passwd=
host=
local local_dir=$1
local remote_dir=$2
test -e $local_dir ||mkdir -p $local_dir
ftp -inv $host <<EOF
user $user $passwd
binary
cd $remote_dir
lcd $local_dir
hash
prompt off
mget *
#rmdelete /data/cyf_test/*
#rmdir /data/cyf_test
close
bye
EOF
}
2)wget
mget_using_wget()
{
local remote_dir=$1
wget ftp://IP:PORT/$REMOTE_DIR/* --ftp-user=$NAME --ftp-password=$PASSWORD --dont-remove-listing -r
}
这种方法会在本地建立一个和ftp服务器相同的目录结构
或者自定目录
wget --ftp-user=$USER --ftp-password=$PASSWORD ftp://$HOST/$remote_dir/$file -O $local_dir/$file
wget的速度相对于lftp和ftp快很多。
3)lftp
需要安装lftp
获取远程ftp上的列表
lftp -e 'ls;quit' sftp://$USER:$PASSWORD@$HOST/$REMOTE_DIR|sed '1,2d'|awk '{print $NF}' > $REMOTE_LIST
对数据下载
lftp sftp://$USER:$PASSWORD@$HOST -e "get $REMOTE_DIR/$file -o $LOCAL_DIR; bye"
2.删除ftp服务器上的文件
del_file_from_ftp()
{
u=
p=
ip=
local file=$1
local remote_dir=$2
ftp -inv $ip <<EOF
user $u $p
binary
prompt
delete $remote_dir/$file
bye
EOF
}
mdel_ftp()
{
local local_dir=$1
local remote_dir=$2
for file in `find $local_dir ! -name ".*"|sed '1d'|awk -F "/" '{print $NF}'`
do
del_file_from_ftp $file $remote_dir
done
}
//设置ssh互信登录
mdel_ftp_using_ssh()
{
local local_dir=$1
local remote_dir=$2
for file in `find $local_dir ! -name ".*"|sed '1d'|awk -F "/" '{print $NF}'`
do
ssh -t $USER@$IP "rm $remote_dir/$file"
done
}
3.上传到HDFS
upload_data_to_hdfs()
{
local upload_dir=""
local des_hdfs_dir=""
for file in `ls -l $LOCAL_DIR|grep "*.dat"|sed '1d'|awk '{print $NF}'`
do
echo "upload $file to $des_hdfs_dir"
$HDFS_EXE dfs -put $upload_dir/$file $des_hdfs_dir
done
}
二、HDFS dfs -cp
hdfs dfs –cp [ftp://username:password@hostname/ftp_path] [hdfs:///hdfs_path]
优点:简单,提取速度快
缺点:CLI执行不会显示进度
适用场景:适用于小文件的ftp拷贝。
这种方法没有实际使用过。
三、hadoop distcp
hadoop distcp [ftp://username:password@hostname/ftp_path] [hdfs:///hdfs_path]
优点:简单,能显示拷贝进度,并且是分布式提取的,数据比较快。
缺点: 如果拷贝的文件是不断有其他程序写入,会报错,因为该命令最后要对数据进行checksum导致两边不一致,当然,该命令是主要用于集群间拷贝的。
适用场景:大量文件或大文件的拷贝。