现在的位置: 首页 > 综合 > 正文

hdfs日志上传脚本(三)

2012年04月04日 综合 ⁄ 共 1610字 ⁄ 字号 暂无评论

为了上传文件到hdfs,我们曾写过脚本,也曾搭过webdav;但是原来写脚本时,我们把日志下载到linux服务器,这样就多了一步磁盘I/O操作,而通过webdav直接从windows上传日志到hdfs又遇到了些麻烦。
下一步,我们想测试一下flume等日志收集系统,看看它们是否能够更方便、更实时地上传日志到hdfs。
但现在,我们暂且回到脚本方式,但换了一下思路:原始日志在windows上直接处理成lzo格式,然后放到共享目录,我们linux服务器挂载这个windows共享目录,然后调用Hadoop命令进行上传,这样不就减少了本地磁盘I/O操作了吗?看来思路很重要。
这次的脚本,我们用两台linux服务器都挂载windows共享目录,两台linux服务器上都运行脚本,只需要在上传之前判断一下日志文件是否冲突,通过改名的方法达到独占的目的。
#!/bin/bash
# 2012-03-02 by qinshan.li
#
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
windows="/hdfs/track_1469 /hdfs/track_1470 /hdfs/track_1722"
TRACK=/log/source/iCast_iFocus_track

for DIR in $windows
do
find $DIR -type f -name "*.lzo" |while read FILE
do
if [ -f "$FILE" ]; then
if ! lsof |grep $FILE; then
Original=$(echo $FILE |awk -F '/' '{print $4}')
New=${L_N}_170
mv $DIR/$Original $DIR/$New
L_size=$(ls -l $DIR/$New |awk '{print $5}')

if ~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -copyFromLocal $DIR/$New $TRACK
then
H_size=$(~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -ls $TRACK/$New |awk '{print $5}')
RAND=0

while [ "$H_size" -ne "$L_size" ]; do
RAND=$(($RAND+1))
if [ $RAND -gt 5 ]; then
echo -e "Have tried 5 times to upload $FILE !" |mail -s "track jiaxing upload failure" -c aa@123.com bb@123.com -- -f bb@123.com -F bb
break
fi

~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -rm $TRACK/$New
~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -copyFromLocal $DIR/$New $TRACK
done
fi

~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -mv $TRACK/$New $TRACK/$Original
rm -f $DIR/$New
fi
fi
done
done
做计划任务的时候,写个脚本判断一下上面的脚本是否正在运行,是的话就先等一下,否的话,使用source的方式调用上面的脚本。
#!/bin/bash
# 2012-03-02 by qinshan.li
#
if [ -z "$(/usr/bin/pgrep aa.sh)" ]
then
echo -e "$(/bin/date +%F_%H:%M) Now running aa.sh" >>/hdfs/bb.log
source /hdfs/aa.sh
else
echo -e "$(/bin/date +%F_%H:%M) The script aa.sh is running." >>/hdfs/bb.log
fi

给我留言

留言无头像?