使用应用程序配置而不是hadoop配置

v6ylcynt  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(413)

我用maven构建了一个java应用程序。它使用maven shade插件打包为可执行jar。这个应用程序做了几件事——其中之一就是将数据上传到hadoop集群。我使用以下方法执行程序:

$ hadoop jar <app_name>.jar <app_arg1> <app_arg2> ...

我的应用程序使用slf4j和log4j绑定进行日志记录,hadoop也是如此。
当使用 hadoop jar 命令,hadoop自己的log4j配置文件将覆盖我的应用程序的log4j配置文件。
如何防止应用程序的log4j配置文件被重写?
笔记:
相关依赖项: hadoop-core:1.2.1 , slf4j-api:1.7.12 ,和 slf4j-log4j12:1.7.12 .
我用的是 hadoop jar 命令,而不是 java -jar . 我的与hadoop集群交互的应用程序代码只有在使用 hadoop jar 命令。我在前面的一个问题中概述了这个问题。
编辑1:(10/02/2015)
我做了几件事。
首先,我更改了log4j配置文件的名称,以避免名称与默认名称冲突 log4j.properties hadoop使用的文件:

log4j-<app_name>.properties

第二,我设置了 HADOOP_OPTS 告诉log4j配置文件的名称的环境变量:

HADOOP_OPTS=-Dlog4j.configurationi=log4j-<app_name>.properties

第三,我设置了 HADOOP_CLASSPATH 环境变量,以确保包在uberjar中的配置文件被 hadoop jar 命令:

HADOOP_CLASSPATH=/absolute/path/to/<app_name>.jar

通过这些更改,我的应用程序现在可以按预期使用自己的log4j配置文件。感觉像黑客(因为我更喜欢使用 java -jar 但它解决了我的问题。

wn9m85ua

wn9m85ua1#

默认情况下,hadoop框架jar出现在 classpath . 您可以使用 -Dmapreduce.job.user.classpath.first=true 命令中的参数。新命令将在下面显示。

hadoop jar <app_name>.jar -Dmapreduce.job.user.classpath.first=true <<app_arg1>> <<app_arg2>> ...

或者你可以把下面的配置放在你的电脑里 mapred-site.xml 始终优先考虑用户 classpath .

<property>
    <name>mapreduce.job.user.classpath.first</name>
    <value>true</value>
</property>

您可以在作业配置中以编程方式进行设置。

job.getConfiguration().set("mapreduce.job.user.classpath.first", "true");

你可以通过任何方式设置,永远不会迟到。

相关问题