스파크 하드웨어 프로비저닝

스파크 하드웨어 프로비저닝

스파크 하드웨어를 어떻게 구성해야 하느냐는 개발자들이 가장 자주 받는 질문 중 하나예요. 상황마다 딱 맞는 하드웨어는 다르지만, 스파크 공식 문서는 스토리지, 로컬 디스크, 메모리, 네트워크, CPU 코어 관점에서 권장 사항을 제시해요. 이 페이지에서 그 권장안을 정리해서 알려드릴게요.

출처: Hardware Provisioning - Apache Spark 공식 문서

본문

스토리지 시스템

대부분의 스파크 잡은 외부 스토리지 시스템(예: Hadoop 파일 시스템, HBase)에서 입력 데이터를 읽을 것이므로, 그 시스템과 최대한 가까이 배치하는 게 중요해요. 아래처럼 권장해요.

  • 가능하면 HDFS와 같은 노드에서 스파크를 돌려요. 가장 간단한 방법은 같은 노드에 스파크 스탠드얼론 클러스터를 세우고, 스파크와 하둡의 메모리·CPU 사용이 서로 간섭하지 않게 설정하는 거예요. 하둡 쪽은 태스크당 메모리에 mapred.child.java.opts, 태스크 수에 mapreduce.tasktracker.map.tasks.maximummapreduce.tasktracker.reduce.tasks.maximum을 적용하면 돼요. 또는 Hadoop YARN 같은 공용 클러스터 매니저에서 하둡과 스파크를 함께 돌려도 돼요.
  • 이게 불가능하면 HDFS와 같은 로컬 영역 네트워크(LAN)의 다른 노드에서 스파크를 돌려요.
  • HBase 같은 저지연 데이터 스토어는 간섭을 피하려고 오히려 스토리지와 다른 노드에서 컴퓨팅 잡을 돌리는 게 더 좋을 수 있어요.

로컬 디스크

스파크는 메모리에서 컴퓨팅을 많이 하지만, RAM에 안 들어가는 데이터를 저장하고 스테이지 사이 중간 출력을 보존하는 데 여전히 로컬 디스크를 써요. 노드당 디스크 4~8개를 RAID 없이(그냥 별도 마운트 포인트로) 구성하는 걸 권장하고요, Linux라면 불필요한 쓰기를 줄이려고 noatime 옵션으로 마운트해요. 스파크에선 spark.local.dir 변수를 로컬 디스크들을 쉼표로 구분한 목록으로 설정해요. HDFS를 돌리고 있다면 HDFS와 같은 디스크를 써도 괜찮아요.

메모리

스파크는 일반적으로 머신당 8 GiB부터 수백 기가바이트 메모리까지 잘 돌아가요. 어떤 경우든 스파크에는 메모리의 최대 75%만 할당하는 걸 권장해요 — 나머지는 운영체제와 버퍼 캐시를 위해 남겨두는 거예요.

필요한 메모리 양은 애플리케이션에 따라 달라요. 특정 데이터 크기에 애플리케이션이 얼마나 쓰는지 알아보려면 데이터셋의 일부를 스파크 RDD에 로드하고, 스파크 모니터링 UI의 Storage 탭(http://<driver-node>:4040)에서 그 메모리 크기를 확인하면 돼요. 메모리 사용은 스토리지 레벨과 직렬화 포맷의 영향을 크게 받으니, 줄이는 팁은 튜닝 가이드를 참고하세요.

마지막으로, Java VM은 RAM이 200 GiB를 넘으면 잘 동작하지 않을 수 있어요. 이보다 많은 RAM을 가진 머신을 구매했다면 한 노드에서 익스큐터 여러 개를 띄우면 돼요. 스파크 스탠드얼론 모드에서 워커는 가용 메모리와 코어에 따라 여러 익스큐터를 실행하는 책임을 지고, 각 익스큐터는 별도 Java VM에서 실행돼요.

네트워크

경험상 데이터가 메모리에 있을 때 많은 스파크 애플리케이션은 네트워크 바운드예요. 10기가비트 이상 네트워크를 쓰는 게 이런 애플리케이션을 빠르게 만드는 가장 좋은 방법이에요. 특히 group-by, reduce-by, SQL 조인 같은 '분산 리듀스' 애플리케이션에서 두드러져요. 특정 애플리케이션에서 스파크가 네트워크로 얼마나 셔플하는지는 모니터링 UI(http://<driver-node>:4040)에서 볼 수 있어요.

CPU 코어

스파크는 스레드 간 공유를 최소화해서 머신당 수십 개 CPU 코어까지 잘 확장돼요. 머신당 최소 8~16코어는 준비하는 게 좋고, 워크로드의 CPU 비용에 따라 더 필요할 수도 있어요 — 데이터가 메모리에 들어가면 대부분 애플리케이션은 CPU 또는 네트워크 바운드가 되거든요.

더 알아보기