2017-02-04 5 views
0

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 

사람이 좀 도와 줄래 : 아래

코드인가?

미리 감사드립니다.

+0

"로컬"이란 무엇입니까? 하이브 쿼리는 ** 분산 ** 처리 작업을 실행하며 여러 컴퓨터에 분산되어 있으며 매퍼 또는 감속기는 휘발성 컨테이너에서 실행됩니다. 따라서 UDF는 컨테이너가 멈 추면 * temp * 디렉토리에만 쓸 수 있습니다. –

+0

당신이 원하는 것을 할 수있는 두 가지 방법이 있지만 순진한 시도보다 더 복잡한 방법이 있습니다 : _ (a) _ 고유 한 파일 이름을 생성하고 HDFS에 물건을 로그 한 다음에 작성한 여러 파일을 이해하려고 시도하십시오 귀하의 질문; 또는 _ (b) _ 특정 시스템에서 Flume 에이전트를 시작하고 Log4J/Flume JAR을 하이브 세션에 추가하고 모든 로그를 Flume 에이전트로 보내면 로그를 로컬 파일에 병합 할 수 있습니다. –

+0

Locally는 Eclipse가 Junit을 통해 실행되고 언급 된 경로에 로그를 쓸 수 있음을 의미합니다. – Sanjeev

답변

0

udf jar 파일이 클러스터를 통해 복사되고 각 노드에 의해 제외되므로 경로가 유효하고 사용자에게 쓰기 권한이있는 경우 로그 파일이 각 시스템에 기록됩니다.

0

이렇게 내가 위에 질문 한 질문에 대한 결과입니다. 나는 내 UDF 내부에 쓴 메시지 만 찾고 있었기 때문에

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에 로깅 수준을 변경 :
  1. 은 내 속성에 약간의 변화가 아래와 같은 파일을했다.

    메시지를 기록하는 우선 순위 아래에 있기 때문에 :

    TRACE < DEBUG < INFO < WARN < ERROR < FATAL 
    

    나는 FATALINFO에 변경 한 경우, 또한 매퍼 같은 하이브 쉘에서 제공되는 파일에 원치 않는 WARNERROR 메시지를 작성합니다, 감속기 정보. 마찬가지로 DEBUGDEBUG, INFO, WARN, ERROR, FATAL 메시지를 작성합니다.

  2. HIVE UDF 내의 log.debuglog.fatal으로 변경했습니다. 나머지 코드는 위와 같습니다.

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

    아래 란 명령 :

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

    로그 파일이 매일 만들어 얻을 것이다 할 수 있습니다 아래와 같이 입력하는 동안

  3. 는 매개 변수를 hiveconf 사용하여 쉘을 하이브 등록 정보 파일을 통과 필요에 따라 사용자 정의하십시오.