Shell -死循环执行
背景
接到的一个需求,把HIVE表计算后的数据写往ES集群。计算后的数据落地在一个新的表中,每日推至ES当中。HIVE数据每日大概500MB。由于数据量比较大,所以使用SPARK开发应用对接HIVE和ES中的数据。在上线几日后,执行SPARK开发的jar包总有报错。查看日志显示内存溢出异常,于是调整执行spark程序的shell语句,将Driver内存、Executor个数、Executor核数、Executor内存都做了调整(机器资源充沛扩大到Executor 10G,Driver 2G),修改过过后,重新推HIVE数据到ES,成功。但是后续几天依然会有内存溢出。仔细看了日志。核心原因是从ES发出的,推入数据量超出ES的配置(单次写入ES集群数据量有限制,默认值是(400MB)超过400M就会中断程序),ES集群就中断了spark程序。为了让数据写入慢一点,使用coalese方法,将spark程序写入es的并行度降低为1,使写入的速度比多并行度的时候速度降低很多。但仍然不起效,神奇的是手动重跑就会成功,很玄学。ES集群负责人也不调整ES的配置参数。我们不能休息日了还再手动重新开电脑跑脚本了!
方案
无奈,网上找了个shell方法 ,执行hive数据导入es的spark开发的jar包,直至写入成功为止。
repeat() { while :; do $@ && return; sleep 600; done }
测试
上线前先做个测试,使用该方法检测下载HDFS上的sou1yu.txt的命令 。若HDFS的/jars目录下无指定名字的文件,则每10分钟会下载一次文件。
#!bin/bash
repeat(){ while :; do $@ $$ return ; sleep 600; done}
repeat hdfs dfs -get /jars/sou1yu.txt
执行shell
当上传sou1yu.txt文件至HDFS时,shell会执行完成!
完事,大功告成!他们ES集群现在还很健康。