inotify flock rsync linux异步同步文件夹


spark提交jar包时候会传到所有节点work文件夹,提交的jar包占用主从服务器空间很大,

所以有两种办法:

1.将jar包传到hdfs(hdfs没玩熟,以后研究)

2.jar包传到主节点,同步到从节点

找了一下资料inotify可以监听文件,但是使用时会有重复通知,引起多次重复同步,

此脚本使用flock可以在设定的时间内只响应一次同步,可以改进的地方希望大家留言.

第一次shell勿喷~.~

#!/bin/bash
#需要分发的slavehost
hosts=(dataSlave31 dataSlave32 dataSlave33 dataSlave34 dataSlave35)
listenDir='/usr/local/spark/lib/'


#同步时忽略10秒内其他请求

function synclock(){
{

flock -n 200
if [ $? -eq 1 ]; then
echo " skip file -> $1"
exit
fi
sleep 10
#同步

for host in ${hosts[@]}
do
  echo "rsync -a --delete ${listenDir} hadoop@$host:${listenDir}"
  rsync -a --delete ${listenDir} hadoop@$host:${listenDir}
  if [ $? -eq 0 ];then echo "syn success";else echo "syn failed!";fi;

done

} 200<> /tmp/flock_spark.lock
}


/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ${listenDir} |while read file
do
synclock "$file" &
done

最后修改spark-default.properties

spark.driver.extraClassPath /paths/toyourassembly.jar
spark.executor.extraClassPath /paths/toyourassembly.jar

或者 spark-submit时候添加 --jar /paths/toyourassembly.jar

实验结果,spark的work文件夹下只保存运行的主jar文件,没有保存toyourassembly.jar,从而节省了依赖包的空间.

//下一步,尝试关闭或者缩小sprk-work文件夹记录