티스토리 뷰

반응형

Flink 의 "streaming-source.enable" 기능을 이용해서 hive의 데이터를 스트림 데이터스럽게 처리하려고 했는데 희안하게 어떤 테이블은 잘 되는데, 어떤 테이블은 또 안되는 현상이 발생되었다. 그 이유는 결론부터 말하면 파티션이 약 3만개를 넘어가면 새로운 파티션이 생긴걸 인지 못하는 문제가 있다. (지원안하면 오류를 내야지... 뭔가 버그가 아닌가 싶다)

 

파티션 감지할때 갯수제한이 있다고?

기능 테스트를 위해 새로 만든테이블에서는 잘 되는데, 기존테이블을 이용해 시도하는데 안된다면 이 문제일 확률이 높다. 소스코드를 분석해보면 알겠지만, 메타스토어에서 파티션 정보를 리턴받고, 이 데이터를 어플리케이션에서 필터링하고 기준값보다 큰 파티션이 무엇인가를 찾아가는 과정을 반복한다. 문제는 성능과 안정성문제로 다음과 같이 limit 가 걸려있다. 그 제한갯수가 Short.MAX_VALUE 이고, 쉽게말해서 파티션이 32,767 개를 넘어가면 뒤쪽 정보는 안가져와서 새파티션이 추가된건지 인지가 안되는 상황이다.

 

HivePartitionFetcherContextBase.java

metaStoreClient.listPartitionNames(
                            tablePath.getDatabaseName(),
                            tablePath.getObjectName(),
                            Short.MAX_VALUE); 
// Short.MAX_VALUE = 32,767;  (일파티션 89년, 1시간파티션 3.6년,  30분파티션 1.8년)

즉, 다음과 같이 파티션갯수를 beeline 에서 체크했는데 그 갯수를 넘었다면 아무리 기다려도 인지를 못한다는 말이다.

hive> show partitions sample_db.t_sample;
+-------------------------+--+
|        partition        |
+-------------------------+--+
| ymd=2016-07-01/hh24=00  |
| ymd=2016-07-01/hh24=01  |
...
| ymd=2022-04-19/hh24=06  |
| ymd=2022-04-19/hh24=07  |
+-------------------------+--+
50,840 rows selected (1.996 seconds) -- 32,767 개 넘으면 인지안됨

해결방법은?

가장 손쉬운해결방법은 저 limit 값을 변경후 코드를 재빌드 하는것이다. 하지만 파티션이 엄청~~많을때 모든데이터를 리턴하는 구조는 메타스토어에 부담이 될수 있다. 그래서 이건 썩 좋은 방법은 아니다.

근본적으로 접근하면 "streaming-source.consume-start-offset" 값은 시작값 옵션이 있기 때문에 메타스토어에서 해당값보다 크거나 같은값을 리턴받는 구조로 개선하는게 가장 best 로 보인다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함