log4jを使用してHive UDFのファイルにログメッセージを書きたいとします。ハイブUDFのログメッセージ
私は期待通りに動作し、ログメッセージをファイルにローカルで書き込むことができる単純なUDFを作成しました。
しかし、Hadoopクラスタのハイブシェルで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 *ディレクトリに書き込むことができます。このディレクトリは、コンテナが停止したときに不具合が発生します。 –
あなたはあなたが望むことをするには2つの方法がありますが、あなたの素朴な試みよりもずっと複雑です:_(a)_一意のファイル名を生成し、HDFSにあなたのものを記録してから、あなたの質問。または_(b)_特定のマシン上でFlumeエージェントを起動し、Log4J/Flume JARをHiveセッションに追加し、すべてのログをFlumeエージェントに送信してから、ログをローカルファイルにマージします。 –
ローカルでは、UDFはEclipseでJunitを通して実行され、前述のパスにログを書き込むことができます。 – Sanjeev