在hive udf中记录消息

fjnneemd  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(495)

我想使用log4j在hiveudf的文件中写入日志消息。
我已经编写了一个简单的自定义项,它是按照预期的工作,并能够写日志消息在本地文件。
但是当我在hadoop集群上测试hiveshell中的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

有人能告诉我为什么上面配置的代码没有在指定路径上的文件中写入日志消息吗?
提前谢谢!!

7gs2gvoe

7gs2gvoe1#

您应该考虑udfjar文件是在集群上复制的,并且由每个节点执行,因此如果路径有效并且用户有写入权限,那么在每台机器上都会写入一个日志文件。

nuypyhwy

nuypyhwy2#

我就是这样回答上面的问题的。
在我的属性文件中做了如下更改:

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 ,它还将写入不需要的 WARN 以及 ERROR 将来自hiveshell的消息放入文件中,如mapper、reducer信息。同样地, DEBUG 将写入 DEBUG , INFO , WARN , ERROR , FATAL 信息。
更改了 log.debuglog.fatal 在Hive里。其余代码与上面的相同。
使用hiveconf参数将属性文件传递给配置单元外壳,同时输入如下所示:

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

运行以下命令:

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

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

相关问题