为 YARN / Hadoop2 作业设置 LD_LIBRARY_PATH 或 java.library.path

Set LD_LIBRARY_PATH or java.library.path for YARN / Hadoop2 Jobs

我有一个 Hadoop FileSystem,它使用带有 JNI 的本地库。

显然我必须独立于当前执行的作业来包含共享对象。但是我找不到一种方法来告诉 Hadoop/Yarn 它应该在哪里寻找共享对象。

我使用以下解决方案部分成功,同时使用 yarn 启动 wordcount 示例。

现在有人知道我如何全局设置 LD_LIBRARY_PATHjava.library.path 或者可以建议我可能错过了哪些配置选项吗?非常感谢!

简短回答:在您的 mapred-site.xml 中输入以下内容

<property>
<name>mapred.child.java.opts</name>
<value>-Djava.library.path=$PATH_TO_NATIVE_LIBS</value>
</property>

说明: Job/Applications 不是由 yarn 而是由 mapred (map/reduce) 容器执行的,其配置由 mapred-site.xml 文件控制。在那里指定自定义 java 参数会导致实际工作人员使用正确的路径旋转

在您的工作或站点配置中使用 mapreduce.map.env

用法如下:

<property>
             <name>mapreduce.map.env</name>
             <value>LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/my/libs</value>
</property>

注意: Hadoop 文档鼓励使用 mapreduce.map.env 而不是 mapred.child.java.opts。 "Usage of -Djava.library.path can cause programs to no longer function if hadoop native libraries are used."