Skip to content

14.6 Spark(Hail) 접근 및 분석

Spark는 Slurm과 완전히 별개인 독립 클러스터이며, 본 환경에서는 Hail 전용으로 운영됩니다. 대규모 유전체 데이터를 분산 처리할 때 사용합니다.

Slurm과 혼동 금지

Spark 작업은 sbatch로 제출하지 않습니다. Slurm과 Spark는 별개 클러스터이므로, Hail 분석은 이 장의 방법으로 Spark에 직접 제출/실행합니다.

14.6.1 Spark 클러스터 접속 및 상태 확인

Hail을 실행하는 위치(드라이버)와 접속 방식은 환경에 따라 다릅니다. 운영팀이 제공한 Hail 호환 환경(전용 제출 노드 또는 사전 구성된 환경)을 사용하며, 정확한 진입 방법은 14.1 환경 변수 정보와 운영팀 안내를 따릅니다.

Spark 마스터/클러스터 상태는 Web UI로 확인합니다(폐쇄망 내부에서 접근).

http://${SPARK_MASTER_HOST}:${SPARK_UI_PORT}
  • 워커 수, 사용 가능한 코어/메모리, 실행 중인 애플리케이션을 확인할 수 있습니다.
  • 개별 작업의 진행 상황은 애플리케이션 UI(통상 드라이버의 4040 포트)에서 확인합니다.

📸 화면

<Spark Master Web UI - 워커/자원 현황 화면>

Hail/Spark/Java 버전은 건드리지 않음

Hail은 Spark·Java 버전에 민감합니다. 본 환경의 Spark는 Hail 전용으로 운영팀이 호환 버전을 맞춰 구성해 두었습니다. 사용자가 임의로 Spark나 Hail 버전을 바꾸거나 Spark에 패키지를 설치하지 마세요(이 점이 conda로 자유롭게 구성하는 Pod·Slurm과 다릅니다).

14.6.2 Hail 초기화

Hail 스크립트는 시작할 때 hl.init()으로 Spark에 연결합니다. 임시 디렉토리(tmp_dir)는 반드시 공유 스토리지로 지정해, 모든 워커가 동일 경로에 접근하도록 합니다.

python
import hail as hl

hl.init(
    master='spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}',  # 독립 Spark 마스터
    tmp_dir='${SCRATCH_DIR}/hail_tmp',     # 공유 스토리지의 임시 경로
    default_reference='GRCh38',            # 분석 대상에 맞게 설정
)

print(hl.version())

tmp_dir는 공유 스토리지로

tmp_dir를 로컬 경로로 두면 분산된 워커들이 서로 다른 디스크를 보게 되어 작업이 실패할 수 있습니다. 반드시 세 시스템에 동일하게 보이는 공유 스토리지 경로(${SCRATCH_DIR} 등)를 사용하세요.

14.6.3 Spark 자원 지정

실행 규모에 맞춰 executor 수·메모리·코어를 지정합니다. 지정 방법은 실행 방식(대화형 vs spark-submit)에 따라 다릅니다.

spark-submit 시 주요 옵션:

옵션의미
--master spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}연결할 독립 Spark 마스터
--executor-memory 8Gexecutor당 메모리
--executor-cores 4executor당 코어
--total-executor-cores 16작업이 점유할 총 코어 수(클러스터 공유 시 상한 역할)
--driver-memory 8G드라이버 메모리

자원 독점 주의

Spark 독립 클러스터는 기본적으로 한 애플리케이션이 가용 코어를 모두 가져갈 수 있습니다. 공유 환경에서는 --total-executor-cores상한을 명시하여 다른 사용자의 Hail 작업에 영향을 주지 않도록 주의해 주세요(14.8장 자원 사용 정책 및 에티켓).

14.6.4 Hail 작업 실행

대화형 실행

탐색·디버깅에는 대화형(IPython 등)에서 한 줄씩 실행합니다. 운영팀이 제공한 Hail 환경에서 Python을 띄우고 [14.6.2 Hail 초기화](#_14.6.2 Hail 초기화)의 hl.init() 후 작업합니다.

python
mt = hl.read_matrix_table('${PROJECT_DIR}/data/sample.mt')
mt.count()                      # (variants, samples)
mt.aggregate_rows(hl.agg.count())

📸 화면 캡처

<Hail 대화형 실행 - hl.init 및 count 출력>

배치 실행 (spark-submit)

확정된 분석은 스크립트로 만들어 spark-submit으로 제출합니다.

${WORK_DIR}/scripts/hail_job.py:

python
import hail as hl

hl.init(
    master='spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}',
    tmp_dir='${SCRATCH_DIR}/hail_tmp',
    default_reference='GRCh38',
)

# 입력 읽기 (공유 스토리지 경로)
mt = hl.import_vcf('${DATA_DIR}/cohort.vcf.bgz', force_bgz=True)

# 예시 처리: QC 및 필터
mt = hl.variant_qc(mt)
mt = mt.filter_rows(mt.variant_qc.AF[1] > 0.01)

# 결과 저장 (공유 스토리지에 MatrixTable로)
mt.write('${WORK_DIR}/results/cohort_filtered.mt', overwrite=True)

print('완료:', mt.count())
hl.stop()

제출:

bash
spark-submit \
  --master spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT} \
  --executor-memory 8G --executor-cores 4 --total-executor-cores 16 \
  --driver-memory 8G \
  ${WORK_DIR}/scripts/hail_job.py

14.6.5 작업 모니터링

  • Spark Master UI (http://${SPARK_MASTER_HOST}:${SPARK_UI_PORT}): 클러스터 전체 자원과 애플리케이션 목록
  • Application UI (드라이버 4040 포트): 실행 중인 작업의 스테이지/태스크 진행 상황
  • Hail 로그: 드라이버 실행 위치에 생성되는 hail*.log. 보존이 필요하면 공유 스토리지로 옮기세요.

14.6.6 공유 스토리지 입출력

  • 입력(VCF, MatrixTable 등)과 출력은 모두 공유 스토리지 경로(${DATA_DIR}, ${WORK_DIR}, ${PROJECT_DIR})로 지정합니다.
  • Hail의 MatrixTable/Table은 디렉토리 형태로 저장됩니다. 결과 경로가 이미 있으면 overwrite=True가 필요할 수 있습니다.
  • 결과를 Pod나 Slurm에서 이어서 처리할 때도 같은 경로를 그대로 사용하면 됩니다(복사 불필요).

보안 주의

  • 유전체 데이터는 민감정보입니다. 출력 경로·로그에 식별 가능한 정보가 노출되지 않도록 주의하세요.
  • 임시 산출물(tmp_dir)은 작업 후 정리하고, 결과의 망 외부 반출은 정해진 절차(별도 보안 교육)를 따릅니다.