ftp提取文件到hdfs

ftp提取文件到hdfs

实际场景中,我们经常需要通过ftp协议把不同数据源的文件统一汇入到hdfs数据中心,经过实践,有以下的三种方法,分别列出其优缺点及适用场景。

一、先把文件ftp到本地,然后用命令上传到HDFS

HDFS上传命名

hdfs dfsput [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导致两边不一致,当然,该命令是主要用于集群间拷贝的。

适用场景:大量文件或大文件的拷贝。

Spark保存文件HDFS有两个关键步骤:指定文件保存位置和调用保存方法。 首先,我们需要指定文件保存的位置。在Spark中,可以使用`saveAsTextFile()`方法来指定文件的保存位置。该方法接受一个HDFS路径作为参数,表示文件保存的目录。 接下来,我们需要调用`saveAsTextFile()`方法来保存文件HDFS。在调用该方法之前,需要创建一个Spark RDD来保存文件内容。可以通过数据处理操作(比如`map()`、`filter()`等)来创建一个RDD,并将其保存到HDFS。 下面是一个示例代码,演示了如何将Spark RDD保存为文本文件HDFS: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext object SaveFileToHDFS { def main(args: Array[String]): Unit = { // 创建SparkConf对象 val conf = new SparkConf().setAppName("SaveFileToHDFS").setMaster("local") // 创建SparkContext对象 val sc = new SparkContext(conf) // 创建一个RDD val data = sc.parallelize(Seq("Hello", "World", "Spark")) // 指定文件保存路径 val savePath = "hdfs://localhost:9000/user/output/" // 保存RDD为文本文件HDFS data.saveAsTextFile(savePath) // 关闭SparkContext sc.stop() } } ``` 在上述示例中,首先创建了一个名为`SaveFileToHDFS`的Spark应用程序。然后,通过`SparkConf`对象设置了一些Spark的配置,如应用程序的名称和运行模式。 接下来,通过`SparkContext`对象创建了一个SparkContext,作为创建RDD的入口点。 然后,使用`parallelize()`方法创建了一个包含字符串的RDD。 接下来,指定了文件的保存路径。 最后,调用`saveAsTextFile()`方法,将RDD保存为文本文件HDFS指定的保存路径中。 当应用程序执行完成后,文件将被保存到HDFS中,并且可以通过HDFS的路径进行访问和查看。 需要注意的是,要保证HDFS的服务已经启动,并且文件保存路径在HDFS上是可写的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值