2017-02-04 4 views
0

Я хочу записать сообщения журнала в файл для Hive UDF, используя log4j.Журнальные сообщения в Hive UDF

Я написал простой UDF, который работает в соответствии с ожиданиями и умеет записывать сообщения журнала в файл локально.

Но когда я попытался протестировать udf в оболочке hive на кластере Hadoop, он не сможет записывать сообщения журнала в файл.

Ниже приведен код:

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

Что вы подразумеваете под "local" ?? Запросы в кустах запускают ** распределенное задание обработки, разбросанное на нескольких машинах, и каждый Mapper или Reducer работает в летучем контейнере. Таким образом, ваш UDF может записывать только в каталог * temp *, который будет заблокирован при остановке контейнера. –

+0

У вас есть два способа сделать то, что вы хотите, но либо ПУТЬ БОЛЬШЕ COMPLEX, чем ваша наивная попытка: _ (a) _ генерировать уникальное имя файла и записывать ваши данные в HDFS, а затем попытаться понять несколько файлов, созданных Ваш запрос; или _ (b) _ запустите Flume agent на конкретном компьютере, добавьте Log4J/Flume JAR в сеанс Hive, отправьте все ваши журналы агенту Flume, который затем может объединить журналы в локальный файл. –

+0

Локально означает, что UDF выполняется через Junit в eclipse и может записывать журналы по указанному пути. – 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.

    Поскольку протоколирование сообщений имеет ниже уровня приоритета:

    TRACE < DEBUG < INFO < WARN < ERROR < FATAL 
    

    Если бы я изменил FATAL к INFO, он также будет писать нежелательные WARN и ERROR сообщений в файл, который поступает из улья оболочки, как картограф, редуктора. Аналогичным образом, DEBUG будет писать DEBUG, INFO, WARN, ERROR, FATAL сообщений.

  2. Изменил log.debug на log.fatal внутри UEF HIVE. Остальная часть кода такая же, как указано выше.

  3. Сдал файл свойств в 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; 
    

    Log файл будет создан на ежедневной основе, и может быть настраивать по мере необходимости.

Смежные вопросы