더북(TheBook)

4.4.3 체크포인트로 RDD 계보 저장

 

변환 연산자를 계속 이어 붙이면 RDD 계보가 제약 없이 길어질 수 있다. 따라서 스파크는 전체 RDD를 안전한 스토리지에 보관할 수 있는 방법을 제공한다. RDD를 안전하게 보관하면 일부 노드에 장애가 발생해도 유실된 RDD 조각을 처음부터 다시 계산할 필요가 없다. 그 대신 스파크는 장애 발생 이전에 저장된 스냅샷을 사용해 이 지점부터 나머지 계보를 다시 계산한다. 이 기능을 체크포인팅(checkpointing)이라고 한다.

체크포인팅을 실행하면 스파크는 RDD의 모든 데이터를 디스크에 저장한다. 그러나 스파크는 단순히 캐시처럼 RDD의 데이터만 저장하는 것이 아니라 RDD의 계보까지 모두 저장한다. 체크포인팅을 완료한 후에는 저장한 RDD를 다시 계산할 필요가 없으므로 해당 RDD 의존 관계와 부모 RDD 정보를 삭제한다.

체크포인팅은 RDD의 checkpoint 메서드를 호출해 실행할 수 있다. 하지만 먼저 SparkContext.setCheckpointDir에 데이터를 저장할 디렉터리부터 지정해야 한다. 보통은 HDFS 디렉터리를 사용하지만 로컬 디스크로 설정할 수도 있다. checkpoint 메서드는 해당 RDD에 잡이 실행되기 전에 호출해야 하며, 그 이후 체크포인팅을 실제로 완료하려면 RDD에 행동 연산자 등을 호출해 잡을 실행하고 RDD를 구체화(materialize)해야 한다.

그렇다면 체크포인트는 언제 만들어야 할까? DAG가 길게 늘어진 RDD를 사용할 경우(즉, RDD에 의존 관계가 많은 경우) 노드에 장애가 발생했을 때 유실된 데이터를 복구하는 데 오랜 시간이 걸릴 수 있다. 다시 말해 지금까지 호출한 모든 (그리고 복잡한) 변환 연산자를 사용해 유실된 RDD를 처음부터 다시 계산하는 것보다는 체크포인트 파일에 저장해 둔 데이터를 읽어 들이는 편이 훨씬 더 빠를 수 있다. 또 체크포인팅은 6장에서 소개할 스파크 스트리밍에서도 중요한 역할을 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.