Apache Spark — 느린 잡의 답은 실행 계획과 이벤트 로그에 있다 · 파일로 쓰기 · 퀴즈
퀴즈: 파일로 쓰기
6문항. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
mode 를 지정하지 않고 이미 자료가 있는 경로에 DataFrame 을 썼다. 무슨 일이 일어나는가?
- 기존 파일 옆에 새 파일이 더해진다
- 기존 자료를 지우고 새로 쓴다
- 아무것도 하지 않고 조용히 끝난다
- 예외가 나고 아무것도 쓰지 않는다
날짜로 partitionBy 된 레이크에 하루치 행만 담은 DataFrame 을 mode("overwrite") 로 썼더니 다른 날짜가 모두 사라졌다. 원인은?
- partitionOverwriteMode 의 기본이 STATIC 이라 대상 경로의 파티션을 미리 지웠다
- overwrite 는 파티션된 경로에서는 언제나 append 로 바뀌기 때문이다
- maxRecordsPerFile 이 0 이라 파일이 하나로 합쳐지며 덮였다
- 커밋 알고리즘 1판이 _temporary 를 지우면서 옛 파일도 지웠다
셔플 뒤 200개 태스크가 모두 30일 치 자료를 조금씩 가진 채 partitionBy("day") 로 썼다. 파일 수를 날마다 하나로 줄이는 가장 알맞은 방법은?
- spark.sql.shuffle.partitions 를 30 으로 바꾼다
- maxRecordsPerFile 을 0 으로 두어 제한을 푼다
- 쓰기 전에 repartition("day") 로 같은 날을 한 태스크에 모은다
- partitionBy 대신 bucketBy 로 경로에 쓴다
spark.sql.files.maxRecordsPerFile 에 대한 설명으로 맞는 것은?
- 한 파일에 쓸 최대 레코드 수이고, 기본 0 은 제한이 없다는 뜻이다
- 한 태스크가 읽을 최대 레코드 수이고, 기본은 128MB 에 해당한다
- 한 파티션 디렉터리의 최대 파일 수이고, 기본은 200 개다
- 쓰기 전에 파일을 합치는 기준이고, 기본은 10,000 레코드다
출력 디렉터리에 _SUCCESS 파일이 있다는 것이 뜻하는 바로 가장 정확한 것은?
- 첫 번째 태스크가 성공해 나머지 태스크가 시작되었다
- 잡 커밋이 끝나 모든 태스크 출력이 최종 위치에 옮겨졌다
- 출력이 원자적으로 교체되어 옛 자료는 한 번도 지워지지 않았다
- 읽는 쪽이 이 디렉터리를 잠가 다른 잡이 쓰지 못한다
하루 단위로 다시 돌릴 수 있어야 하는 적재 잡이 가끔 중간에 실패해 재시도된다. 가장 안전한 쓰기 방식은?
- append 로 쓰고, 실패하면 사람이 중복을 찾아 지운다
- 경로 전체를 정적 overwrite 로 매번 새로 쓴다
- 그날 파티션만 동적 overwrite 로 다시 쓴다
- ignore 로 써서 이미 있으면 건너뛰게 한다