【问题标题】:Spark on Win10 installation erroring out at None.org.apache.spark.api.java.JavaSparkContextSpark on Win10 安装在 None.org.apache.spark.api.java.JavaSparkContext 出错
【发布时间】:2021-12-05 11:42:24
【问题描述】:

我最近一直在努力让 Spark 在我的 Windows 10 设备上运行,但没有成功。我只是想尝试一下 Spark 并能够按照教程进行操作,因此我目前无法访问要连接的集群。为了安装 Spark,我完成了以下步骤,based on this tutorial

  • 我安装了 Java JDK 并把它放到了C:\jdk。该文件夹内有binconfincludejmodslegallib 文件夹。
  • 我安装了Java运行环境,放到C:\jre。这个里面有binlegallib文件夹。
  • 我下载了this folder并将winutils.exe放入C:\winutils\bin
  • 我创建了一个HADOOP_HOME用户环境变量并将其设置为C:\winutils
  • 我打开 Anaconda Prompt 并通过 conda install pyspark 将 PySpark 安装到我的基础环境中。
  • 安装成功后,我打开一个新的提示符并输入pyspark 来验证安装。这应该会出现一个 Spark 欢迎屏幕。相反,我收到了以下长错误消息:
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
21/12/05 12:22:47 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
21/12/05 12:22:47 WARN SparkContext: Another SparkContext is being constructed (or threw an exception in its constructor). This may indicate an error, since only one SparkContext should be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
py4j.Gateway.invoke(Gateway.java:238)
py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
py4j.ClientServerConnection.run(ClientServerConnection.java:106)
java.base/java.lang.Thread.run(Thread.java:833)
C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\shell.py:42: UserWarning: Failed to initialize Spark session.
  warnings.warn("Failed to initialize Spark session.")
Traceback (most recent call last):
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\shell.py", line 38, in <module>
    spark = SparkSession._create_shell_session()  # type: ignore
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\sql\session.py", line 553, in _create_shell_session
    return SparkSession.builder.getOrCreate()
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\sql\session.py", line 228, in getOrCreate
    sc = SparkContext.getOrCreate(sparkConf)
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\context.py", line 392, in getOrCreate
    SparkContext(conf=conf or SparkConf())
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\context.py", line 146, in __init__
    self._do_init(master, appName, sparkHome, pyFiles, environment, batchSize, serializer,
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\context.py", line 209, in _do_init
    self._jsc = jsc or self._initialize_context(self._conf._jconf)
  File "C:\Spark\spark-3.2.0-bin-hadoop3.2\python\pyspark\context.py", line 329, in _initialize_context
    return self._jvm.JavaSparkContext(jconf)
  File "C:\Users\lazarea\Anaconda3\lib\site-packages\py4j\java_gateway.py", line 1573, in __call__
    return_value = get_return_value(
  File "C:\Users\lazarea\Anaconda3\lib\site-packages\py4j\protocol.py", line 326, in get_return_value
    raise Py4JJavaError(
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.storage.StorageUtils$
        at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:110)
        at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:348)
        at org.apache.spark.SparkEnv$.registerOrLookupEndpoint$1(SparkEnv.scala:287)
        at org.apache.spark.SparkEnv$.create(SparkEnv.scala:336)
        at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:191)
        at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:277)
        at org.apache.spark.SparkContext.<init>(SparkContext.scala:460)
        at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:247)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:238)
        at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:80)
        at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:69)
        at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
        at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
        at java.base/java.lang.Thread.run(Thread.java:833)

我在 Stackoverflow 上查看了类似的问题,发现了 this question。这有类似的错误消息。然而,提供的解决方案,即将SPARK_LOCAL_IP 用户环境变量设置为localhost 并没有解决问题,在Anaconda Prompt 中输入pyspark 时仍然存在相同的错误消息。

注意 #1,这可能是相关的:在命令行中键入 pyspark 时,没有提供输出。相反,Windows 默认打开 Microsoft Store。

注意 #2:我尝试直接在 Python 中编码,看看是否有更多提示。我运行了以下 sn-p:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('sampleApp').getOrCreate()

它返回了与上述类似的错误消息,并包含更多可能有用的信息:

An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$
(in unnamed module @0x776b83cc) cannot access class sun.nio.ch.DirectBuffer
(in module java.base) because module java.base does not export sun.nio.ch
to unnamed module @0x776b83cc

注意#3:打开命令行输入spark-shell时,输出如下错误:

java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x3c947bc5) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x3c947bc5
  at org.apache.spark.storage.StorageUtils$.<init>(StorageUtils.scala:213)
  at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala)
  at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:110)
  at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:348)
  at org.apache.spark.SparkEnv$.registerOrLookupEndpoint$1(SparkEnv.scala:287)
  at org.apache.spark.SparkEnv$.create(SparkEnv.scala:336)
  at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:191)
  at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:277)
  at org.apache.spark.SparkContext.<init>(SparkContext.scala:460)
  at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2690)
  at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:949)
  at scala.Option.getOrElse(Option.scala:189)
  at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:943)
  at org.apache.spark.repl.Main$.createSparkSession(Main.scala:106)
  ... 55 elided
<console>:14: error: not found: value spark
       import spark.implicits._
              ^
<console>:14: error: not found: value spark
       import spark.sql
              ^

请帮助我成功启动 Spark,因为我现在不明白我可能缺少什么。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    最后,我成功了,所以让我分享一下我学到的东西,以备将来参考,以防其他人以后也会遇到安装 Apache Spark 的问题。在 Windows 10 机器上安装 Apache Spark 有三个关键方面。

    1. 确保您已安装 Java 8! 我们中的许多人都陷入了下载 Apache Spark 不支持的现在默认的 Java 17 的陷阱。可以在 Java 8 或 Java 11 之间进行选择,但根据 on this thread 的讨论,我得出结论,对于我的快速 POC 示例,Java 11 JDK 和 JRE 不值得这么麻烦,因此我选择了 Java 8 JDK 和 JRE 都可以从 Oracle 网站轻松下载。请注意,您选择的版本越晚,它就越安全,所以对于更严重的问题,我可能会选择 Java 11。

    2. 将新安装的 Java 文件夹移动到 C 盘。 为 Java 8 JDK 创建一个 C:\jdk 文件夹,为 Java 8 JRE 创建一个 C:\jre。然后,就不需要 JAVA_HOME 环境变量了,因为它们都在 C 盘的基础上。

    3. 使用旧版本的 Spark! 事实证明,Apache Spark 网站上目前提供的 2021 年 10 月的最新稳定版本 3.2.0 已多次报告提供此类和初始化 Spark 上下文时的其他类似问题。因此,我尝试回滚到以前的版本。具体来说,我下载了 2021 年 6 月发布的 Apache Spark 版本 3.0.3,并将SPARK_HOME 环境变量指向新解压的文件夹:C:\Spark\spark-3.0.3-bin-hadoop2.7

    在所有这些修改之后,我关闭了所有命令行窗口,打开了一个新窗口,运行spark-shell,终于看到了备受追捧的Spark欢迎屏幕:

    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_\   version 3.0.3
          /_/
    
    Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_301)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多