如何使用yarn远程运行独立的Spark应用程序

时间:2017-04-27 22:52:30

标签: scala hadoop apache-spark yarn

我正在创建一个自包含的Scala程序,它在某些部分使用Spark进行并行化。在我的特定情况下,Spark群集可通过纱线获得。

我需要我的Spark作业来加载位于hadoop集群上的hdfs文件,该文件无法通过我的本地计算机直接访问。因此,我通过在hdfs-site.xml中包含这些属性来通过ssh隧道创建SOCKS代理。

  <property>
    <name>hadoop.socks.server</name>
    <value>localhost:7070</value>
  </property>
  <property>
    <name>hadoop.rpc.socket.factory.class.default</name>
    <value>org.apache.hadoop.net.SocksSocketFactory</value>
  </property>
  <property>
    <name>dfs.client.use.legacy.blockreader</name>
    <value>true</value>
  </property>

其中7070是hadoop网关机器的动态端口。

ssh -fCND 7070 <hadoop-gateway-machine>

当我在local[*]主配置中使用Spark进行测试时,这允许我在本地访问hdfs文件。

但是,当我在同一个hadoop集群(由类路径中的yarn-site.xmlhdfs-site.xmlcore-site.xml配置)上部署的纱线上运行真正的Spark作业时,我看到了类似的错误:

java.lang.IllegalStateException: Library directory '<project-path>/assembly/target/scala-2.11/jars' does not exist; make sure Spark is built.

所以,我直接在sparkConf上设置spark.yarn.jars属性。这至少开始了纱线应用。当我转到应用程序URL时,我只是在其中一个工作日志中看到此消息:

Error: Could not find or load main class org.apache.spark.deploy.yarn.ExecutorLauncher

此消息在另一个hadoop工作日志中(显然Spark工作者无法连接到驱动程序)

org.apache.spark.SparkException: Failed to connect to driver!
    at org.apache.spark.deploy.yarn.ApplicationMaster.waitForSparkDriver(ApplicationMaster.scala:484)
    at org.apache.spark.deploy.yarn.ApplicationMaster.runExecutorLauncher(ApplicationMaster.scala:345)
    at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:187)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:653)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:69)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:68)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693)
    at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:68)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:651)
    at org.apache.spark.deploy.yarn.ExecutorLauncher$.main(ApplicationMaster.scala:674)
    at org.apache.spark.deploy.yarn.ExecutorLauncher.main(ApplicationMaster.scala)

我的问题是,在纱线群集上运行自包含Spark应用程序的正确方法是什么。你是如何做到这一点的,所以你不必指定spark.yarn.jars和其他属性?你应该在类路径中包含spark-defaults.conf吗?

0 个答案:

没有答案