1

如果没有 -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 的速度会慢吗?我应该解决这个问题吗?我应该关心这个警告吗?

仅供参考,此错误(或 UnspecifiedLinkError)可以通过以下任一方法修复,

谢谢您的帮助。

4

1 回答 1

1

对于您收到的WARN消息,我假设您已经弄清楚了,但这仅意味着您没有使用 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只会bash -c groups通过 aProcessBuilder来确定用户属于哪些组,而JniBasedUnixGroupsMapping将使用 JNI 与 libC 通信以获取组列表。

我没有运行任何基准测试,但我认为与ProcessBuilderlibC 实现相比没有太多开销,因为它只是为了获取组,所以影响很小。话虽这么说,既然您似乎已经想通了,那么使用本机库在 Hadoop 的其他领域提高性能肯定不会有什么坏处。

于 2013-11-14T03:48:07.830 回答