log4j를 사용하여 하이브 UDF 파일에 로그 메시지를 쓰고 싶습니다.하이브 UDF 로그 메시지
저는 예상대로 작동하고 로그 메시지를 파일에 로컬로 기록 할 수있는 간단한 UDF를 작성했습니다.
하지만 Hadoop 클러스터의 셸에서 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
사람이 좀 도와 줄래 : 아래
코드인가?미리 감사드립니다.
"로컬"이란 무엇입니까? 하이브 쿼리는 ** 분산 ** 처리 작업을 실행하며 여러 컴퓨터에 분산되어 있으며 매퍼 또는 감속기는 휘발성 컨테이너에서 실행됩니다. 따라서 UDF는 컨테이너가 멈 추면 * temp * 디렉토리에만 쓸 수 있습니다. –
당신이 원하는 것을 할 수있는 두 가지 방법이 있지만 순진한 시도보다 더 복잡한 방법이 있습니다 : _ (a) _ 고유 한 파일 이름을 생성하고 HDFS에 물건을 로그 한 다음에 작성한 여러 파일을 이해하려고 시도하십시오 귀하의 질문; 또는 _ (b) _ 특정 시스템에서 Flume 에이전트를 시작하고 Log4J/Flume JAR을 하이브 세션에 추가하고 모든 로그를 Flume 에이전트로 보내면 로그를 로컬 파일에 병합 할 수 있습니다. –
Locally는 Eclipse가 Junit을 통해 실행되고 언급 된 경로에 로그를 쓸 수 있음을 의미합니다. – Sanjeev