我正在使用spark-submit在独立模式和应用程序中运行spark集群。在火花UI阶段部分中,我发现执行阶段具有大的执行时间(> 10h,通常时间~30秒)。 Stage有许多失败的任务,错误为Resubmitted (resubmitted due to lost executor)
。舞台页面的CANNOT FIND ADDRESS
部分中有地址Aggregated Metrics by Executor
的执行者。 Spark试图无限地重新提交此任务。如果我杀了这个阶段(我的应用程序自动重新运行未完成的火花作业),所有这些都继续正常工作。
此外,我在火花日志中发现了一些奇怪的条目(与舞台执行开始同时)。
站长:
16/11/19 19:04:32 INFO Master: Application app-20161109161724-0045 requests to kill executors: 0
16/11/19 19:04:36 INFO Master: Launching executor app-20161109161724-0045/1 on worker worker-20161108150133
16/11/19 19:05:03 WARN Master: Got status update for unknown executor app-20161109161724-0045/0
16/11/25 10:05:46 INFO Master: Application app-20161109161724-0045 requests to kill executors: 1
16/11/25 10:05:48 INFO Master: Launching executor app-20161109161724-0045/2 on worker worker-20161108150133
16/11/25 10:06:14 WARN Master: Got status update for unknown executor app-20161109161724-0045/1
工人:
16/11/25 10:06:05 INFO Worker: Asked to kill executor app-20161109161724-0045/1
16/11/25 10:06:08 INFO ExecutorRunner: Runner thread for executor app-20161109161724-0045/1 interrupted
16/11/25 10:06:08 INFO ExecutorRunner: Killing process!
16/11/25 10:06:13 INFO Worker: Executor app-20161109161724-0045/1 finished with state KILLED exitStatus 137
16/11/25 10:06:14 INFO Worker: Asked to launch executor app-20161109161724-0045/2 for app.jar
16/11/25 10:06:17 INFO SecurityManager: Changing view acls to: spark
16/11/25 10:06:17 INFO SecurityManager: Changing modify acls to: spark
16/11/25 10:06:17 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(spark); users with modify permissions: Set(spark)
网络连接没有问题,因为worker,master(上面的日志),驱动程序在同一台机器上运行。
Spark版本1.6.1
答案 0 :(得分:9)
可能日志的有趣部分是:
16/11/25 10:06:13 INFO Worker: Executor app-20161109161724-0045/1 finished with state KILLED exitStatus 137
退出137
强烈建议资源问题,无论是内存还是CPU内核。
鉴于您可以通过重新运行阶段来解决问题,可能是某些核心已经分配(也许您还运行了一些Spark shell?)。
这是独立Spark设置的常见问题(一台主机上的所有内容)。
无论哪种方式,我都会按顺序尝试以下事项:
spark.storage.memoryFraction
以预先分配更多内存用于存储,并防止系统OOM杀手在大舞台上随机提供137
。spark.deploy.defaultCores
执行此操作,将其设置为3或甚至2(假设8个vcores在intel四核上)spark.executor.memory
需要上升。export SPARK_JAVA_OPTS +="-Dspark.kryoserializer.buffer.mb=10 -Dspark.cleaner.ttl=43200"
到最后spark-env.sh
可以通过强制元数据清理更频繁地运行来实现这一目的我认为其中一个应该可以解决问题。
答案 1 :(得分:4)
阿明的回答非常好。我只想指出对我有用的东西。
当我增加参数时,同样的问题就消失了:
def get_positive_ranges(a):
in_range = False
result = []
for i in range(len(a)):
if not in_range:
if a[i] > 0:
in_range = True
first = i
else: # Inside a range
if a[i] <= 0: # End of range
in_range = False
result.append([first, i - 1])
if in_range: # Tidy
result.append([first, i])
return result
print(get_positive_ranges([0,0,0,12,34,86,0,0,0,95,20,1,6,0,0,0,11,24,67,0,0,0]))
print(get_positive_ranges([]))
print(get_positive_ranges([1]))
print(get_positive_ranges([0, 1]))
print(get_positive_ranges([0, 1, 0]))
从28(这是我拥有的执行者的数量)到84(这是可用核心的数量)。
注意:这不是设置此参数的规则,这只适用于我。
更新:此方法也受Spark's documentation支持:
有时候,你会得到一个OutOfMemoryError,不是因为你的RDD不适合内存,而是因为你的一个任务的工作集,例如groupByKey中的一个reduce任务,太大了。 Spark的shuffle操作(sortByKey,groupByKey,reduceByKey,join等)在每个任务中构建一个哈希表来执行分组,这通常很大。 最简单的解决方法是提高并行度,以便每个任务的输入集都更小。 Spark可以有效地支持短至200毫秒的任务,因为它可以在多个任务中重用一个执行程序JVM具有较低的任务启动成本,因此您可以安全地将并行度提高到超过群集中的核心数。