Amazon 6.x에서 Docker를 사용하여 Spark 애플리케이션을 실행합니다. EMR - 아마존 EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon 6.x에서 Docker를 사용하여 Spark 애플리케이션을 실행합니다. EMR

Amazon EMR 6.0.0에서는 Spark 애플리케이션이 클러스터의 개별 Amazon EC2 인스턴스에 종속성을 설치하는 대신 Docker 컨테이너를 사용하여 라이브러리 종속성을 정의할 수 있습니다. 도커로 Spark를 실행하려면 먼저 도커 레지스트리를 구성하고 Spark 애플리케이션을 제출할 때 추가 파라미터를 정의해야 합니다. 자세한 내용은 Docker 통합 구성을 참조하세요.

애플리케이션이 제출되면 Docker를 YARN 호출하여 지정된 Docker 이미지를 가져와서 Docker 컨테이너 내에서 Spark 애플리케이션을 실행합니다. 이를 통해 종속 항목을 쉽게 정의하고 분리할 수 있습니다. 이를 통해 작업 실행에 필요한 라이브러리를 사용하여 Amazon EMR 클러스터의 인스턴스를 부트스트래핑하거나 준비하는 시간을 줄일 수 있습니다.

Docker에서 Spark를 실행할 때의 고려 사항

도커로 Spark를 실행하기 전에 다음 사전 요구 사항을 충족하는지 확인하세요.

  • docker패키지는 코어 및 태스크 노드에만 CLI 설치됩니다.

  • Amazon EMR 6.1.0 이상에서는 다음 명령을 사용하여 기본 노드에 Docker를 설치할 수도 있습니다.

    • sudo yum install -y docker sudo systemctl start docker
  • spark-submit명령은 항상 Amazon EMR 클러스터의 기본 인스턴스에서 실행되어야 합니다.

  • Docker 이미지를 확인하는 데 사용되는 Docker 레지스트리는 클러스터를 시작할 때 추가 파라미터를 정의하는 container-executor 분류 키와 API 함께 분류를 사용하여 정의해야 합니다.

    • docker.trusted.registries

    • docker.privileged-containers.registries

  • 도커 컨테이너에서 Spark 애플리케이션을 실행하려면 다음 구성 옵션이 필요합니다.

    • YARN_CONTAINER_RUNTIME_TYPE=docker

    • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

  • ECRAmazon을 사용하여 Docker 이미지를 검색하는 경우 클러스터를 구성하여 자체적으로 인증해야 합니다. 이렇게 하려면 다음 구성 옵션을 사용해야 합니다.

    • YARN_ _ CONTAINER _ RUNTIME _ DOCKER _ CONFIG = {CLIENT_ _ DOCKER _ CLIENT CONFIG _ON_PATH} HDFS

  • Amazon EMR 6.1.0 이상에서는 ECR 자동 인증 기능이 활성화되어 YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS} 있을 때 나열된 명령을 사용할 필요가 없습니다.

  • Spark와 함께 사용되는 모든 도커 이미지에는 Java가 설치되어 있어야 합니다.

필수 조건에 대한 자세한 내용은 Docker 통합 구성을 참조하세요.

도커 이미지 생성

도커 이미지는 이미지에 포함할 패키지와 구성을 정의하는 Dockerfile을 사용하여 생성됩니다. 다음은 Dockerfile에서 SparkR을 사용하는 두 가지 예제입니다. PySpark

PySpark 도커파일

이 도커파일에서 생성된 도커 이미지에는 Python 3과 Python 패키지가 포함됩니다. NumPy 이 도커파일은 아마존 리눅스 2와 아마존 코레토 8을 사용합니다. JDK

FROM amazoncorretto:8 RUN yum -y update RUN yum -y install yum-utils RUN yum -y groupinstall development RUN yum list python3* RUN yum -y install python3 python3-dev python3-pip python3-virtualenv RUN python -V RUN python3 -V ENV PYSPARK_DRIVER_PYTHON python3 ENV PYSPARK_PYTHON python3 RUN pip3 install --upgrade pip RUN pip3 install numpy pandas RUN python3 -c "import numpy as np"

