在hadoop的学习过程中,遇到了WARN util.NativeCodeLoader: Unable to load native-hadoop library for yourplatform... using builtin-java classes where applicable的警告。尽管并不影响程序的正常运行,但每次使用hdfs命令时弹出警告还是略微影响使用体验的。因此,将调试过程记录如下:
写在前面:Hadoop本地库是为了提高效率或者某些不能用Java实现的功能组件库。目前只支持 *unix, 在Mac OS X和Cygwin上不提供直接支持。因此需要自己重新编译,这里有篇文章可供参考:Mac OSX 下 Hadoop 使用本地库提高效率
1.确认OS位数,JDK位数,Hadoop本地库位数是否一致
OS位数查看方法:uname -a
JDK位数查看方法:java -version
Hadoop本地库位数查看方法:进入hadoop下的lib/native文件夹下 ldd libhadoop.so.1.0.0
2.路径问题
开启debug:直接在shell下运行下以下代码
export HADOOP_ROOT_LOGGER=DEBUG,console
此时通过hdfs dfs -ls
来查看输出并找到如下记录
DEBUG util.NativeCodeLoader: java.library.path=/usr/local/hadoop/lib/
如果记录与之类似,即没有/lib/native/结尾的路径,说明问题的原因出在path问题上,本地库的路径并没有被正确的加载。
解决方法:
在/HADOOP_HOME/etc/hadoop/中的hadoop_env.sh中修改如下信息:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
再次执行hdfs dfs -ls
并查看输出,若path仍未以native/结尾,返回根目录下执行echo $PATH
,查看$HADOOP_HOME的路径是否正确输出,若不存在Hadoop的路径,则通过修改.bash_profile
或者/etc/profile
文件配置好Hadoop路径并通过source /etc/profile
来使配置生效
3.链接文件问题
查看native文件夹下libhadoop.so
及libhdfs.so
文件是否存在,若不存在,做符号链接之。若存在但文件大小为0,删除并重新做符号链接
ln -s libhadoop.so.1.0.0 libhadoop.so
ln -s libhdfs.so.0.0.0 libhdfs.so