GOOD4ME

TEZ 엔진 기반 파티셔닝 데이터 Insert 오류 본문

개발.오류.정리/Hive

TEZ 엔진 기반 파티셔닝 데이터 Insert 오류

de_youn 2023. 3. 7. 10:05
반응형

Apache hive에서 사용가능한 엔진은 대표적으로 Map-Reduce와 TEZ가 있다. Default로 설정된 엔진은 Map-Reduce이며 이 엔진으로 파티셔닝을 진행할 땐 아무 문제가 발생하지 않았다. 하지만 성능 향상을 위해 TEZ 엔진으로 변경 후 파티셔닝을 진행한 결과, 몇 가지 오류가 발생했다. 물론 yarn log를 확인해서 직접 문제를 해결할 수도 있겠지만, yarn log를 확인하는 게 번거롭거나yarn log 확인 방법에 익숙하지 않은 사람들을 위해 이번 글을 작성하게 되었다.

 

TEZ 라이브러리 경로 설정 오류

...
Query ID = root_20230307000533_0525f936-82a8-42be-8939-a3468fc5c123
Total jobs = 1
Launching Job 1 out of 1
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask
...

첫 번째로 해결할 것은 상기의 오류이다. 이 오류의 원인은 매우 다양하기 때문에 직접 log를 확인하는 것이 좋겠지만, 필자는 tez-site.xml 파일을 많이 수정하지 않았기 때문에 만약 이 글을 보는 여러분들이 tez-site.xml을 많이 수정하지 않았다면 다음과 같이 오류 해결 시도하는 것을 추천한다.

 

 

먼저 TEZ를 설치한 경로로 이동하여 conf/tez-site.xml에 진입한다. 진입 후, vim 기준, 슬래쉬(/)를 입력하여 검색 모드로 전환한 뒤, "tez.lib.uris"를 검색하여 값을 확인한다. 필자는 HDFS에 TEZ라이브러리를 저장했었는데, 여기서 경로 설정이 잘못되어서 상기의 오류가 발생했다. 경로를 제대로 설정한 후, 다시 실행해보니 TEZ 엔진으로 잘 구동되는 것을 확인할 수 있었다.

 

Hive 동적 파티션 설정 오류

...
Caused by: org.apache.hadoop.hive.ql.metadata.HiveFatalException: [Error 20004]: Fatal error occurred when node tried to create too many dynamic partitions. The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions and hive.exec.max.dynamic.partitions.pernode. Maximum was set to 100 partitions per node, number of dynamic partitions on this node: 101
        at org.apache.hadoop.hive.ql.exec.FileSinkOperator.getDynOutPaths(FileSinkOperator.java:1190)
        at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:938)
        at org.apache.hadoop.hive.ql.exec.Operator.baseForward(Operator.java:995)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:941)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:928)
        at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95)
        at org.apache.hadoop.hive.ql.exec.Operator.baseForward(Operator.java:995)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:941)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:125)
        at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:153)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:555)
        ... 20 more
...

두 번째로 해결할 것은 상기의 오류이다. Hive는 노드당 최대 처리 가능한 동적 파티션 값으로 default값 100이 설정되어져 있다. 이미 hive에 진입했다면 hive 내부에서 아래의 명령어를 수행해보길 바란다.

 

 

set hive.exec.max.dynamic.partitions=원하는 값; 
set hive.exec.max.dynamic.partitions.pernode=원하는 값;

 

하지만 상기의 방법은 hive session 연결 종료 시, 다시 원상복구되기 때문에 영구적으로 해당 설정을 바꾸려면 hive가 설치된 경로로 이동하여 conf/hive-site.xml에 진입하여 상기의 설정값들을 수정하길 바란다.

 


 

상기의 오류를 해결하고 파티셔닝 작업이 완료된 것을 확인했는데, 파티셔닝 속성으로 설정한 날짜값이 전부 0.1, 0.2, ... 이런식으로 파티셔닝된 것을 확인했다. 이제 일자를 제대로 파티셔닝하는 방법을 찾으러 간다.

반응형
Comments