在 Zeppelin 0.7.1 中运行 Spark 代码时出现 NullPointerException

Posted

技术标签:

【中文标题】在 Zeppelin 0.7.1 中运行 Spark 代码时出现 NullPointerException【英文标题】:Getting NullPointerException when running Spark Code in Zeppelin 0.7.1 【发布时间】:2017-09-03 11:37:30 【问题描述】:

我已经安装了Zeppelin 0.7.1。当我尝试执行示例 spark 程序(可用于 Zeppelin Tutorial 笔记本)时,我收到以下错误

java.lang.NullPointerException
    at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:38)
    at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:33)
    at org.apache.zeppelin.spark.SparkInterpreter.createSparkContext_2(SparkInterpreter.java:391)
    at org.apache.zeppelin.spark.SparkInterpreter.createSparkContext(SparkInterpreter.java:380)
    at org.apache.zeppelin.spark.SparkInterpreter.getSparkContext(SparkInterpreter.java:146)
    at org.apache.zeppelin.spark.SparkInterpreter.open(SparkInterpreter.java:828)
    at org.apache.zeppelin.interpreter.LazyOpenInterpreter.open(LazyOpenInterpreter.java:70)
    at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:483)
    at org.apache.zeppelin.scheduler.Job.run(Job.java:175)
    at org.apache.zeppelin.scheduler.FIFOScheduler$1.run(FIFOScheduler.java:139)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我还设置了配置文件 (zeppelin-env.sh) 以指向我的 Spark 安装和 Hadoop 配置目录

export SPARK_HOME="/$homedir/sk"
export HADOOP_CONF_DIR="/$homedir/hp/etc/hadoop"

我使用的 Spark 版本是 2.1.0 而 Hadoop 是 2.7.3

我也使用默认的 Spark 解释器配置(因此 Spark 设置为在 Local mode 中运行)

我错过了什么吗?

PS : 我可以使用 spark-shell 从终端连接到 spark

【问题讨论】:

【参考方案1】:

刚才我得到了 Zeppelin-0.7.2 这个问题的解决方案:

根本原因是:Spark 试图设置 Hive 上下文,但 hdfs 服务 没有运行,这就是 HiveContext 变为 null 并抛出 null 的原因 指针异常。

解决方案: 1. 设置 Saprk Home [可选] 和 HDFS。 2. 运行 HDFS 服务 3. 重启 zeppelin 服务器 1. 前往 Zeppelin 的解释器设置。 2. 选择 Spark 解释器 3.zeppelin.spark.useHiveContext = false

【讨论】:

HiveContext 也为我做了! 亲爱的@RajeevRathor 和@BenjaminBaron,我无意粗鲁,但我敢肯定答案与编写这些 cmets 具有相同的目的。当您将鼠标悬停在 add a comment 上时,弹出窗口会显示 .. Avoid comments like "+1" or "thanks". 仅供参考,此解决方案对我不起作用。【参考方案2】:

终于找到原因了。当我检查 ZL_HOME/logs 目录中的日志时,发现它似乎是 Spark Driver 绑定错误。在 Spark Interpreter Binding 中添加了以下属性,现在运行良好...

PS : 看起来这个问题主要出现在你连接到 *** 时...我确实连接到 ***

【讨论】:

我也看到这个问题出现在 VM 上运行的 Zeppelin 0.8 上;一切正常,直到 VM 的一个(不相关的)网络适配器更改地址,只有重新启动才能让 Zeppelin 恢复工作......【参考方案3】:

SPARK_HOME 设置正确吗?只是想知道sk 在你的 export SPARK_HOME="/$homedir/sk"

(我只是想在您的问题下方发表评论,但由于我缺乏声誉而无法评论?)

【讨论】:

是的,那是我安装 Spark 的地方 :)。也就是 Spark 安装的 Home 目录【参考方案4】:

通过在文件 common.sh 的顶部添加这一行来解决它 在 dir zeppelin-0.6.1 然后 bin

打开 common.sh 并在文件集顶部添加命令:

unset CLASSPATH

【讨论】:

【参考方案5】:
    enterCaused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at org.apache.thrift.transport.TSocket.open(TSocket.java:182)
        ... 74 more
)
        at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:466)
        at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:236)
        at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:74)
        ... 71 more
 INFO [2017-11-20 17:51:55,288] (pool-2-thread-4 SparkInterpreter.java[createSparkSession]:369) - Created Spark session with Hive support
ERROR [2017-11-20 17:51:55,290] (pool-2-thread-4 Job.java[run]:181) - Job failed code here

Hive Metastore 服务似乎没有启动。您可以启动 Metastore 服务并重试。

hive --service metastore

【讨论】:

【参考方案6】:

我在窗口 7 上遇到了与 zepelline 0.7.2 版本完全相同的异常。我必须对配置进行多次更改才能使其正常工作。

首先将 zeppelin-env.cmd.template 重命名为 zeppelin-env.cmd。为 PYTHONPATH 添加环境变量。该文件可以位于 %ZEPPELIN_HOME%/conf 文件夹中。

