【问题标题】:Unable to create SparkContext object using Apache Spark 2.2 version无法使用 Apache Spark 2.2 版本创建 SparkContext 对象
【发布时间】:2018-06-06 06:48:26
【问题描述】:

我使用的是 MS Windows 7。

最初,我在 Spark 1.6 中尝试了一个使用 scala 的程序,它运行良好(我自动将 SparkContext 对象作为 sc 获取)。

当我尝试使用 Spark 2.2 时,我没有自动获得sc,所以我通过以下步骤创建了一个:

import org.apache.spark.SparkContext  
import org.apache.spark.SparkConf  
val sc = new SparkConf().setAppName("myname").setMaster("mast")  
new SparkContext(sc) 

现在,当我尝试执行以下并行化方法时,它给了我一个错误:

val data = Array(1, 2, 3, 4, 5)  
val distData = sc.parallelize(data) 

错误:

Value parallelize is not a member of org.apache.spark.SparkConf  

我仅使用官方文档执行了这些步骤。那么有人可以解释我哪里出错了吗?提前致谢。 :)

【问题讨论】:

  • 我从 “我在哪里自动将 SparkContext 对象作为 sc 获取” 了解到您使用 spark-shell,不是吗?您是否在$HADOOP_HOME/bin 中定义了HADOOP_HOME 和/或保存了winutils.exe

标签: scala apache-spark windows-7


【解决方案1】:

如果 spark-shell 在开始时没有显示此行:

Spark 上下文可用作“sc”(master = local[*],app id = local-XXX)。

运行

val sc = SparkContext.getOrCreate()

【讨论】:

  • 谢谢,但它会引发一个错误,正如我在下面答案的 cmets 中已经提到的那样
  • 您使用的是哪个版本的 spark-shell?
  • 阅读 awnser,在新的 spark-shell 会话中尝试它很重要
  • 你试过这个 val sc = SparkContext.getOrCreate() 吗?
  • sparks-shell 当前有一个 sparkContext 但您没有将它正确分配给变量。如果您尝试在 spark-shell 中以自己的方式创建一个新的 SparkContext,jvm 会显示一个错误,指出当前存在一个 SparkContext。 SparkContext.getOrCreate() 函数管理情况,如果存在 SparkContext 则返回它,否则创建一个新的并返回它。
【解决方案2】:

问题是您创建的 sc 类型为 SparkConfig 而不是 SparkContext(两者的首字母相同)。


对于在 Spark 2.0 版本或任何其他版本中使用并行化方法,sc 应该是 SparkContext 而不是 SparkConf。正确的代码应该是这样的:

import org.apache.spark.SparkContext  
import org.apache.spark.SparkConf  
val sparkConf = new SparkConf().setAppName("myname").setMaster("mast")  
val sc = new SparkContext(sparkConf)
val data = Array(1, 2, 3, 4, 5)  
val distData = sc.parallelize(data)  

这会给你想要的结果。

【讨论】:

  • 我应该在 new SparkContext() 中而不是 sc 中传递 sparkConf 吗?
  • 糟糕!我的错。是的,您应该在new SparkContext 中传递sparkConf 而不是sc。我已经更新了我的答案。
  • 它会抛出一个错误,即只有一个 sparkcontext 对象应该在 jvm 中运行。我怎样才能避免这种情况?
  • 你在使用spark-shell吗?
  • 那么你不需要在那里创建sc。它已经为您创建好了。 Spark context Web UI available at http://192.168.1.13:4040 Spark context available as 'sc' (master = local[*], app id = local-1514126801063). Spark session available as 'spark'.
【解决方案3】:

您应该更喜欢使用SparkSession,因为它是版本 2 中 Spark 的入口点。您可以尝试类似:

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder.
    master("local")
    .appName("spark session example")
    .getOrCreate()
val sc = spark.sparkContext
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)

【讨论】:

  • 不。它不起作用。它在 getorcreate 方法上引发错误。据我记得你在上面发表了一些评论,但你删除了它。我不知道为什么。如果这个概念是正确的,那你为什么不再次发布呢??
  • 在 Databricks 中编辑和测试:使用sparkSession 变量获取SparkSession 并使用spark 获取sparkContext,在这两个地方都编辑为spark 变量。从我的角度来看,这是一个错误。对此感到抱歉。现在,如果您使用Spark 2,此代码将起作用。
  • 感谢您的努力,但仍然会引发错误。它给出了一个无法在此处发布的长错误
  • 这是非常基本的代码。你能创建SparkSession 吗?如果您在spark-shell 中运行,则SparkSession 将作为spark 提供。(在version 2 中)。使用spark.version进行检查。
  • 是的,我用 2.2.1 替换了我的版本,问题就解决了。
【解决方案4】:

Apache Spark 的2.2.0 version 存在一些问题。我用最新的2.2.1 version 替换它,当我在windows 7 中通过cmd 启动spark-shell 时,我能够自动获取scspark 变量。我希望它会对某人有所帮助。
我在下面执行了创建 rdd 的代码,它运行良好。无需导入任何包。

val dataOne=sc.parallelize(1 to 10)
dataOne.collect(); //Will print 1 to 10 numbers in array

【讨论】:

    【解决方案5】:

    你的代码是这样的

    val conf = new SparkConf()
    conf.setMaster("local[*]")
    conf.setAppName("myname")
    val sc = new SparkContext(conf)
    

    注意:主 url 应该是本地的[*]

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2018-06-10
      • 2019-06-21
      • 1970-01-01
      相关资源
      最近更新 更多