问题一: Spark Job执行了两次
由于job内部有一个逻辑,如果第一次失败,第二次重试已没有意义,那么就没有必要让它跑第二次,如下图所示:
首先调查为什么默认是尝试两次,结果如下:
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>2</value>
<source>yarn-default.xml</source>
</property>
这个配置是个全局配置,如果改成1,那么所有提交的job都将只尝试运行一次,显然不太合适,我的目标是只针对当前job进行设置,而不影响其他job。
可以在提交spark job是配置如下参数:
spark-submit --conf spark.yarn.maxAppAttempts=1 <application_name>
或者:
spark = SparkSession
.builder()
.master(runArgs.sparkMaster) // "local" to run locally
.appName("Processing")
.config("spark.sql.shuffle.partitions", 8) // set parallelism
.config("spark.yarn.maxAppAttempts", 1) // set job max attempts
.getOrCreate()
注:如果spark.yarn.maxAppAttempts 的值大于yarn.resourcemanager.am.max-attempts, 并不会生效,小于是可以的。
以上是真的spark job设置的,那么hadoop Mapreduce job如何设置呢?
<property>
<name>mapreduce.am.max-attempts</name>
<value>2</value>
<source>mapred-default.xml</source>
</property>
猜测是通过mapreduce.am.max-attempts 进行设置,没有验证
参考:
https://stackoverflow.com/questions/38709280/how-to-limit-the-number-of-retries-on-spark-job-failure
http://johnjianfang.blogspot.com/2015/04/the-number-of-maximum-attempts-of-yarn.html