Mesos中的Spark流式集群模式:java.lang.RuntimeException:找不到流jar

时间:2017-06-22 15:27:14

标签: apache-spark hdfs spark-streaming mesos checkpoint

目标:

使用hdfs和checkpoints在mesos上以群集模式运行spark流应用程序。

群集:

  • 具有3个从属的Mesos群集。
  • 一名调度员连接到 群集。
  • 每个从站上安装一个外部hdfs和所有二进制文件。

版本 Mesos 1.2.0 火花2.0.1 hdfs 2.7

申请来源: 存储在hdfs上的application.jar,checkpoints和spark二进制文件。

上下文:

使用以下配置启动应用程序:

  • “SPARK_EXECUTOR_URI”:“hdfs:// hdfsHost /spark.tgz
  • “spark.submit.deployMode”:“cluster”
  • “spark.master”:“spark:// dispatcherHost
  • “spark.mesos.coarse”:“true”
  • mainClass:“enterprise.com.Class”
  • jar:“hdfs:// hdfsHost /application.jar”

首次启动(无检查点数据):正常工作

  • 一个驱动程序以一个带有应用程序名称的新mesos框架ID开始。
  • 一个(或更多)任务正在另一个或同一个奴隶上运行。
  • 检查点已在hdfs中正确创建。

第二次启动(带检查点数据):无法正常工作

  • 一个驱动程序以一个带有应用程序名称的新mesos框架ID开始。
  • 一个(或更多)任务正在另一个或同一个奴隶上运行。
  • 如果驱动程序无法在与存储的chekpoint相同的从属机器上启动,则会出现以下异常:

错误消息:

java.lang.RuntimeException: Stream '/jars/application.jar' was not found.
at org.apache.spark.network.client.TransportResponseHandler.handle(TransportResponseHandler.java:222)
...

发生此错误是因为负责将应用程序jar暴露给执行程序的驱动程序正在尝试将其从检查点存储的jar路径中暴露出来(从hdfs加载并存储在mesos workdir path = sandbox中)存在于当前节点中。

Downloading resource with Hadoop client from 'hdfs://*hdfsHost*/application.jar' to '/var/lib/mesos/slaves/<ID>/frameworks/<frameworkID>/executors/<driverID>/runs/<runID>/application.jar'
...
INFO SparkContext: Added JAR file:/var/lib/mesos/slaves/<checkpointedID>/frameworks/<checkpointedFrameworkID>/executors/<checkpointedDriverID>/runs/<runID>/spark/../application.jar at spark://<driverHost>/jars/application.jar with timestamp 1498051933921

我对这种行为感到困惑。

问题

  • A)为什么spark在使用hdfs时使用rpc接口将应用程序jar暴露给执行程序,而不是直接从源代码加载执行程序?
  • B)为什么检查点会存储mesos应用程序框架路径并尝试恢复它?
  • C)如何修复此问题并在多个从属设备上使用hdfs和checkpoint在mesos上运行流应用程序?

0 个答案:

没有答案