2017-02-04 924 views
0

我想使用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 

誰能幫助我,爲什麼上面的配置代碼不寫在指定的路徑下的文件日誌消息?

在此先感謝!

+0

你是什麼意思「本地」? Hive查詢運行分佈式**處理作業,分散在多臺機器上,每個Mapper或Reducer運行在一個易失性容器中。所以你的UDF只能寫在一個* temp *目錄下,這個目錄在容器停止時將不會被修改。 –

+0

你有兩種方法來做你想做的事情,但要麼是比你天真的嘗試更復雜:_(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 
    

    我改變了日誌級別FATAL,因爲我一直在尋找的只有那些我在我的UDF裏面寫消息。

    因爲日誌消息具有以下優先級:

    TRACE < DEBUG < INFO < WARN < ERROR < FATAL 
    

    如果我改變了FATALINFO,它也將寫不必要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; 
    

    日誌文件將得到每天的基礎上創建的,可以根據需要定製。