在Hive UDF中记录消息

时间:2017-02-04 12:46:48

标签: hadoop logging hive

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

任何人都可以帮助我为什么上面配置的代码不是在指定路径上的文件中写日志消息?

先谢谢!!

2 个答案:

答案 0 :(得分:0)

您应该考虑将udf jar文件复制到集群上并由每个节点执行,因此如果路径有效且用户有权写入,则会在每台计算机中写入日志文件。

答案 1 :(得分: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
    

    如果我将 FATAL更改为INFO ,它还会将不需要的WARNERROR条消息写入来自的文件中hive shell就像mapper,reducer信息一样。同样,DEBUG会写出DEBUGINFOWARNERRORFATAL条消息。

  2. 将HIVE UDF中的log.debug更改为log.fatal。其余代码与上述相同。

  3. 使用hiveconf参数将属性文件传递给hive shell,输入如下:

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

    以下命令:

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

    日志文件将每天创建,并可根据需要进行自定义。