我正在创建一个自包含的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.xml
,hdfs-site.xml
和core-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吗?