Java 未能加载本机hadoop库
如果没有-Djava.library.path=/opt/mapr/hadoop/hadoop-0.20.2/lib/native/Linux-amd64-64/作为运行Java的参数,我会得到以下错误:Java 未能加载本机hadoop库,java,hadoop,Java,Hadoop,如果没有-Djava.library.path=/opt/mapr/hadoop/hadoop-0.20.2/lib/native/Linux-amd64-64/作为运行Java的参数,我会得到以下错误: 2013-11-13 15:23:29,414 WARN pool-3-thread-3 org.apache.hadoop.util.NativeCodeLoader Unable to load native-hadoop library for your platform... u
2013-11-13 15:23:29,414 WARN pool-3-thread-3 org.apache.hadoop.util.NativeCodeLoader Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2013-11-13 15:23:29,414 INFO pool-3-thread-3 org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback Falling back to shell based
这是什么意思?使用基于shell的程序是否较慢?我该修这个吗?我应该关心这个警告吗
仅供参考,此错误(或未指定的链接错误)可通过以下任一方法修复:
- 有关设置java.library.path的详细信息,请参见此答案-
- 在文件hadoop-env.sh中添加以下行 export HADOOP_CLIENT_OPTS=-Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/
谢谢你的帮助。对于你收到的
警告消息,我想你已经明白了,但这只是意味着你没有使用Hadoop的本机库,这可能会更慢或者gzip无法正常工作
但是对于来自JniBasedUnixGroupsMappingWithFallback
的第二条消息,它有点复杂。如果您查看源代码,您将看到如下内容:
if (NativeCodeLoader.isNativeCodeLoaded()) {
this.impl = new JniBasedUnixGroupsMapping();
} else {
LOG.info("Falling back to shell based");
this.impl = new ShellBasedUnixGroupsMapping();
}
ShellBasedUnixGroupsMapping
和JniBasedUnixGroupsMapping
之间的唯一区别在于ShellBasedUnixGroupsMapping
只需通过ProcessBuilder
执行一个bash-c组
,以确定用户属于哪个组,而JniBasedUnixGroupsMapping
将使用JNI与libC通信以获取组列表
我还没有运行任何基准测试,但我认为与libC实现相比,ProcessBuilder
没有太大的开销,因为它只是为了获得组,所以影响最小。话虽如此,由于您似乎已经明白了这一点,因此在Hadoop的其他领域使用本机库来提高性能肯定不会有什么坏处。对于您收到的警告消息,我假设您已经明白了,但这只是意味着您没有使用Hadoop的本机库,这可能会更慢,或者只是gzip无法正常工作
但是对于来自JniBasedUnixGroupsMappingWithFallback
的第二条消息,它有点复杂。如果您查看源代码,您将看到如下内容:
if (NativeCodeLoader.isNativeCodeLoaded()) {
this.impl = new JniBasedUnixGroupsMapping();
} else {
LOG.info("Falling back to shell based");
this.impl = new ShellBasedUnixGroupsMapping();
}
ShellBasedUnixGroupsMapping
和JniBasedUnixGroupsMapping
之间的唯一区别在于ShellBasedUnixGroupsMapping
只需通过ProcessBuilder
执行一个bash-c组
,以确定用户属于哪个组,而JniBasedUnixGroupsMapping
将使用JNI与libC通信以获取组列表
我还没有运行任何基准测试,但我认为与libC实现相比,ProcessBuilder
没有太大的开销,因为它只是为了获得组,所以影响最小。话虽如此,由于您似乎已经明白了这一点,因此在Hadoop的其他领域使用本机库来提高性能肯定没有什么坏处