Spark용 Dataproc 컨테이너

Google Distributed Cloud (GDC) 에어 갭은 Spark용 Dataproc 컨테이너를 제공합니다. 데이터 처리를 위한 Apache Spark 환경입니다. Apache Spark에 대한 자세한 내용은 https://spark.apache.org/를 참고하세요. Spark용 Dataproc 컨테이너의 컨테이너를 사용하여 최소한의 변경으로 분산 클라우드 Kubernetes 클러스터 내에서 신규 또는 기존 Spark 애플리케이션을 실행합니다. Spark 도구에 익숙하다면 계속 사용해도 됩니다.

YAML 파일에 Spark 애플리케이션을 정의하면 Distributed Cloud에서 리소스를 할당합니다. Spark용 Dataproc 컨테이너가 몇 초 만에 시작됩니다. Spark 실행기는 필요에 따라 확장되거나 종료됩니다.

특수 하드웨어 노드 또는 GPU와 같은 특수 하드웨어를 사용하도록 Distributed Cloud의 Spark용 Dataproc 컨테이너에서 컨테이너를 구성합니다.

Spark용 Dataproc 컨테이너 서비스 배포

서비스를 사용하려면 플랫폼 관리자 (PA)가 Marketplace 서비스를 설치해야 합니다. Spark용 Dataproc 컨테이너가 필요한 경우 PA에 문의하세요. 자세한 내용은 GDC Marketplace 소프트웨어 패키지 설치를 참고하세요.

Spark 애플리케이션 실행을 위한 기본 요건

Spark용 Dataproc 컨테이너 서비스를 사용하려면 사용자 클러스터에 서비스 계정이 있어야 합니다. Spark용 Dataproc 컨테이너는 Spark 애플리케이션을 실행하기 위해 Spark 드라이버 포드를 만듭니다. Spark 드라이버 포드에는 다음 작업을 실행할 권한이 있는 포드의 네임스페이스에 Kubernetes 서비스 계정이 필요합니다.

  • 실행기 포드를 만들고, 가져오고, 나열하고, 삭제합니다.
  • 드라이버의 Kubernetes 헤드리스 서비스를 만듭니다.

Spark 애플리케이션을 실행하기 전에 다음 단계를 완료하여 foo 네임스페이스에 이전 권한이 있는 서비스 계정이 있는지 확인하세요.

  1. foo 네임스페이스에서 사용할 Spark 드라이버 포드의 서비스 계정을 만듭니다.

    kubectl create serviceaccount spark --kubeconfig AO_USER_KUBECONFIG --namespace=foo
    
  2. 실행기 포드를 만들고, 가져오고, 나열하고, 삭제하는 권한을 부여하는 역할을 만들고 foo 네임스페이스에서 드라이버의 Kubernetes 헤드리스 서비스를 만듭니다.

    kubectl create role spark-driver --kubeconfig AO_USER_KUBECONFIG --verb=* \
    --resource=pods,services,configmaps,persistentvolumeclaims \
    --namespace=foo
    
  3. foo 네임스페이스에서 서비스 계정 역할 액세스 권한을 부여하는 역할 결합을 만듭니다.

    kubectl create --kubeconfig AO_USER_KUBECONFIG \
    rolebinding spark-spark-driver \
    --role=spark-driver --serviceaccount=foo:spark \
    --namespace=foo
    

샘플 Spark 3 애플리케이션 실행

Spark 애플리케이션을 컨테이너화하면 Distributed Cloud를 사용하여 온프레미스에서 빅데이터 애플리케이션을 간편하게 실행할 수 있습니다. 애플리케이션 운영자(AO)로서 SparkApplication 커스텀 리소스 유형의 GKE 객체에 지정된 Spark 애플리케이션을 실행합니다.

