【问题标题】:How to spark-submit to ZooKeeper-managed Mesos cluster (gives java.net.UnknownHostException: zk for mesos://zk:// master URL)?如何火花提交到 ZooKeeper 管理的 Mesos 集群(给出 java.net.UnknownHostException: zk for mesos://zk:// master URL)?
【发布时间】:2017-04-10 21:56:34
【问题描述】:

我正在运行 Spark 2.0.2 和 Mesos 0.28.2。

我正在尝试使用 ZooKeeper 管理的 Mesos 集群作为主集群向 Spark 提交应用程序:

$SPARK_HOME/bin/spark-submit --verbose \
--conf spark.mesos.executor.docker.image=$DOCKER_IMAGE \
--conf spark.mesos.executor.home=$SPARK_HOME \
--conf spark.executorEnv.MESOS_NATIVE_JAVA_LIBRARY=/usr/lib/libmesos.so \
--deploy-mode cluster \
--master mesos://zk://<ip 1>:2181,<ip 2>:2181,<ip 3>:2181/mesos \
--class $APP_MAIN_CLASS \
file://$APP_JAR_PATH

&lt;ip 1&gt;&lt;ip 2&gt;&lt;ip 3&gt; 是 10.0.0.0/8 块中的 IPv4 地址)

根据documentation,看来我的格式是对的:

对于单主 Mesos 集群,Mesos 的主 URL 格式为 mesos://host:5050,对于单主 Mesos 集群,格式为 mesos://zk://host1:2181,host2:2181,host3:2181/mesos使用 ZooKeeper 的多主 Mesos 集群。

但是,Spark 似乎正在读取 mesos://zk://... 字符串,然后尝试连接到 zk

17/04/07 20:10:06 INFO RestSubmissionClient: Submitting a request to launch an application in mesos://zk://<ip 1>:2181,<ip 2>:2181,<ip 3>:2181/mesos.
Exception in thread "main" java.net.UnknownHostException: zk
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
    at sun.net.www.http.HttpClient.New(HttpClient.java:308)
    at sun.net.www.http.HttpClient.New(HttpClient.java:326)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1202)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1138)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1032)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:966)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1316)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291)
    at org.apache.spark.deploy.rest.RestSubmissionClient.org$apache$spark$deploy$rest$RestSubmissionClient$$postJson(RestSubmissionClient.scala:214)
    at org.apache.spark.deploy.rest.RestSubmissionClient$$anonfun$createSubmission$3.apply(RestSubmissionClient.scala:89)
    at org.apache.spark.deploy.rest.RestSubmissionClient$$anonfun$createSubmission$3.apply(RestSubmissionClient.scala:85)
    at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
    at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
    at org.apache.spark.deploy.rest.RestSubmissionClient.createSubmission(RestSubmissionClient.scala:85)
    at org.apache.spark.deploy.rest.RestSubmissionClient$.run(RestSubmissionClient.scala:417)
    at org.apache.spark.deploy.rest.RestSubmissionClient$.main(RestSubmissionClient.scala:430)
    at org.apache.spark.deploy.rest.RestSubmissionClient.main(RestSubmissionClient.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

如何让 Spark 识别出它应该使用三个 ZooKeeper 节点,而不是尝试连接到不存在的 zk 主机?

【问题讨论】:

  • 你能试着引用一下吗? --master "mesos://zk://..."?也许您的终端将 URI 解释为主机名?
  • @cricket_007 以前我确实引用了 --conf 参数和主主机,但终端也发送了引号,所以我会收到诸如 "spark.mesos.executor.home 不是有效选项之类的错误"mesos:// 不是一个有效的协议。

标签: apache-spark mesos


【解决方案1】:

tl;dr 除非您将 --deploy-mode 更改为 client 或使用带有单个 Mesos 主机的主 URL,否则它将不起作用,例如mesos://host:port.

以下行给出了在哪里可以找到相关代码的提示。

17/04/07 20:10:06 INFO RestSubmissionClient: 在 mesos://zk://:2181,:2181,:2181/mesos 中提交启动应用程序的请求。

看起来该消息仅使用 Spark Standalone 和 Apache Mesos 为 --deploy-mode cluster 打印出来。将其更改为默认的client,部署路径将更改并希望接受主 URL。

查看负责集群部署的代码 -- RestSubmissionClient

HereRestSubmissionClient 说:

private val supportedMasterPrefixes = Seq("spark://", "mesos://")

这证明mesos:// URL 被覆盖,但here 你看到以下内容:

private val masters: Array[String] = if (master.startsWith("spark://")) {
  Utils.parseStandaloneMasterUrls(master)
} else {
  Array(master)
}

即打印出here 作为上述INFO 消息,表明该URL 只能是单个Mesos 主控。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2016-01-28
    • 2017-08-12
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多