java.lang.reflect.InvocationTargetException when using UDF in Hive query


하이브 UDF 사용시에 다음과 같은 에러가 나면 (하이브 0.10.0 버전 기준)

java.lang.RuntimeException: Error in configuring object
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:93)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:387)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:266)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1278)
    at org.apache.hadoop.mapred.Child.main(Child.java:260)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java


UDF의 jar파일이 중복으로 classpath에 잡혀 있을 가능성이 있다.

하이브에 jar를 등록하는 방법은 다음과 같다.

  • hive-site.xml 안에 hive.aux.jars.path 값
  • 환경 변수 HIVE_AUX_JARS_PATH
  • .hiverc 파일안에 add jar[s]
  • CLI 실행시 -i 옵션으로 지정한 스크립트에 add jar[s]

참고로 .hiverc는 cli에서만 읽는다. (Thrift 서버 구동시는 초기화 스크립트는 -i 옵션을 이용)


-----


5월 20일 추가


$HIVE_HOME/bin/hive 스크립트는 $HIVE_HOME/bin/ext/util/execHiveCmd.sh를 include한다.

결국 hadoop jar 명령을 통해서 HIve CLI 나 beeline 클래스의 메인 메소드를 실행하게 되어 있다.


그래서 $HADOOP_HOME/lib 이나 하둡 클래스 패스에도 UDF jar파일이 중복으로 잡혀 있다면 리플랙션으로 UDF를 불러올때 위와 같은 에러를 발생시킬 수 있다.


결국 hadoop의 lib과 클래스 패스도 살펴보아야 한다. (원인도 모르고 캐삽질 할 수 있음......;; )

Posted by 김민우 julingks
TAG ,

댓글을 달아 주세요