Я хочу записать сообщения журнала в файл для 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
Может кто-нибудь помочь мне, почему выше настроенного кода не писать лог-сообщения в файле на указанном пути?
Спасибо заранее!
Что вы подразумеваете под "local" ?? Запросы в кустах запускают ** распределенное задание обработки, разбросанное на нескольких машинах, и каждый Mapper или Reducer работает в летучем контейнере. Таким образом, ваш UDF может записывать только в каталог * temp *, который будет заблокирован при остановке контейнера. –
У вас есть два способа сделать то, что вы хотите, но либо ПУТЬ БОЛЬШЕ COMPLEX, чем ваша наивная попытка: _ (a) _ генерировать уникальное имя файла и записывать ваши данные в HDFS, а затем попытаться понять несколько файлов, созданных Ваш запрос; или _ (b) _ запустите Flume agent на конкретном компьютере, добавьте Log4J/Flume JAR в сеанс Hive, отправьте все ваши журналы агенту Flume, который затем может объединить журналы в локальный файл. –
Локально означает, что UDF выполняется через Junit в eclipse и может записывать журналы по указанному пути. – Sanjeev