如果Spark在Yarn上运行,如何获取SparkContext?

4
我们有一个基于Spark独立版的程序,在该程序中,我们使用SparkContext和SqlContext进行大量查询。现在,我们想要将系统部署在运行在Yarn上的Spark上。但是,当我们将spark.master修改为yarn-cluster时,应用程序会抛出异常,显示只适用于spark-submit类型。当我们切换到yarn-client时,尽管不再抛出异常,但它无法正常工作。
似乎如果在Yarn上运行,我们不能再使用SparkContext来工作,而是应该使用像yarn.Client这样的东西,但是这样我们不知道如何更改我们的代码以实现之前使用SparkContext和SqlContext所做的事情。
有没有好方法来解决这个问题?我们能否从yarn.Client获得SparkContext,或者我们应该改变我们的代码来利用yarn.Client的新接口?
谢谢!

你能否发布你的代码并详细说明“不能正常工作”的问题? - Holden
@Holden,抱歉我之前的问题描述不够清晰。关于 Spark 我还不是很熟悉,所以才会有提问。请查看 http://stackoverflow.com/questions/32131826/spark-on-yarn-job-failed-with-exitcode1-and-stderr-says-cant-find-main-class 了解我们现在面临的问题的详细信息。谢谢! - DarkZero
1个回答

1
当您在集群上运行时,需要执行类似于以下的 spark-submit 命令。
./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \

--master将是yarn --deploy-mode将是集群

如果您的应用程序中有类似于setMaster("local[]")的内容,您可以将其删除并构建代码。当您使用--Master yarn进行spark-submit时,yarn将为您启动容器,而不是spark-standalone调度程序。

您的应用程序代码可以像这样,没有任何关于Master的设置

 val conf = new SparkConf().setAppName("App Name")
 val sc = new SparkContext(conf)

yarn deploy模式客户端用于在代码运行时在同一台机器上启动driver。在集群上,部署模式应该是cluster,这将确保driver通过yarn在worker节点之一上启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接