Intro

我知道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 finds the native libraries

运行一个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源码并自己构建了它 . 在我这样做之前,那里有“找不到本 Map 书馆” - 在启动hadoop时的警告 .

However, spark does not find the native libraries

这是我运行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安装 .

Clarifications

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

至于变量,这是我的〜/ .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的外观:

Running ls -las inside usr/local/Cellar/hadoop/3.1.0/lib/native

The question

hadoop怎么能在本地启动而不发出错过它的库的警告,并通过checknatives -a命令显示它找到了本机库,但是当通过pyspark启动相同的hadoop时我突然发出了这个警告再次?

Update 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中的更多本机库,并发出警告 .

这仍然只是一个理论,直到我从检查中删除所有警告 - 一个我不知道的电话 .

Update 15/7

目前正试图删除“WARN bzip2.Bzip2Factory:” - 来自hadoop checknative -a的警告,也许这可能会在启动pyspark时删除警告 .