我用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
但它解决了我的问题。
1条答案
按热度按时间wn9m85ua1#
默认情况下,hadoop框架jar出现在
classpath
. 您可以使用-Dmapreduce.job.user.classpath.first=true
命令中的参数。新命令将在下面显示。或者你可以把下面的配置放在你的电脑里
mapred-site.xml
始终优先考虑用户classpath
.您可以在作业配置中以编程方式进行设置。
你可以通过任何方式设置,永远不会迟到。