2017-02-04 8 views
0

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 

誰が、なぜ構成されたコードの上に私を助けることができる指定されたパス上のファイルにログメッセージを書き込むないですか?

ありがとうございました!

+0

"ローカル"とはどういう意味ですか? Hiveクエリは**分散**処理ジョブを実行し、複数のマシンに散在し、各MapperまたはReducerは揮発性のコンテナ内で実行されます。そのため、あなたのUDFは* temp *ディレクトリに書き込むことができます。このディレクトリは、コンテナが停止したときに不具合が発生します。 –

+0

あなたはあなたが望むことをするには2つの方法がありますが、あなたの素朴な試みよりもずっと複雑です:_(a)_一意のファイル名を生成し、HDFSにあなたのものを記録してから、あなたの質問。または_(b)_特定のマシン上でFlumeエージェントを起動し、Log4J/Flume JARをHiveセッションに追加し、すべてのログをFlumeエージェントに送信してから、ログをローカルファイルにマージします。 –

+0

ローカルでは、UDFはEclipseでJunitを通して実行され、前述のパスにログを書き込むことができます。 – Sanjeev

答えて

0

udf jarファイルがクラスタ上にコピーされ、各ノードによって除外されるため、パスが有効で、ユーザーに書き込み権限がある場合、ログファイルが各マシンに書き込まれることを考慮する必要があります。

0

これは私が上記で尋ねた質問のために終わった方法です。

  1. 私の性質にいくつかの変更は以下のようなファイルでした:

    log4j.rootLogger= FATAL,file 
    
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender 
    log4j.appender.file.File=/idn/home/sshivhar/Sanjeev_POC/log/application_new 
    log4j.appender.file.DatePattern='_'yyyy-MM-dd'.log' 
    log4j.appender.file.layout=org.apache.log4j.PatternLayout 
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 
    

    私は私が私のUDFの内側に書いたメッセージのみを探していたので、私はFATALにログレベルを変更しました。

    メッセージを記録することは、優先レベルを下回っているので:

    TRACE < DEBUG < INFO < WARN < ERROR < FATAL 
    

    私はINFOFATALを変更した場合、それはまた、マッパーなどのハイブシェルから来ているファイルに不要なWARNERRORメッセージを書き込みます減速材情報。同様に、DEBUGは、DEBUG,INFO,WARN,ERROR,FATALというメッセージを書きます。

  2. HIVE UDF内のlog.debugからlog.fatalに変更されました。残りのコードは上記と同じです。

  3. 以下のように入力中のパラメータをhiveconf使用してシェルをハイブにプロパティファイルを渡さ:

    hive -hiveconf hive.log4j.file=/path/log4jprop.properties 
    

    は以下の蘭コマンド:

    ADD JAR path 
    CREATE TEMPORARY FUNCTION udfName as 'class_path' 
    select udfName(col) from table; 
    

    ログファイルは毎日作成されますとすることができ必要に応じてカスタマイズしてください。

関連する問題