【问题标题】:Apache Spark: Job aborted due to stage failure: "TID x failed for unknown reasons"Apache Spark:作业因阶段失败而中止:“TID x 因未知原因失败”
【发布时间】:2014-09-10 06:20:53
【问题描述】:

我正在处理一些奇怪的错误消息,我认为归结为内存问题,但我很难确定它并且可以使用专家的一些指导。

我有一个 2 机 Spark (1.0.1) 集群。两台机器都有8核;一个有 16GB 内存,另一个 32GB(这是主)。我的应用程序涉及计算图像中的成对像素亲和度,尽管到目前为止我测试的图像只有 1920x1200 和 16x16 一样大。

我确实必须更改一些内存和并行设置,否则我会得到明确的 OutOfMemoryExceptions。在 spark-default.conf 中:

spark.executor.memory    14g
spark.default.parallelism    32
spark.akka.frameSize        1000

在 spark-env.sh 中:

SPARK_DRIVER_MEMORY=10G

但是,通过这些设置,除了丢失的执行程序之外,我还收到了一堆关于“丢失的 TID”(没有成功完成任务)的 WARN 语句,这些语句重复了 4 次,直到我最终收到以下错误消息并崩溃:

14/07/18 12:06:20 INFO TaskSchedulerImpl: Cancelling stage 0
14/07/18 12:06:20 INFO DAGScheduler: Failed to run collect at /home/user/Programming/PySpark-Affinities/affinity.py:243
Traceback (most recent call last):
  File "/home/user/Programming/PySpark-Affinities/affinity.py", line 243, in <module>
    lambda x: np.abs(IMAGE.value[x[0]] - IMAGE.value[x[1]])
  File "/net/antonin/home/user/Spark/spark-1.0.1-bin-hadoop2/python/pyspark/rdd.py", line 583, in collect
    bytesInJava = self._jrdd.collect().iterator()
  File "/net/antonin/home/user/Spark/spark-1.0.1-bin-hadoop2/python/lib/py4j-0.8.1-src.zip/py4j/java_gateway.py", line 537, in __call__
  File "/net/antonin/home/user/Spark/spark-1.0.1-bin-hadoop2/python/lib/py4j-0.8.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o27.collect.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0.0:13 failed 4 times, most recent failure: TID 32 on host master.host.univ.edu failed for unknown reason
Driver stacktrace:
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1044)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1028)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1026)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1026)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:634)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:634)
    at scala.Option.foreach(Option.scala:236)
    at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:634)
    at org.apache.spark.scheduler.DAGSchedulerEventProcessActor$$anonfun$receive$2.applyOrElse(DAGScheduler.scala:1229)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498)
    at akka.actor.ActorCell.invoke(ActorCell.scala:456)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237)
    at akka.dispatch.Mailbox.run(Mailbox.scala:219)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

14/07/18 12:06:20 INFO DAGScheduler: Executor lost: 4 (epoch 4)
14/07/18 12:06:20 INFO BlockManagerMasterActor: Trying to remove executor 4 from BlockManagerMaster.
14/07/18 12:06:20 INFO BlockManagerMaster: Removed 4 successfully in removeExecutor
user@master:~/Programming/PySpark-Affinities$

如果我运行非常小的图像(16x16),它似乎运行完成(给我我期望的输出,没有抛出任何异常)。但是,在运行的应用程序的标准错误日志中,它将状态列为“KILLED”,最终消息为“ERROR CoarseGrainedExecutorBackend:Driver Disassociated”。如果我运行任何更大的图像,我会得到上面粘贴的异常。

此外,如果我只是使用 master=local[*] 进行 spark-submit,除了仍然需要设置上述内存选项外,它还适用于任何大小的图像(我已经独立测试了两台机器;它们都可以当以local[*] 运行时,这个)。

有什么想法吗?

【问题讨论】:

    标签: python apache-spark


    【解决方案1】:

    如果我每次问人们“您是否尝试将分区数量增加到相当大的数量,例如每个 CPU 至少 4 个任务 - 甚至高达 1000 个分区?”我会成为一个有钱人。那么你有没有尝试增加分区?

    不管怎样,我发现的其他对奇怪的分离有帮助的事情是:

    此外,有时您还可以通过使用 UI 导航到特定的工作人员标准错误日志来获得更多信息堆栈跟踪。

    更新:由于 spark 1.0.0 无法通过 UI 查找 Spark 日志,因此您必须请求您的 sysadm/devops 来帮助您,因为日志的位置完全没有记录。

    【讨论】:

    • 玩得好!我在sc.parallelize 中加入了一个参数,该参数指定了默认的并行级别并将其乘以4。似乎成功了!非常感谢!
    • 请你分享一个例子,我也被同样的问题困住了
    【解决方案2】:

    这个很难抓!问题是 spark 版本 1.0.1,它没有指出实际错误,而是将其称为“unknownReason”原因,导致难以追查问题。 使用 --driver-class-path path_to_spark_application 运行 spark 应用程序,这将给出作业失败的正确错误。我的是 JsResultException。 我想 Spark 1.6 及更高版本的问题已解决。

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 1970-01-01
      • 2020-11-07
      • 2019-12-25
      • 2018-03-18
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多