SparkR Dockerfile

이 Dockerfile에서 생성된 Docker 이미지에는 R 및 패키지가 포함됩니다. randomForest CRAN 이 도커파일에는 아마존 리눅스 2와 아마존 코레토 8이 포함되어 있습니다. JDK

FROM amazoncorretto:8 RUN java -version RUN yum -y update RUN amazon-linux-extras install R4 RUN yum -y install curl hostname #setup R configs RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile RUN Rscript -e "install.packages('randomForest')"

Dockerfile 구문에 대한 자세한 내용은 Dockerfile 참조 설명서를 참조하십시오.

아마존의 도커 이미지 사용 ECR

Amazon Elastic 컨테이너 레지스트리 (AmazonECR) 는 완전히 관리되는 Docker 컨테이너 레지스트리로, Docker 컨테이너 이미지를 쉽게 저장, 관리 및 배포할 수 있습니다. ECRAmazon을 사용하는 경우 클러스터는 인스턴스를 신뢰하도록 구성되어야 하며ECR, 클러스터가 ECR Amazon의 Docker 이미지를 사용하도록 인증을 구성해야 합니다. 자세한 내용은 YARNAmazon에 액세스하기 위한 구성을 참조하십시오ECR.

Amazon EMR 호스트가 Amazon에 저장된 이미지에 액세스할 수 있으려면 클러스터에 인스턴스 프로필과 연결된 AmazonEC2ContainerRegistryReadOnly 정책의 권한이 있어야 합니다. ECR 자세한 내용은 AmazonEC2ContainerRegistryReadOnly 정책을 참조하십시오.

이 예시에서는 Amazon ECR 레지스트리를 신뢰할 수 있도록 다음과 같은 추가 구성으로 클러스터를 생성해야 합니다. 교체하십시오.123456789123.dkr.ecr.us-east-1.amazonaws.com Amazon 엔드포인트가 있는 ECR 엔드포인트

[ { "Classification": "container-executor", "Configurations": [ { "Classification": "docker", "Properties": { "docker.privileged-containers.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com", "docker.trusted.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com" } } ], "Properties": {} } ]

PySpark 아마존과 함께 사용 ECR

다음 예시에서는 태그가 지정되어 Amazon에 업로드되는 PySpark Dockerfile을 사용합니다. ECR Dockerfile을 업로드한 후 PySpark 작업을 실행하고 Amazon의 Docker 이미지를 참조할 수 있습니다. ECR

클러스터를 시작한 후 를 사용하여 SSH 코어 노드에 연결하고 다음 명령을 실행하여 Dockerfile 예제에서 로컬 Docker 이미지를 빌드합니다. PySpark

먼저 디렉터리와 Dockerfile을 만듭니다.

mkdir pyspark vi pyspark/Dockerfile

PySpark Dockerfile의 내용을 붙여넣고 다음 명령을 실행하여 Docker 이미지를 빌드합니다.

sudo docker build -t local/pyspark-example pyspark/

예제를 위한 emr-docker-examples ECR 리포지토리를 생성합니다.

aws ecr create-repository --repository-name emr-docker-examples

로컬에서 빌드한 이미지에 태그를 지정하고 업로드하고ECR, 교체합니다.123456789123.dkr.ecr.us-east-1.amazonaws.com ECR엔드포인트와 함께.

sudo docker tag local/pyspark-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example

기본 SSH 노드에 연결하고 파일 이름으로 main.py Python 스크립트를 준비하는 데 사용합니다. 다음 내용을 main.py 파일에 붙여 넣고 저장합니다.

from pyspark.sql import SparkSession spark = SparkSession.builder.appName("docker-numpy").getOrCreate() sc = spark.sparkContext import numpy as np a = np.arange(15).reshape(3, 5) print(a)

