Java 未能加载本机hadoop库

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

如果没有-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... 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的其他领域使用本机库来提高性能肯定没有什么坏处