Distributed Cloud에서 Apache Spark 3 애플리케이션을 실행하고 사용하려면 다음 단계를 완료하세요.

  1. 프로젝트에서 spark-operator 이미지를 검사하여 Spark 애플리케이션에서 참조할 $DATAPROC_IMAGE를 찾습니다.

    export DATAPROC_IMAGE=$(kubectl get pod --kubeconfig AO_USER_KUBECONFIG \
    --selector app.kubernetes.io/name=spark-operator -n foo \
    -o=jsonpath='{.items[*].spec.containers[0].image}' \
    | sed 's/spark-operator/dataproc/')
    

    예를 들면 다음과 같습니다.

    export DATAPROC_IMAGE=10.200.8.2:10443/dataproc-service/private-cloud-devel/dataproc:3.1-dataproc-17
    
  2. SparkApplication 사양을 작성하고 YAML 파일에 저장합니다. 자세한 내용은 Spark 애플리케이션 사양 작성 섹션을 참고하세요.

  3. kubectl 명령어를 사용하여 GKE 클러스터의 SparkApplication 사양에 구성된 대로 Spark 애플리케이션을 제출, 실행, 모니터링합니다. 자세한 내용은 애플리케이션 예시 섹션을 참고하세요.

  4. 애플리케이션 상태를 검토합니다.

  5. 선택사항: 애플리케이션 로그를 검토합니다. 자세한 내용은 Spark 3 애플리케이션의 로그 보기 섹션을 참고하세요.

  6. Spark 애플리케이션을 사용하여 드라이버와 실행자의 상태를 수집하고 사용자에게 표시합니다.

Spark 애플리케이션 사양 작성

SparkApplication 사양에는 다음 구성요소가 포함됩니다.

  • apiVersion 필드
  • kind 필드
  • metadata 필드
  • spec 섹션.

자세한 내용은 GitHub의 SparkApplication 사양 작성을 참고하세요. https://github.com/kubeflow/spark-operator/blob/gh-pages/docs/user-guide.md#writing-a-sparkapplication-spec

애플리케이션 예

이 섹션에는 Spark 애플리케이션을 실행하기 위한 해당 SparkApplication 사양과 함께 다음 예가 포함되어 있습니다.

Spark Pi

이 섹션에는 원에 다트를 던져 𝛑 (pi)를 추정하는 컴퓨팅 집약적인 Spark Pi 애플리케이션을 실행하는 예가 포함되어 있습니다.

다음 단계를 따라 Spark Pi를 실행하세요.

  1. 사용자 클러스터에 다음 SparkApplication 사양 예를 적용합니다.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: foo
    spec:
      type: Python
      pythonVersion: "3"
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/pi.py"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  2. 다음 명령어를 사용하여 SparkApplication 사양 예시가 1~2분 내에 실행되고 완료되는지 확인합니다.

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-pi -n foo
    
  3. 드라이버 로그를 확인하여 결과를 확인합니다.

    kubectl --kubeconfig AO_USER_KUBECONFIG logs spark-pi-driver -n foo | grep "Pi is roughly"
    

    출력은 다음과 비슷합니다.

    Pi is roughly 3.1407357036785184
    

