我想使用log4j在Hive UDF的文件中寫入日誌消息。Hive UDF中的日誌消息
我寫了一個簡單的UDF,它按照預期工作,並能夠在本地寫入文件中的日誌消息。
但是,當我試圖在Hadoop集羣上的hive shell中測試udf時,它無法在文件中寫入日誌消息。
下面是代碼:
package com.log4j.example;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.log4j.Logger;
public class isNull extends UDF {
private final static Logger log = Logger.getLogger(isNull.class.getName());
public Boolean evaluate(String input) {
Object in = input;
boolean returnType = false;
if (in == null) {
log.debug("Input is Null"+in);
returnType = true;
} else {
returnType = false;
}
return returnType;
}}
Below is the properties file for log4j
#TRACE < DEBUG < INFO < WARN < ERROR < FATAL
log4j.rootLogger = DEBUG, toConsole, toFile
#CONSOLE
log4j.appender.toConsole=org.apache.log4j.ConsoleAppender
log4j.appender.toConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.toConsole.layout.ConversionPattern=%d{HH:mm:ss} %5p [%t] - %c.%M - %m%n
#DAILYROLLINGFILE
log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toFile.File=/idn/home/test/logfile.log
#log4j.appender.toFile.Append=false
log4j.appender.toFile.DatePattern='.'yyyy`enter code here`-MM-dd
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toFile.layout.ConversionPattern=%d %5p [%t] - %c.%M - %m%n
誰能幫助我,爲什麼上面的配置代碼不寫在指定的路徑下的文件日誌消息?
在此先感謝!
你是什麼意思「本地」? Hive查詢運行分佈式**處理作業,分散在多臺機器上,每個Mapper或Reducer運行在一個易失性容器中。所以你的UDF只能寫在一個* temp *目錄下,這個目錄在容器停止時將不會被修改。 –
你有兩種方法來做你想做的事情,但要麼是比你天真的嘗試更復雜:_(a)_生成一個唯一的文件名並記錄你的東西到HDFS,然後試着理解由您的查詢;或_(b)_在特定機器上啓動Flume代理,將Log4J/Flume JAR添加到Hive會話中,將所有日誌發送到Flume代理,然後將日誌合併到本地文件。 –
本地意味着UDF通過eclipse中的Junit執行,並能夠在提到的路徑中寫入日誌。 – Sanjeev