티스토리 뷰
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 로 보인다.
'데이터처리 > Flink' 카테고리의 다른 글
[Flink] Could not acquire the minimum required resources 이유와 해결방법 (0) | 2022.05.24 |
---|---|
Flink 1.15 버전에서 HA 설정시 오류가 발생하는 경우 - 주키퍼 버전 (0) | 2022.05.22 |
[Flink] Hive Streaming Source 기능 소개 - unbounded scan (0) | 2022.04.19 |
[Flink] Hive 연동시 슬롯보다 크게 TASK 가 잡히는 문제 (0) | 2022.03.21 |
[Flink] yarn-session.sh 오류 : java.lang.NoClassDefFoundError (0) | 2022.03.18 |