Jalankan aplikasi Spark dengan Docker menggunakan Amazon EMR 6.x - Amazon EMR

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Jalankan aplikasi Spark dengan Docker menggunakan Amazon EMR 6.x

Dengan Amazon EMR 6.0.0, aplikasi Spark dapat menggunakan wadah Docker untuk menentukan dependensi perpustakaan mereka, bukannya menginstal dependensi pada contoh Amazon EC2 individu dalam cluster. Untuk menjalankan Spark dengan Docker, Anda harus terlebih dahulu mengkonfigurasi registri Docker dan menentukan parameter tambahan saat mengirimkan aplikasi Spark. Untuk informasi lebih lanjut, lihat Mengkonfigurasi integrasi Docker.

Ketika aplikasi diajukan, YARN memanggil Docker untuk menarik gambar Docker ditentukan dan menjalankan aplikasi Spark dalam wadah Docker. Hal ini memungkinkan Anda untuk dengan mudah menentukan dan mengisolasi dependensi. Hal ini mengurangi waktu untuk bootstrap atau menyiapkan instans di kluster Amazon EMR dengan pustaka yang dibutuhkan untuk eksekusi tugas.

Pertimbangan saat menjalankan Spark dengan Docker

Saat menjalankan Spark dengan Docker, pastikan prasyarat berikut terpenuhi:

  • Parameter docker dan CLI hanya diinstal pada node inti dan tugas.

  • Pada Amazon EMR 6.1.0 dan kemudian, Anda alternatif dapat menginstal Docker pada node master dengan menggunakan perintah berikut.

    • sudo yum install -y docker sudo systemctl start docker
  • Parameter spark-submit perintah harus selalu dijalankan dari contoh master di kluster Amazon EMR.

  • Registries Docker yang digunakan untuk menyelesaikan gambar Docker harus didefinisikan menggunakan API Klasifikasi dengan container-executor kunci klasifikasi untuk menentukan parameter tambahan saat meluncurkan cluster:

    • docker.trusted.registries

    • docker.privileged-containers.registries

  • Untuk menjalankan aplikasi Spark dalam wadah Docker, pilihan konfigurasi berikut diperlukan:

    • YARN_CONTAINER_RUNTIME_TYPE=docker

    • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

  • Bila menggunakan Amazon ECR untuk mengambil gambar Docker, Anda harus mengkonfigurasi cluster untuk mengotentikasi sendiri. Untuk melakukannya, Anda harus menggunakan opsi konfigurasi berikut:

    • YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG= {DOCKER_CLIENT_CONFIG_PATH_ON_HDFS}

  • Di EMR 6.1.0 dan kemudian, Anda tidak diharuskan untuk menggunakan perintah yang tercantum YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS} saat fitur autentikasi otomatis ECR diaktifkan.

  • Setiap gambar Docker digunakan dengan Spark harus memiliki Java diinstal pada gambar Docker.

Untuk informasi selengkapnya tentang prasyarat, lihat prasyarat, lihat. Mengkonfigurasi integrasi Docker.

Membuat gambar Docker

Docker gambar dibuat menggunakan Dockerfile, yang mendefinisikan paket dan konfigurasi untuk memasukkan dalam gambar. Berikut dua contoh Dockerfiles menggunakan PySpark dan SparkR.

PySpark Dockerfile

Docker gambar dibuat dari Dockerfile ini termasuk Python 3 dan paket NumPy Python. Amazon Corretto JDK 8 menggunakan Amazon Linux 2.

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"

Dockerfile

Docker gambar yang dibuat dari Dockerfile ini termasuk R dan paket randomForest CRAN. Dockerfile ini termasuk Amazon Linux 2 dan Amazon Corretto JDK 8.

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')"

Untuk informasi selengkapnya tentang sintaks Dockerfile, lihat bagian Dokumentasi referensi berkas docker.

Menggunakan gambar Docker dari Amazon ECR

Amazon Elastic Container Registry (Amazon ECR) adalah registri kontainer Docker sepenuhnya dikelola, yang membuatnya mudah untuk menyimpan, mengelola, dan menyebarkan gambar kontainer Docker. Bila menggunakan Amazon ECR, cluster harus dikonfigurasi untuk mempercayai contoh ECR, dan Anda harus mengkonfigurasi otentikasi agar cluster menggunakan gambar Docker dari Amazon ECR. Untuk informasi lebih lanjut, lihat Mengkonfigurasi BEARN untuk mengakses Amazon ECR.

