

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 di Amazon EMR 6.x
<a name="emr-spark-docker"></a>

**catatan**  
Prosedur yang dijelaskan hanya berfungsi dengan Amazon EMR versi 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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-docker.html).

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
<a name="emr-spark-docker-considerations"></a>

Saat Anda menjalankan Spark dengan Docker, pastikan prasyarat berikut terpenuhi:
+ Parameter `docker` dan CLI hanya diinstal pada node inti dan tugas.
+ Di Amazon EMR 6.1.0 dan yang lebih baru, Anda dapat menginstal Docker pada node utama dengan menggunakan perintah berikut.
  + 

    ```
    sudo yum install -y docker
    sudo systemctl start docker
    ```
+ `spark-submit`Perintah harus selalu dijalankan dari instance utama di cluster EMR Amazon.
+ 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\$1CONTAINER\$1RUNTIME\$1DOCKER\$1CLIENT\$1CONFIG= \$1DOCKER\$1CLIENT\$1CONFIG\$1PATH\$1ON\$1HDFS\$1
+ Di Amazon EMR 6.1.0 dan yang lebih baru, Anda tidak diharuskan menggunakan perintah yang terdaftar `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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-docker.html).

## Membuat gambar Docker
<a name="emr-spark-docker-image"></a>

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

**PySpark Dockerfile**

Gambar Docker yang dibuat dari Dockerfile ini termasuk Python 3 dan paket Python. NumPy 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"
```

**SparkR 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](https://docs.docker.com/engine/reference/builder/).

## Menggunakan gambar Docker dari Amazon ECR
<a name="emr-spark-docker-ECR"></a>

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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-docker.html#emr-docker-ECR). 

Untuk memastikan bahwa host EMR Amazon dapat mengakses gambar yang disimpan di Amazon ECR, klaster Anda harus memiliki izin dari `AmazonEC2ContainerRegistryReadOnly` kebijakan yang terkait dengan profil instans. Untuk informasi selengkapnya, lihat [Kebijakan `AmazonEC2ContainerRegistryReadOnly`](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr_managed_policies.html#AmazonEC2ContainerRegistryReadOnly).

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

```
[
  {
    "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": {}
  }
]
```

**Menggunakan PySpark dengan Amazon ECR**

Contoh berikut menggunakan PySpark Dockerfile, yang akan ditandai dan diunggah ke Amazon ECR. Setelah Anda mengunggah Dockerfile, Anda dapat menjalankan PySpark pekerjaan dan merujuk ke gambar Docker dari Amazon ECR.

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

Pertama, membuat direktori dan Dockerfile.

```
mkdir pyspark
vi pyspark/Dockerfile
```

Rekatkan konten PySpark Dockerfile dan jalankan perintah berikut untuk membuat image 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
```

Beri tag dan unggah gambar yang dibuat secara lokal ke ECR, ganti *123456789123.dkr.ecr.us-east-1.amazonaws.com* dengan titik akhir 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 terhubung ke node utama dan menyiapkan skrip Python dengan nama file. `main.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)
```

Di Amazon EMR 6.0.0, untuk mengirimkan pekerjaan, rujuk 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 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
```

Di Amazon EMR 6.1.0 dan yang lebih baru, untuk mengirimkan pekerjaan, rujuk 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 YARN, 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/
```

Beri tag dan unggah gambar yang dibuat secara lokal ke Amazon ECR, ganti *123456789123.dkr.ecr.us-east-1.amazonaws.com* dengan titik akhir 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 utama dan menyiapkan skrip 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()
```

Di Amazon 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
```

Di Amazon EMR 6.1.0 dan yang lebih baru, untuk mengirimkan pekerjaan, rujuk 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:
```