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的外观:
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时删除警告 .