Untuk memastikan bahwa host EMR dapat mengakses gambar yang disimpan di Amazon ECR, cluster Anda harus memiliki izin dari AmazonEC2ContainerRegistryReadOnly kebijakan yang terkait dengan profil instance. Untuk informasi selengkapnya, lihat Kebijakan AmazonEC2ContainerRegistryReadOnly.

Dalam contoh ini, cluster harus dibuat dengan konfigurasi tambahan berikut untuk memastikan bahwa registri Amazon ECR dipercaya. Ganti 123456789123.dkr.us-east-1.amazonaws.com endpoint dengan endpoint Amazon ECR Anda.

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

Menggunakan PySpark dengan Amazon ECR

Contoh berikut menggunakan PySpark Dockerfile, yang akan ditandai dan upload ke Amazon ECR. Setelah Dockerfile di-upload, Anda dapat menjalankan PySpark pekerjaan dan merujuk pada gambar Docker dari Amazon ECR.

Setelah Anda meluncurkan cluster, menggunakan SSH untuk terhubung ke node inti dan jalankan perintah berikut untuk membangun gambar Docker lokal dari contoh PySpark Dockerfile.

Pertama, membuat direktori dan Dockerfile.

mkdir pyspark vi pyspark/Dockerfile

Paste isi PySpark Dockerfile dan jalankan perintah berikut untuk membangun gambar Docker.

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

Buat emr-docker-examples Repositori ECR untuk contoh.

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

Tandai dan unggah gambar yang dibangun secara lokal ke ECR, menggantikan123456789123.dkr.us-east-1.amazonaws.comdengan endpoint ECR Anda.

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

Gunakan SSH untuk menghubungkan ke node master dan mempersiapkan script Python dengan nama filemain.py. Tempelkan konten berikut ke file main.py dan simpan.

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)

Pada EMR 6.0.0, untuk mengirimkan pekerjaan, referensi nama Docker gambar. Tentukan parameter konfigurasi tambahan untuk memastikan bahwa eksekusi pekerjaan menggunakan Docker sebagai runtime. Saat menggunakan Amazon ECR, YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG harus mereferensi config.json file yang berisi mandat yang digunakan untuk mengotentikasi ke Amazon 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

Pada EMR 6.1.0 dan kemudian, untuk mengirimkan pekerjaan, referensi nama gambar Docker. Jika autentikasi otomatis ECR diaktifkan, jalankan perintah berikut.

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

Ketika pekerjaan selesai, perhatikan ID aplikasi BENAR, dan gunakan perintah berikut untuk mendapatkan output dari PySpark pekerjaan.

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]]

Menggunakan SparkR dengan Amazon ECR

Contoh berikut menggunakan SparkR Dockerfile, yang akan ditandai dan upload ke ECR. Setelah Dockerfile di-upload, Anda dapat menjalankan pekerjaan SparkR dan merujuk pada gambar Docker dari Amazon ECR.

Setelah Anda meluncurkan cluster, menggunakan SSH untuk terhubung ke node inti dan jalankan perintah berikut untuk membangun gambar Docker lokal dari contoh SparkR Dockerfile.

Pertama, buat direktori dan Dockerfile.

mkdir sparkr vi sparkr/Dockerfile

Paste isi dari SparkR Dockerfile dan jalankan perintah berikut untuk membangun gambar Docker.

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

Tag dan upload gambar yang dibangun secara lokal ke Amazon ECR, menggantikan123456789123.dkr.us-east-1.amazonaws.comdengan endpoint Amazon ECR Anda.

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

Gunakan SSH untuk terhubung ke node master dan mempersiapkan script R dengan nama sparkR.R. Tambahkan konten berikut ini ke file 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()

Pada EMR 6.0.0, untuk mengirimkan pekerjaan, lihat nama gambar Docker. Tentukan parameter konfigurasi tambahan untuk memastikan bahwa eksekusi pekerjaan menggunakan Docker sebagai runtime. Saat menggunakan Amazon ECR, YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG harus mengacu pada config.json file yang berisi mandat yang digunakan untuk mengotentikasi ke 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

Pada EMR 6.1.0 dan kemudian, untuk mengirimkan pekerjaan, referensi nama gambar Docker. Ketika otentikasi otomatis ECR diaktifkan, jalankan perintah berikut.

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

Ketika pekerjaan telah selesai, perhatikan ID aplikasi BENAR, dan gunakan perintah berikut untuk mendapatkan output dari pekerjaan SparkR. Contoh ini mencakup pengujian untuk memastikan bahwa randomForest perpustakaan, versi diinstal, dan rilis catatan tersedia.

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: