赞
踩
今日需要将一台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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。