Spark SQL 이 실행 계획을 세울 때 테이블 크기를 알아야 브로드캐스트 조인 여부를 정할 수 있다. 크기 정보는 보통 메타스토어의 통계에서 가져오는데, 통계가 없는 테이블이면 값을 모른다.
이 설정을 켜면 통계가 없을 때 HDFS 의 실제 파일 크기를 재서 크기를 추정한다.
SET spark.sql.statistics.fallBackToHdfs=true;
기본값은 꺼짐이다. 설정 이름의 대소문자에 주의한다 - fallBackToHdfs 다.
| 상태 | 결과 |
|---|---|
| 꺼짐 + 통계 없음 | 크기를 모르므로 spark.sql.defaultSizeInBytes(사실상 무한대)로 간주해 브로드캐스트 조인을 포기한다 |
| 켬 + 통계 없음 | 파일 크기를 재서 판단한다. 작은 테이블이면 브로드캐스트가 살아난다 |
켜는 대가는 실행 계획 수립 시점의 네임노드 조회다. 파티션이 아주 많은 테이블에서는 계획 단계가 느려질 수 있다. 근본적인 해결은 통계를 수집해 두는 것이고, 이 설정은 통계가 없는 테이블에 대한 보정이다.
압축 포맷의 파일 크기는 실제 데이터 크기보다 작으므로, fallback 으로 잡은 크기는 과소평가되기 쉽다. 브로드캐스트 임계값 근처의 테이블에서는 오히려 OOM 을 부를 수 있다.
Hive 에는 비슷한 목적의 설정이 따로 있다.
SET hive.stats.fetch.partition.stats=true;
파티션 테이블의 통계를 메타스토어에서 가져올지 정한다. 켜면 계획 수립 시 파티션별 통계를 조회하므로 계획 품질이 좋아지지만, 파티션이 수만 개면 메타스토어 조회가 병목이 된다.
파티션 통계가 실제로 들어 있는지 본다.
DESCRIBE FORMATTED <db>.<table> PARTITION (<key>='<value>');
numRows · totalSize · rawDataSize 가 -1 이거나 비어 있으면 통계가 없는 것이다.
ANALYZE TABLE <db>.<table> COMPUTE STATISTICS;
ANALYZE TABLE <db>.<table> PARTITION (<key>) COMPUTE STATISTICS;
ANALYZE TABLE <db>.<table> COMPUTE STATISTICS FOR COLUMNS;
Spark 에서 쓰는 통계를 만들려면 Spark 쪽에서도 돌려 준다.
ANALYZE TABLE <db>.<table> COMPUTE STATISTICS NOSCAN;
INSERT 로 데이터를 넣은 뒤 통계가 갱신되지 않는다면 자동 수집 설정을 본다.
SET hive.stats.autogather=true;
Spark 로 쓴 데이터는 Hive 의 자동 수집 대상이 아니므로, 적재 파이프라인의 마지막에 ANALYZE 를 넣어 두는 편이 안전하다.