Ols*_*nsk 256 java linux hadoop java.library.path hadoop2
我目前正在运行CentOs的服务器上配置hadoop .当我运行start-dfs.sh或时stop-dfs.sh,我收到以下错误:
WARN util.NativeCodeLoader:无法为您的平台加载native-hadoop库...使用适用的builtin-java类
我正在运行Hadoop 2.2.0.
在线搜索提出了这个链接:http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html
但是,/native/hadoop 2.x上的目录内容似乎不同,所以我不知道该怎么做.
我还在这两个环境变量中添加了hadoop-env.sh:
export HADOOP_OPTS ="$ HADOOP_OPTS -Djava.library.path =/usr/local/hadoop/lib /"
export HADOOP_COMMON_LIB_NATIVE_DIR ="/ usr/local/hadoop/lib/native /"
有任何想法吗?
zhu*_*ala 220
我假设您在64位CentOS上运行Hadoop.您看到该警告的原因是本机Hadoop库$HADOOP_HOME/lib/native/libhadoop.so.1.0.0实际上是在32位上编译的.
无论如何,这只是一个警告,不会影响Hadoop的功能.
如果您想要消除此警告,下载Hadoop的源代码并libhadoop.so.1.0.0在64位系统上重新编译,然后替换32位系统,则可以使用以下方法.
Ubuntu包含了如何重新编译源代码的步骤:
祝好运.
Hoa*_*ong 145
只需在您的喜欢中添加原生单词HADOOP_OPTS:
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
Run Code Online (Sandbox Code Playgroud)
PS:谢谢Searene
chr*_*gle 49
答案取决于......我刚从64位CentOS 6.6上的tarball安装了Hadoop 2.6.Hadoop安装确实带有预构建的64位本机库.对于我的安装,它在这里:
/opt/hadoop/lib/native/libhadoop.so.1.0.0
Run Code Online (Sandbox Code Playgroud)
我知道它是64位:
[hadoop@VMWHADTEST01 native]$ ldd libhadoop.so.1.0.0
./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
linux-vdso.so.1 => (0x00007fff43510000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9be553a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9be51a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9be5966000)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我愚蠢地忽略了那里的答案,正如我所关注的那样盯着我,"这个库是32位64位吗?":
`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
Run Code Online (Sandbox Code Playgroud)
所以,经验教训.无论如何,其余的至少让我能够压制警告.所以我继续并在其他答案中做了所有建议,使用HADOOP_OPTS环境变量提供库路径无济于事.所以我查看了源代码.生成错误的模块会告诉您提示(util.NativeCodeLoader):
15/06/18 18:59:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Run Code Online (Sandbox Code Playgroud)
所以,到这里看看它做了什么:
啊,有一些调试级别的日志记录 - 如果我们得到一些额外的帮助,让我们看看.这是通过将以下行添加到$ HADOOP_CONF_DIR/log4j.properties文件来完成的:
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG
Run Code Online (Sandbox Code Playgroud)
然后我运行了一个生成原始警告的命令,比如stop-dfs.sh,并得到了这个好东西:
15/06/18 19:05:19 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /opt/hadoop/lib/native/libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/hadoop/lib/native/libhadoop.so.1.0.0)
Run Code Online (Sandbox Code Playgroud)
答案在调试消息的这个片段中显示(与之前的ldd命令'试过'告诉我的相同:
`GLIBC_2.14' not found (required by opt/hadoop/lib/native/libhadoop.so.1.0.0)
Run Code Online (Sandbox Code Playgroud)
我有什么版本的GLIBC?这是一个简单的技巧:
[hadoop@VMWHADTEST01 hadoop]$ ldd --version
ldd (GNU libc) 2.12
Run Code Online (Sandbox Code Playgroud)
所以,无法将我的操作系统更新到2.14.唯一的解决方案是从我的操作系统上的源构建本机库或抑制警告,暂时忽略它.我现在选择仅仅抑制恼人的警告(但是计划在将来从源构建)使用我们用于获取调试消息的相同日志记录选项购买,除了现在,只需将其设置为ERROR级别.
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
Run Code Online (Sandbox Code Playgroud)
我希望这有助于其他人看到开源软件的一大好处是,如果你采取一些简单的逻辑步骤,你可以解决这个问题.
小智 22
我遇到过同样的问题.它通过添加以下行来解决.bashrc:
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
Run Code Online (Sandbox Code Playgroud)
小智 21
在我的情况下,在我的64位Linux薄型操作系统上构建hadoop后,我替换了本机库hadoop/lib.问题仍然存在.然后我发现hadoop指向hadoop/lib不是hadoop/lib/native.所以我只是将所有内容从本地库移动到其父级.警告刚刚消失.
Nag*_*D N 13
经过KotiI建议的持续研究后,我们解决了这个问题.
hduser@ubuntu:~$ cd /usr/local/hadoop
hduser@ubuntu:/usr/local/hadoop$ ls
bin include libexec logs README.txt share
etc lib LICENSE.txt NOTICE.txt sbin
hduser@ubuntu:/usr/local/hadoop$ cd lib
hduser@ubuntu:/usr/local/hadoop/lib$ ls
native
hduser@ubuntu:/usr/local/hadoop/lib$ cd native/
hduser@ubuntu:/usr/local/hadoop/lib/native$ ls
libhadoop.a libhadoop.so libhadooputils.a libhdfs.so
libhadooppipes.a libhadoop.so.1.0.0 libhdfs.a libhdfs.so.0.0.0
hduser@ubuntu:/usr/local/hadoop/lib/native$ sudo mv * ../
Run Code Online (Sandbox Code Playgroud)
干杯
Kal*_*osh 11
这也可行:
export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native
Run Code Online (Sandbox Code Playgroud)
Phi*_*ien 11
对于通过Homebrew安装Hadoop的OSX上的用户,请按照以下步骤在适当的位置替换路径和Hadoop版本
wget http://www.eu.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz
tar xvf hadoop-2.7.1-src.tar.gz
cd hadoop-2.7.1-src
mvn package -Pdist,native -DskipTests -Dtar
mv lib /usr/local/Cellar/hadoop/2.7.1/
Run Code Online (Sandbox Code Playgroud)
然后使用更新hadoop-env.sh
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Djava.library.path=/usr/local/Cellar/hadoop/2.7.1/lib/native"
Run Code Online (Sandbox Code Playgroud)
小智 10
export JAVA_HOME=/home/hadoop/software/java/jdk1.7.0_80
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"
Run Code Online (Sandbox Code Playgroud)
@zhutoulala - FWIW您的链接为我使用Hadoop 2.4.0,但有一个例外我不得不告诉maven不要构建javadoc.我也在2.4.0的第一个链接中使用了补丁,它工作正常.这是我必须发出的maven命令
mvn package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar
Run Code Online (Sandbox Code Playgroud)
在构建并移动库之后,不要忘记更新hadoop-env.sh :)
认为这可能会帮助遇到与我一样的障碍的人
小智 5
将已编译的本机库文件移动到$HADOOP_HOME/lib文件夹.
然后通过编辑.bashrc文件设置环境变量
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib"
Run Code Online (Sandbox Code Playgroud)
确保已编译的本机库文件位于$HADOOP_HOME/lib文件夹中.
它应该工作.