Amazon EMR 6.0.0에서 작업을 제출하려면 Docker 이미지의 이름을 참조하십시오. 추가 구성 파라미터를 정의하여 작업 실행에 Docker가 런타임으로 사용되도록 합니다. Amazon을 사용할 ECR 때는 Amazon 인증에 사용되는 자격 증명이 포함된 config.json 파일을 YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG 참조해야 합니다. ECR

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --num-executors 2 \ main.py -v

Amazon EMR 6.1.0 이상에서는 작업을 제출하려면 Docker 이미지의 이름을 참조하십시오. ECR자동 인증이 활성화되면 다음 명령을 실행합니다.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --num-executors 2 \ main.py -v

작업이 완료되면 YARN 애플리케이션 ID를 기록하고 다음 명령을 사용하여 PySpark 작업의 출력을 얻으십시오.

yarn logs --applicationId application_id | grep -C2 '\[\[' LogLength:55 LogContents: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]

아마존에서 SparkR 사용하기 ECR

다음 예제에서는 태그가 지정되어 업로드되는 SparkR Dockerfile을 사용합니다. ECR Dockerfile이 업로드되면 SparkR 작업을 실행하고 Amazon의 Docker 이미지를 참조할 수 있습니다. ECR

클러스터를 시작한 후 SSH 를 사용하여 코어 노드에 연결하고 다음 명령을 실행하여 SparkR Dockerfile 예제에서 로컬 Docker 이미지를 빌드합니다.

먼저 디렉터리와 Dockerfile을 만듭니다.

mkdir sparkr vi sparkr/Dockerfile

SparkR Dockerfile의 내용을 붙여 넣고 다음 명령을 실행하여 도커 이미지를 빌드합니다.

sudo docker build -t local/sparkr-example sparkr/

로컬에서 빌드한 이미지에 태그를 지정하고 ECR Amazon에 업로드하여 교체합니다.123456789123.dkr.ecr.us-east-1.amazonaws.com Amazon ECR 엔드포인트와 함께

sudo docker tag local/sparkr-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example

기본 SSH 노드에 연결하고 이름을 사용하여 R 스크립트를 준비하는 데 사용합니다sparkR.R. 다음 내용을 sparkR.R 파일에 붙여 넣습니다.

library(SparkR) sparkR.session(appName = "R with Spark example", sparkConfig = list(spark.some.config.option = "some-value")) sqlContext <- sparkRSQL.init(spark.sparkContext) library(randomForest) # check release notes of randomForest rfNews() sparkR.session.stop()

Amazon EMR 6.0.0에서 작업을 제출하려면 Docker 이미지의 이름을 참조하십시오. 추가 구성 파라미터를 정의하여 작업 실행에 Docker가 런타임으로 사용되도록 합니다. ECRAmazon을 사용할 때는 인증에 사용되는 자격 증명이 들어 있는 config.json 파일을 YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG 참조해야 합니다. ECR

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ sparkR.R

Amazon EMR 6.1.0 이상에서는 작업을 제출하려면 Docker 이미지의 이름을 참조하십시오. ECR자동 인증이 활성화되면 다음 명령을 실행합니다.

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ sparkR.R

작업이 완료되면 YARN 애플리케이션 ID를 기록하고 다음 명령을 사용하여 SparkR 작업의 출력을 가져옵니다. 이 예제에는 randomForest 라이브러리, 설치된 버전 및 릴리스 노트를 사용할 수 있는지 확인하기 위한 테스트가 포함됩니다.

yarn logs --applicationId application_id | grep -B4 -A10 "Type rfNews" randomForest 4.6-14 Type rfNews() to see new features/changes/bug fixes. Wishlist (formerly TODO): * Implement the new scheme of handling classwt in classification. * Use more compact storage of proximity matrix. * Allow case weights by using the weights in sampling? ======================================================================== Changes in 4.6-14: