使用yarn-cluster模式初始化SparkContext时出错

时间:2017-01-27 07:08:01

标签: scala hadoop apache-spark yarn

我正在运行一个简单的代码来在hdfs上创建文件并向其写入内容并关闭该文件。我能够在本地模式和yarn-client模式下运行此代码。但是当我使用纱线群集模式运行相同的代码时,我得到了 为Error initializing SparkContext

我使用的Scala代码如下:

object Main {
def main(args: Array[String]): Unit = {
val conf= new SparkConf()

var sparkContext =new SparkContext("yarn-cluster","testHdfsWrite",conf)
val uri = URI.create (hdfslocation); // hdfs location of my home directory
val confi = new Configuration();
val file = FileSystem.get(uri, confi);
val os = file.create(new Path(uri))
os.write("Hello World".getBytes("UTF-8"))
os.close()
 }
}

当我使用本地模式和 yarn-client 模式时,此代码成功创建了一个文件并将内容“Hello World”写入其中。但是当我使用 yarn-cluster 模式时,我会得到以下异常。

 ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Detected yarn-cluster mode, but isn't running on a cluster. Deployment to YARN is not supported directly by SparkContext. Please use spark-submit.
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:411)
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:147)
        at Main$.main(Main.scala:17)
        at Main.main(Main.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:497)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
INFO SparkContext: Successfully stopped SparkContext

我已经看过this和大多数相关链接。但它与我的期望不同。如果您有正确的链接,请分享或如果您知道如何解决此问题,请告诉我。

由于

4 个答案:

答案 0 :(得分:3)

我也遇到了这个问题,并尝试使用以下方法解决它: 试试这个,在程序的main()方法中创建'spark context'(对于sql上下文也是如此):

def main(args:Array [String]):Unit =     {

  val conf = new SparkConf().setAppName("Simple Application")

  val sc = new SparkContext(conf)

  val sqlContext = new SQLContext(sc)

} 并在下面导入:

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

使用以下命令为群集模式运行代码,不要在代码中设置'yarn-cluster',使用以下内容在群集中提交作业时提供:

spark-submit --master yarn-cluster --packages&lt;包名称&gt; --class com.Test.ExampleTest&lt;你的程序jar的hadoop路径&gt; --jars&lt;其他罐子&gt;

答案 1 :(得分:0)

错误消息指出您必须使用spark-submit来启动应用程序。你是用spark-submit推出的吗?

答案 2 :(得分:0)

尝试代替

val conf= new SparkConf()

var sparkContext =new SparkContext("yarn-cluster","testHdfsWrite",conf)

使用

val conf= new SparkConf()
      .setAppName("testHdfsWrite")
      .setMaster("yarn-cluster")

var sparkContext = new SparkContext(conf)

答案 3 :(得分:0)

如果要提交应用程序(尤其是在群集模式下),则应向spark-submit脚本提供模式信息。因此,只需使用以下参数即可启动您的应用程序:

spark-submit --master yarn --deploy-mode cluster test_2.10-1.0.jar