Impala 는 메모리에서 처리하는 것을 원칙으로 하되, 쿼리가 MEM_LIMIT 을 넘길 상황이면 중간 결과를 디스크로 흘린다. 이때 쓰는 경로가 scratch 디렉터리다.
스필이 발생하는 전형적인 연산은 해시 조인의 빌드 측, 대규모 GROUP BY 집계, ORDER BY 정렬, 분석 함수다. scratch 사용량이 갑자기 늘었다면 셋 중 하나가 커졌거나, MEM_LIMIT 이 낮게 잡혀 평소 메모리에서 끝나던 쿼리가 흘러넘치기 시작한 것이다.
impalad 플래그로 지정한다. Cloudera Manager 에서는 Impala Daemon Scratch Directories 항목이다.
--scratch_dirs=/data1/impala/scratch,/data2/impala/scratch
여러 디스크를 나열하면 분산해서 쓴다. 데이터 디스크와 같은 스핀들을 쓰면 스캔 성능까지 함께 떨어지므로 가능하면 분리한다.
경로별 용량 상한을 붙일 수 있는 버전이 있다. 지원 형식은 배포판 문서로 확인한다.
Could not create files in any configured scratch directories
디렉터리가 없거나 impala 계정이 쓸 수 없는 경우다. 모든 impalad 호스트에 디렉터리가 있어야 한다. 한 대만 빠져 있어도 그 노드에 fragment 가 배치될 때 실패한다.
# 모든 impalad 호스트에서
sudo mkdir -p /data1/impala/scratch
sudo chown impala:impala /data1/impala/scratch
sudo chmod 700 /data1/impala/scratch
df -h /data1
디스크가 가득 차도 같은 오류가 난다. 오래된 스크래치 파일이 남아 있다면 impalad 가 비정상 종료된 흔적이다. 서비스가 내려간 상태에서만 정리한다.
스필 자체는 실패보다 낫지만, 잦다면 계획을 손보는 편이 낫다. 통계를 채워 조인 순서를 바로잡고, 조인 전에 불필요한 행·컬럼을 걸러내고, 파티션 프루닝이 걸리게 조건을 쓴다. 그래도 남는 큰 집계는 MEM_LIMIT 을 올려 메모리 안에서 끝내는 쪽이 전체적으로 빠르다.