使用shell脚本实现无需输入密码远程拷贝文件然后上传至hdfs中

今日需要将一台Web服务器上的用户上传的图片信息上传到hdfs中,由于Web服务器是第三方的,因此不能通过修改应用代码的方式实现,这时就需要将数据拷贝到Hadoop服务器上然后上传至hdfs中,接下来记录下这次的实现过程。
首先需要将对方的数据远程拷贝到Hadoop服务器上,最简便的方式是配置ssh免密码登录然后进行拷贝,但是由于是第三方的服务器,最终还是选用了使用shell和expect实现无需输入密码远程拷贝文件。首先创建了一个拷贝脚本。参考博客:http://blog.itpub.net/27042095/viewspace-745587/

创建一个shell脚本copy.sh,内容如下

	#!/bin/bash
	src_host=192.168.1.110
	src_pwd=apple+APPLE
	src_path=/home/ny/appleAppFile/all.json
	src_user=apple
	expect -c "
	spawn scp -r ${src_user}@${src_host}:${src_path} .
	expect \"password:\"
	send \"${src_pwd}\r\"
	expect eof
	"

但是路径名展开 是 shell 的特性,expect 没有,上述脚本只能拷贝单个文件,无法递归拷贝整个目录,这时需要对脚本进行修改
首先创建一个scp-r.sh的脚本

#!/bin/bash
scp -r $1 $2

然后对copy.sh进行一些改动,修改后如下

#!/bin/bash
src_host=192.168.1.110
src_pwd=apple+APPLE
#更改为目录
src_path=/home/ny/appleAppFile/xwzxImg
src_user=root
expect -c "
spawn bash ./scp-r.sh ${src_user}@${src_host}:${src_path} .
expect \"password:\"
send \"${src_pwd}\r\"
expect eof
"

此时可以远程递归拷贝整个文件夹下的所有内容
然后新建一个定时调度脚本,实现数据拷贝完之后上传到hdfs

#!/bin/bash
bash ./copy-appimg.sh
#判断上一步是否执行完成
if [ $? -eq 0 ]
then
    echo "copy success"
    hadoop fs -put -f xwzxImg /apple/ggfw
    if [ $? -eq 0 ]
    then
        echo "put success"
    else
        echo "put fail"
    fi
else
    echo "copy fail"
fi

执行脚本之后,检查hdfs中是否有数据,数据上传完成

在这里插入图片描述

创建要给crontab定时任务,每天凌晨2点执行上面的调度脚本,从第三方服务器上拷贝文件然后上传至hdfs中

crontab -e

0 2 * * * /home/apple/crontab.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值