【问题标题】:On my Mac, hadoop 3.1.0 finds it native libraries, but spark 2.3.1 does not在我的 Mac 上,hadoop 3.1.0 找到了本机库,但 spark 2.3.1 没有
【发布时间】:2018-12-23 06:31:50
【问题描述】:

简介

我知道 99% 的情况下此错误消息的答案:

WARN  NativeCodeLoader:60 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

只是“这只是一个警告,不要担心”,然后有时是“只需下载库,编译它们并将 HADOOP_HOME 指向此文件夹并将 $HADOOP_HOME/bin/native 添加到您的 LD_LIBRARY_PATH”

这就是我所做的,但我仍然收到错误,经过两天的谷歌搜索后,我开始觉得如果我设法解决这个问题,我会发现一些非常有趣的东西,目前我有一个奇怪的行为不明白,希望我们能一起解决这个问题。

好的,接下来就是:

Hadoop 找到本机库

运行 hadoop checknative -a 给了我这个:

dds-MacBook-Pro-2:~ Rkey$ hadoop checknative -a
2018-07-15 16:18:25,956 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
2018-07-15 16:18:25,959 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
2018-07-15 16:18:25,963 WARN erasurecode.ErasureCodeNative: ISA-L support is not available in your platform... using builtin-java codec where applicable
Native library checking:
hadoop:  true /usr/local/Cellar/hadoop/3.1.0/lib/native/libhadoop.dylib
zlib:    true /usr/lib/libz.1.dylib
zstd  :  false 
snappy:  true /usr/local/lib/libsnappy.1.dylib
lz4:     true revision:10301
bzip2:   false 
openssl: false build does not support openssl.
ISA-L:   false libhadoop was built without ISA-L support
2018-07-15 16:18:25,986 INFO util.ExitUtil: Exiting with status 1: ExitException

这里有一些错误,这可能是原因,但最重要的是现在这条线存在:

hadoop:  true /usr/local/Cellar/hadoop/3.1.0/lib/native/libhadoop.dylib

当我启动我的 hadoop 集群时,它是这样的:

dds-MacBook-Pro-2:~ Rkey$ hstart
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [dds-MacBook-Pro-2.local]
Starting resourcemanager
Starting nodemanagers

没有警告。我下载了 hadoop 源代码并自己构建了它。在我这样做之前,那里“找不到本机库”-启动 hadoop 时的警告。

但是,spark 找不到本机库

这是我运行 pyspark 时的样子:

dds-MacBook-Pro-2:~ Rkey$ pyspark
Python 3.7.0 (default, Jun 29 2018, 20:13:53) 
[Clang 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
2018-07-15 16:22:22 WARN  NativeCodeLoader:60 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.1
      /_/

这是我们的老朋友再次出现的地方:

WARN  NativeCodeLoader:60 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

我觉得这很奇怪,因为我知道事实上它使用了相同的 hadoop,我可以在没有任何警告的情况下自行启动。我的电脑上没有其他 hadoop 安装。

澄清

我从他们的网站“使用用户提供的 Apache Hadoop 进行预构建”下载了 apache-spark 的非 Hadoop 版本。然后将其放入我的地窖文件夹中,只是因为我不想重新链接所有内容。

至于变量,这是我的~/.profile

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
export OPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2o_2

export PYSPARK_PYTHON=python3
export PYSPARK_DRIVER_PYTHON=python3
export HADOOP_HOME=/usr/local/Cellar/hadoop/3.1.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/usr/local/spark

export PATH=$SPARK_HOME/bin:$PATH

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

alias hstart="$HADOOP_HOME/sbin/start-dfs.sh;$HADOOP_HOME/sbin/start-yarn.sh"
alias hstop="$HADOOP_HOME/sbin/stop-dfs.sh;$HADOOP_HOME/sbin/stop-yarn.sh"

这是我对 spark-env.sh 的补充:

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

export LD_LIBRARY_PATH=/usr/local/Cellar/hadoop/3.1.0/lib/native/:$LD_LIBRARY_PATH

这是文件夹 /usr/local/Cellar/hadoop/3.1.0/lib/native 的外观:

问题

hadoop 是如何在本地启动而不发出缺少库的警告的,并且通过 checknatives -a 命令显示它找到了本机库,但是当通过 pyspark 启动相同的 hadoop 时,我突然再次发出此警告?

16/7 更新

我最近有了一个发现。此经典错误消息的标准版本如下所示:

WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

这实际上是不同的,因为我的错误消息改为 NativeCodeLoader:60,用 60 而不是 62。这表明我的理论并不是真的缺少 hadoop 库,而是缺少一些 hadoop 正在使用的本机库.这就是为什么 hadoop 可以在没有警告的情况下启动,但 pyspark 可能会尝试使用来自 hadoop 的更多本机库,但会在启动时出现警告。

这仍然只是一个理论,直到我从 checknative 中删除所有警告 - 一个我不知道的调用。

15/7 更新

目前正在尝试从 hadoop checknative -a 中删除“WARN bzip2.Bzip2Factory:”-warning,也许这可能会在启动 pyspark 时删除警告。

【问题讨论】:

  • 顺便说一句,您将覆盖SPARK_DIST_CLASSPATH 三次。你是如何安装 Spark 的?
  • 谢谢!看来我复制粘贴的太快了。仅保留 export SPARK_DIST_CLASSPATH=$(hadoop classpath) 删除了启动 spark 时的所有警告,但原始警告除外。我将使用新文件更新原始问题并触发启动输出。
  • 您能否显示/usr/local/Cellar/hadoop/3.1.0/lib/native 的目录内容的输出?
  • 是的,更新原始问题,一秒钟
  • 更新截图

标签: macos apache-spark hadoop pyspark warnings


【解决方案1】:

我和你有同样的问题。就我而言,这是因为,从 macOS X El Capitan 开始,macOS 中的 SIP 机制使操作系统忽略 LD_LIBRARY_PATH/DYLD_LIBRARY_PATH 即使您已经将 Hadoop 本机库添加到任何这些变量的值(我明白了)来自https://help.mulesoft.com/s/article/Variables-LD-LIBRARY-PATH-DYLD-LIBRARY-PATH-are-ignored-on-MAC-OS-if-System-Integrity-Protect-SIP-is-enable的信息)。

实际上,Spark 的 NativeCodeLoader 警告可以忽略。但是,如果您真的想让警告消失,您可以在 macOS X 上禁用 SIP,然后确保将 $HADOOP_HOME/lib/native 添加到 LD_LIBRARY_PATH。然后spark就可以正确找到Hadoop原生库了。

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2022-07-22
    • 1970-01-01
    • 2018-08-20
    • 2015-08-02
    相关资源
    最近更新 更多