set PYTHONPATH=%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.4-src.zip;%SPARK_HOME%\python\lib\pyspark.zip

从位置 %ZEPPELIN_HOME%/bin 打开 zeppelin.cmd 以添加 %SPARK_HOME% 和 %ZEPPELIN_HOME%。这些将是指令中的第一行。当我使用嵌入式 spark 库时,%SPARK_HOME% 的值被配置为空白。我添加了 %ZEPPELIN_HOME% 以确保在启动的初始阶段配置此环境。

set SPARK_HOME=
set ZEPPELIN_HOME=<PATH to zeppelin installed folder>

接下来,我们必须将所有 jar 和 pySpark 从 %spark_home%/ 复制到 zeppeline 文件夹。

cp %SPARK_HOME%/jar/*.jar %ZEPPELIN_HOME%/interpreter/spark
cp %SPARK_HOME%/python/pyspark %ZEPPELIN_HOME%/interpreter/spark/pyspark

我在访问笔记本时没有启动 interpreter.cmd。这导致了空指针异常。我打开了两个命令提示符,在一个 cmd 中启动了 zeppeline.cmd,在另一个interpreter.cmd 中启动。

我们必须在命令行中指定两个额外的输入端口和 zeppeline local_repo 的路径。您可以在 zeppeline spark 解释器页面中获取到 local_repo 的路径。使用完全相同的路径来启动interpreter.cmd。

interpreter.cmd  -d %ZEPPELIN_HOME%\interpreter\spark\ -p 5050  -l %ZEPPELIN_HOME%\local-repo\2D64VMYZE

需要在zepelline ui的spark解释器页面中指定主机和端口。选择连接到外部进程

HOST : localhost
PORT : 5050

创建完所有这些配置后,下一步我们可以保存并重新启动 spark 解释器。创建一个新笔记本并键入 sc.version。 它将发布火花版本。 Zeppeline 0.7.2 不支持 spark 2.2.1

【讨论】:

【参考方案7】:

检查您的 NameNode 是否已进入安全模式。

检查以下语法:

sudo -u hdfs hdfs dfsadmin -safemode get

使用以下命令退出安全模式:

sudo -u hdfs hdfs dfsadmin -safemode leave

【讨论】:

【参考方案8】:

在 AWS EMR 上,问题是内存。我不得不使用 Zeppelin 的 UI 在 Interpeter for Spark 中手动为 spark.executor.memory 设置较低的值。

该值因您的实例大小而异。 最好检查位于/mnt/var/log/zeppelin/ 文件夹中的日志。

就我而言,根本错误是:

Error initializing SparkContext.
java.lang.IllegalArgumentException: Required executor memory (6144+614 MB) is above the max threshold (6144 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.

这帮助我理解了它失败的原因以及我可以做些什么来修复它。

注意:

发生这种情况是因为我使用 HBase 启动了一个实例,这限制了可用内存。查看实例大小的默认值here。

【讨论】:

我投了反对票,因为虽然这可能有用,但此错误不是堆栈跟踪的一部分,也不是问题的一部分。 @Marc-OlivierTiteux 我不敢苟同。 NullPointerException 在 Zeppelin 上运行应用程序时确实会发生。也就是说,这是你在前端得到的例外。当您像我一样深入挖掘日志时,您可以看到 NullPointerException 掩盖了我上面提到的 IllegalArgumentException。如果您遇到与发帖人相同的问题,则应检查上述路径中的日志。 在我的情况下非常不同。集群上安装了一个自定义包并触发了错误。我不是说你有同样的模式。我是说答案不匹配 OP 中的堆栈跟踪没有这个。 @Marc-OlivierTiteux 它确实匹配。前端的NullPointerException 可能是由多个 其他问题引起的,其中一个是我遇到的问题。重申一下:我有与海报完全相同的堆栈跟踪,但是当您深入了解日志时,您可以看到 NullPointerException 是由其他服务失败引起的 IllegalArgumentException 预期 Zeppelin结果不是null。你基本上是在惩罚我,因为我的回答没有解决你的NullPointerException。 OP 不接受任何答案,所以他们都应该得到负分吗?【参考方案9】:

似乎是 Zeppelin 0.7.1 中的错误。在 0.7.2 中运行良好。

【讨论】:

我认为这是一个配置问题,任何版本的 Zeppelin 都会发生。我在 Zeppelin 0.7.2 中看到了这个 0.7.3 中的相同

以上是关于在 Zeppelin 0.7.1 中运行 Spark 代码时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Zeppelin:如何在 zeppelin 中重新启动 sparkContext

在 docker 中使用 spark 2.2 运行 zeppelin

Zeppelin+Spark+Kubernetes:让 Zeppelin Job 在现有的 Spark 集群上运行

在火花集群模式下运行 zeppelin

使用 zeppelin 在 kubernetes 上运行 Spark

我可以触发Zeppelin在命令中运行特定块吗?