자세한 내용은 다음 리소스를 참조하세요.

  • 애플리케이션 코드의 경우 Apache Spark 문서의 Pi estimation(https://spark.apache.org/examples.html)을 참고하세요.
  • 샘플 Spark Pi YAML 파일은 Spark 애플리케이션 사양 작성을 참고하세요.

Spark SQL

다음 단계를 따라 Spark SQL을 실행하세요.

  1. 1 값을 선택하는 Spark SQL 애플리케이션을 실행하려면 다음 쿼리를 사용하세요.

    select 1;
    
  2. 사용자 클러스터에 다음 SparkApplication 사양 예시를 적용합니다.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: pyspark-sql-arrow
      namespace: foo
    spec:
      type: Python
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/python/sql/arrow.py"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 다음 명령어를 사용하여 SparkApplication 사양 예시가 1분 이내에 실행되고 완료되는지 확인합니다.

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication pyspark-sql-arrow -n foo
    

Spark MLlib

다음 단계를 따라 Spark MLlib을 실행하세요.

  1. 다음 Scala 예시를 사용하여 통계 분석을 실행하고 결과를 콘솔에 출력하는 Spark MLlib 인스턴스를 실행합니다.

    import org.apache.spark.ml.linalg.{Matrix, Vectors}
    import org.apache.spark.ml.stat.Correlation
    import org.apache.spark.sql.Row
    
    val data = Seq(
      Vectors.sparse(4, Seq((0, 1.0), (3, -2.0))),
      Vectors.dense(4.0, 5.0, 0.0, 3.0),
      Vectors.dense(6.0, 7.0, 0.0, 8.0),
      Vectors.sparse(4, Seq((0, 9.0), (3, 1.0)))
    )
    
    val df = data.map(Tuple1.apply).toDF("features")
    val Row(coeff1: Matrix) = Correlation.corr(df, "features").head
    println(s"Pearson correlation matrix:\n $coeff1")
    
    val Row(coeff2: Matrix) = Correlation.corr(df, "features", "spearman").head
    println(s"Spearman correlation matrix:\n $coeff2")
    
  2. 사용자 클러스터에 다음 SparkApplication 사양 예를 적용합니다.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-ml
      namespace: foo
    spec:
      type: Scala
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: IfNotPresent
      mainClass: org.apache.spark.examples.ml.SummarizerExample
      mainApplicationFile: "local:///usr/lib/spark/examples/jars/spark-examples_2.12-3.1.3.jar"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 다음 명령어를 사용하여 SparkApplication 사양 예시가 1분 이내에 실행되고 완료되는지 확인합니다.

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-ml -n foo
    

SparkR

다음 단계를 따라 SparkR을 실행하세요.

  1. 다음 예시 코드를 사용하여 번들로 제공되는 데이터 세트를 로드하고 첫 번째 줄을 출력하는 SparkR 인스턴스를 실행합니다.

    library(SparkR)
    sparkR.session()
    df <- as.DataFrame(faithful)
    head(df)
    
  2. 사용자 클러스터에 다음 SparkApplication 사양 예시를 적용합니다.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-r-dataframe
      namespace: foo
    spec:
      type: R
      mode: cluster
      image: "${DATAPROC_IMAGE?}"
      imagePullPolicy: Always
      mainApplicationFile: "local:///usr/lib/spark/examples/src/main/r/dataframe.R"
      sparkVersion: "3.1.3"
      restartPolicy:
        type: Never
      driver:
        cores: 1
        coreLimit: "1000m"
        memory: "512m"
        serviceAccount: spark
      executor:
        cores: 1
        instances: 1
        memory: "512m"
    
  3. 다음 명령어를 사용하여 SparkApplication 사양 예시가 1분 이내에 실행되고 완료되는지 확인합니다.

    kubectl --kubeconfig AO_USER_KUBECONFIG get SparkApplication spark-r-dataframe -n foo
    

Spark 3 애플리케이션의 로그 보기

Spark에는 시각화할 수 있는 다음 두 가지 로그 유형이 있습니다.

터미널을 사용하여 명령어를 실행합니다.

드라이버 로그

다음 단계를 따라 Spark 애플리케이션의 드라이버 로그를 확인하세요.

  1. Spark 드라이버 포드를 찾습니다.

    kubectl -n spark get pods
    
  2. Spark 드라이버 포드의 로그를 엽니다.

    kubectl -n spark logs DRIVER_POD
    

    DRIVER_POD을 이전 단계에서 찾은 Spark 드라이버 포드의 이름으로 바꿉니다.

이벤트 로그

SparkApplication 사양의 YAML 파일에 지정된 경로에서 이벤트 로그를 확인할 수 있습니다.

다음 단계를 따라 Spark 애플리케이션의 이벤트 로그를 확인하세요.

  1. SparkApplication 사양의 YAML 파일을 엽니다.
  2. 파일에서 spec 필드를 찾습니다.
  3. spec 필드에 중첩된 sparkConf 필드를 찾습니다.
  4. sparkConf 섹션에 중첩된 spark.eventLog.dir 필드의 값을 찾습니다.
  5. 경로를 열어 이벤트 로그를 확인합니다.

SparkApplication 사양의 샘플 YAML 파일을 보려면 Spark 애플리케이션 사양 작성을 참고하세요.

자세한 내용은 계정 관리자에게 문의하세요.