

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

# Cara menyesuaikan gambar Docker
<a name="docker-custom-images-steps"></a>

Ikuti langkah-langkah ini untuk menyesuaikan gambar Docker untuk Amazon EMR di EKS. Langkah-langkah menunjukkan cara mendapatkan gambar dasar, menyesuaikan dan mempublikasikannya, dan mengirimkan beban kerja menggunakan gambar.
+ [Prasyarat](#docker-custom-images-prereq)
+ [Langkah 1: Ambil gambar dasar dari Amazon Elastic Container Registry (Amazon ECR)](#docker-custom-images-retrieve)
+ [Langkah 2: Sesuaikan gambar dasar](#docker-custom-images-customize)
+ [Langkah 3: (Opsional tapi disarankan) Validasi gambar kustom](#docker-custom-images-validate)
+ [Langkah 4: Publikasikan gambar khusus](#docker-custom-images-publish)
+ [Langkah 5: Kirim beban kerja Spark di Amazon EMR menggunakan gambar khusus](#docker-custom-images-submit)

**catatan**  
Opsi lain yang mungkin ingin Anda pertimbangkan saat menyesuaikan gambar Docker adalah menyesuaikan untuk titik akhir interaktif, yang Anda lakukan untuk memastikan Anda memiliki dependensi yang diperlukan, atau menggunakan gambar wadah multi-arsitektur:  
[Sesuaikan gambar Docker untuk titik akhir interaktif](docker-custom-images-managed-endpoint.md)
[Bekerja dengan gambar multi-arsitektur](docker-custom-images-multi-architecture.md)

## Prasyarat
<a name="docker-custom-images-prereq"></a>
+ Selesaikan [Menyiapkan Amazon EMR di EKS](setting-up.md) langkah-langkah untuk Amazon EMR di EKS. 
+ Instal Docker di lingkungan Anda. Untuk informasi lebih lanjut, lihat [Get Docker](https://docs.docker.com/get-docker/).

## Langkah 1: Ambil gambar dasar dari Amazon Elastic Container Registry (Amazon ECR)
<a name="docker-custom-images-retrieve"></a>

Gambar dasar berisi runtime Amazon EMR dan konektor yang digunakan untuk mengakses layanan lain. AWS Untuk Amazon EMR 6.9.0 dan yang lebih tinggi, Anda bisa mendapatkan gambar dasar dari Galeri Publik Amazon ECR. Jelajahi galeri untuk menemukan tautan gambar dan tarik gambar ke ruang kerja lokal Anda. Misalnya, untuk rilis Amazon EMR 7.12.0, `docker pull` perintah berikut memberi Anda gambar dasar standar terbaru. Anda dapat mengganti `emr-7.12.0:latest` dengan `emr-7.12.0-spark-rapids:latest` untuk mengambil gambar yang memiliki akselerator Nvidia RAPIDS. Anda juga dapat mengganti `emr-7.12.0:latest` dengan `emr-7.12.0-java11:latest` untuk mengambil gambar dengan runtime Java 11.

```
docker pull public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest
```

Jika Anda ingin mengambil gambar dasar untuk Amazon EMR 6.9.0 atau rilis ealier, atau jika Anda lebih suka mengambil dari akun registri Amazon ECR di setiap Wilayah, gunakan langkah-langkah berikut:

1. Pilih URI gambar dasar. URI gambar mengikuti format ini, `ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag`, seperti yang ditunjukkan contoh berikut.

   ```
   895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   ```

   Untuk memilih gambar dasar di Wilayah Anda, lihat [Detail untuk memilih URI gambar dasar](docker-custom-images-tag.md). 

1. Masuk ke repositori Amazon ECR di mana gambar dasar disimpan. Ganti *895885662937* dan *us-west-2* dengan akun registri Amazon ECR dan AWS Wilayah yang telah Anda pilih. 

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
   ```

1. Tarik gambar dasar ke Workspace lokal Anda. Ganti *emr-6.6.0:latest* dengan tag gambar kontainer yang telah Anda pilih.

   ```
   docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   ```

## Langkah 2: Sesuaikan gambar dasar
<a name="docker-custom-images-customize"></a>

Ikuti langkah-langkah ini untuk menyesuaikan gambar dasar yang telah Anda tarik dari Amazon ECR. 

1. Buat `Dockerfile` baru di Workspace lokal Anda.

1. Edit `Dockerfile` yang baru saja Anda buat dan tambahkan konten berikut. `Dockerfile` ini menggunakan gambar kontainer yang telah Anda tarik dari `895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest`. 

   ```
   FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
   ### Add customization commands here ####
   USER hadoop:hadoop
   ```

1. Tambahkan perintah di `Dockerfile` untuk menyesuaikan gambar dasar. Sebagai contoh, tambahkan perintah untuk menginstal pustaka Python, seperti yang ditunjukkan `Dockerfile` berikut. 

   ```
   FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
   RUN pip3 install --upgrade boto3 pandas numpy // For python 3
   USER hadoop:hadoop
   ```

1. Dari direktori yang sama di mana `Dockerfile` dibuat, jalankan perintah berikut untuk membangun gambar Docker. Berikan nama untuk image Docker, misalnya,*emr6.6\$1custom*. 

   ```
   docker build -t emr6.6_custom .
   ```

## Langkah 3: (Opsional tapi disarankan) Validasi gambar kustom
<a name="docker-custom-images-validate"></a>

Kami menyarankan Anda menguji kompatibilitas gambar kustom Anda sebelum menerbitkannya. Anda dapat menggunakan [EMR Amazon pada CLI gambar khusus EKS](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli) untuk memeriksa apakah gambar Anda memiliki struktur file yang diperlukan dan konfigurasi yang benar untuk berjalan di Amazon EMR di EKS. 

**catatan**  
Amazon EMR pada CLI gambar khusus EKS tidak dapat mengonfirmasi bahwa gambar Anda bebas dari kesalahan. Berhati-hatilah saat menghapus dependensi dari gambar dasar.

Ambil langkah-langkah berikut untuk memvalidasi gambar kustom Anda. 

1. Unduh dan instal Amazon EMR pada CLI gambar khusus EKS. Untuk informasi selengkapnya, lihat [Amazon EMR di Panduan Instalasi CLI gambar khusus EKS](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli/blob/main/installer/assets/INSTALLATION_GUIDE.md).

1. Jalankan perintah berikut untuk menguji instalasi.

   ```
   emr-on-eks-custom-image --version
   ```

   Berikut ini menunjukkan contoh output.

   ```
   Amazon EMR on EKS Custom Image CLI
   Version: x.xx
   ```

1. Jalankan perintah berikut untuk memvalidasi gambar kustom Anda.

   ```
   emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
   ```
   + `-i`menentukan URI gambar lokal yang perlu divalidasi. Ini bisa berupa URI gambar, nama atau tag apa pun yang Anda tentukan untuk gambar Anda.
   + `-r`menentukan versi rilis yang tepat untuk gambar dasar, misalnya,`emr-6.6.0-latest`.
   + `-t`menentukan jenis gambar. Jika ini adalah gambar Spark, masukan`spark`. Nilai default-nya adalah `spark`. EMR Amazon saat ini pada versi CLI gambar khusus EKS hanya mendukung gambar runtime Spark.

   Jika Anda menjalankan perintah dengan sukses dan gambar kustom memenuhi semua konfigurasi dan struktur file yang diperlukan, output yang dikembalikan menampilkan hasil dari semua pengujian, seperti contoh berikut menunjukkan.

   ```
   Amazon EMR on EKS Custom Image Test
   Version: x.xx
   ... Checking if docker cli is installed
   ... Checking Image Manifest
   [INFO] Image ID: xxx
   [INFO] Created On: 2021-05-17T20:50:07.986662904Z
   [INFO] Default User Set to hadoop:hadoop : PASS
   [INFO] Working Directory Set to /home/hadoop : PASS
   [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS
   [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS
   [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS
   [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: PASS
   [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS
   [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS
   [INFO] File Structure Test for bin-files in /usr/bin: PASS
   ... Start Running Sample Spark Job
   [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS
   -----------------------------------------------------------------
   Overall Custom Image Validation Succeeded.
   -----------------------------------------------------------------
   ```

   Jika gambar kustom tidak memenuhi konfigurasi atau struktur file yang diperlukan, pesan kesalahan akan terjadi. Output yang dikembalikan memberikan informasi tentang konfigurasi atau struktur file yang salah.

## Langkah 4: Publikasikan gambar khusus
<a name="docker-custom-images-publish"></a>

Publikasikan gambar Docker baru ke registri Amazon ECR Anda. 

1. Jalankan perintah berikut untuk membuat repositori Amazon ECR untuk menyimpan gambar Docker Anda. Berikan nama untuk repositori Anda, misalnya,. *emr6.6\$1custom\$1repo* Ganti *us-west-2* dengan Wilayah Anda. 

   ```
   aws ecr create-repository \
       --repository-name emr6.6_custom_repo \
       --image-scanning-configuration scanOnPush=true \
       --region us-west-2
   ```

   Untuk informasi lebih lanjut, lihat [Membuat repositori](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-create-repository) dalam *Panduan Pengguna Amazon ECR*.

1. Jalankan perintah berikut untuk mengautentikasi ke registri default Anda.

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com
   ```

   Untuk informasi selengkapnya, lihat [Autentikasi ke registri default Anda](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry) di *Panduan Pengguna Amazon ECR*.

1. Tandai dan publikasikan gambar ke repositori Amazon ECR yang Anda buat. 

   Tandai gambar.

   ```
   docker tag emr6.6_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo
   ```

   Tekan gambar.

   ```
   docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo
   ```

   Untuk informasi selengkapnya, lihat [Menekan gambar ke Amazon ECR ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-push-image) di *Panduan Pengguna Amazon ECR*.

## Langkah 5: Kirim beban kerja Spark di Amazon EMR menggunakan gambar khusus
<a name="docker-custom-images-submit"></a>

Setelah gambar kustom dibangun dan diterbitkan, Anda dapat mengirimkan tugas Amazon EMR di EKS menggunakan gambar kustom. 

Pertama, buat start-job-run-request file.json dan tentukan `spark.kubernetes.container.image` parameter untuk referensi gambar kustom, seperti contoh file JSON berikut menunjukkan. 

**catatan**  
Anda dapat menggunakan `local://` skema untuk merujuk ke file yang tersedia dalam gambar kustom seperti yang ditunjukkan dengan `entryPoint` argumen dalam cuplikan JSON di bawah ini. Anda juga dapat menggunakan `local://` skema untuk merujuk ke dependensi aplikasi. Semua file dan dependensi yang dirujuk menggunakan `local://` skema harus sudah ada di jalur yang ditentukan dalam gambar kustom.

```
{
    "name": "spark-custom-image", 
    "virtualClusterId": "virtual-cluster-id", 
    "executionRoleArn": "execution-role-arn", 
    "releaseLabel": "emr-6.6.0-latest", 
    "jobDriver": {
      "sparkSubmitJobDriver": {
        "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", 
        "entryPointArguments": [
                  "10"
              ],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo"
       }
    }
}
```

Anda juga dapat mereferensikan gambar kustom dengan `applicationConfiguration` properti seperti contoh berikut menunjukkan.

```
{
    "name": "spark-custom-image", 
    "virtualClusterId": "virtual-cluster-id", 
    "executionRoleArn": "execution-role-arn", 
    "releaseLabel": "emr-6.6.0-latest", 
    "jobDriver": {
      "sparkSubmitJobDriver": {
        "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", 
        "entryPointArguments": [
                  "10"
              ],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
       }
    },
    "configurationOverrides": {
        "applicationConfiguration": [
            {
                "classification": "spark-defaults",
                "properties": {
                    "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo"
                }
            }
        ]
    }
}
```

Kemudian jalankan perintah `start-job-run` untuk mengirimkan tugas.

```
aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json
```

Dalam contoh JSON di atas, ganti *emr-6.6.0-latest* dengan versi rilis Amazon EMR Anda. Kami sangat menyarankan Anda menggunakan versi `-latest` rilis untuk memastikan bahwa versi yang dipilih berisi pembaruan keamanan terbaru. Untuk informasi selengkapnya tentang versi rilis Amazon EMR dan tag gambarnya, lihat. [Detail untuk memilih URI gambar dasar](docker-custom-images-tag.md) 

**catatan**  
Anda dapat menggunakan `spark.kubernetes.driver.container.image` dan `spark.kubernetes.executor.container.image` untuk menentukan gambar yang berbeda untuk driver dan pod eksekutor. 

# Sesuaikan gambar Docker untuk titik akhir interaktif
<a name="docker-custom-images-managed-endpoint"></a>

Anda juga dapat menyesuaikan gambar Docker untuk titik akhir interaktif sehingga Anda dapat menjalankan gambar kernel dasar yang disesuaikan. Ini membantu Anda memastikan bahwa Anda memiliki dependensi yang Anda butuhkan saat menjalankan beban kerja interaktif dari EMR Studio.

1. Ikuti [Langkah 1-4](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-retrieve) yang diuraikan di atas untuk menyesuaikan gambar Docker. Untuk rilis Amazon EMR 6.9.0 dan yang lebih baru, Anda bisa mendapatkan URI gambar dasar dari Galeri Publik Amazon ECR. Untuk rilis sebelum Amazon EMR 6.9.0, Anda bisa mendapatkan gambar di akun Amazon ECR Registry di masing-masing akun Wilayah AWS, dan satu-satunya perbedaan adalah URI gambar dasar di Dockerfile Anda. URI gambar dasar mengikuti format:

   ```
   ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag
   ```

   Anda perlu menggunakan `notebook-spark` URI gambar dasar, bukan`spark`. Gambar dasar berisi runtime Spark dan kernel notebook yang berjalan dengannya. Untuk informasi selengkapnya tentang memilih tag gambar Wilayah dan kontainer, lihat[Detail untuk memilih URI gambar dasar](docker-custom-images-tag.md). 
**catatan**  
Saat ini hanya penggantian gambar dasar yang didukung dan memperkenalkan kernel yang sama sekali baru dari jenis lain selain yang AWS disediakan gambar dasar tidak didukung.

1. Buat endpoint interaktif yang dapat digunakan dengan gambar kustom. 

   Pertama, buat file JSON yang disebut `custom-image-managed-endpoint.json` dengan konten berikut.

   ```
   {
       "name": "endpoint-name",
       "virtualClusterId": "virtual-cluster-id",
       "type": "JUPYTER_ENTERPRISE_GATEWAY",
       "releaseLabel": "emr-6.6.0-latest",
       "executionRoleArn": "execution-role-arn",
       "certificateArn": "certificate-arn",
       "configurationOverrides": {
           "applicationConfiguration": [
               {
                   "classification": "jupyter-kernel-overrides",
                   "configurations": [
                       {
                           "classification": "python3",
                           "properties": {
                               "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest"
                           }
                       },
                       {
                           "classification": "spark-python-kubernetes",
                           "properties": {
                               "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest"
                           }
                       }
                   ] 
               }
           ]
       }
   }
   ```

   Selanjutnya, buat endpoint interaktif menggunakan konfigurasi yang ditentukan dalam file JSON, seperti contoh berikut menunjukkan.

   ```
   aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json
   ```

   Untuk informasi selengkapnya, lihat [Membuat titik akhir interaktif untuk klaster virtual Anda](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html#emr-studio-create-managed-endpoint).

1. Connect ke endpoint interaktif melalui EMR Studio. Untuk informasi selengkapnya, lihat [Menghubungkan dari Studio](https://emr-on-eks.workshop.aws/advanced/emr-studio/connecting-from-studio.html).

# Bekerja dengan gambar multi-arsitektur
<a name="docker-custom-images-multi-architecture"></a>

Amazon EMR di EKS mendukung gambar kontainer multi-arsitektur untuk Amazon Elastic Container Registry (Amazon ECR) Registry ECR). Untuk informasi selengkapnya, lihat [Memperkenalkan gambar kontainer multi-arsitektur untuk Amazon ECR](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/).

Amazon EMR pada gambar khusus EKS mendukung instans EC2 AWS berbasis Graviton dan instans EC2. non-Graviton-based Gambar berbasis Graviton disimpan dalam repositori gambar yang sama di Amazon ECR sebagai gambar. non-Graviton-based 

Misalnya, untuk memeriksa daftar manifes Docker untuk gambar 6.6.0, jalankan perintah berikut.

```
docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest 
```

Berikut adalah outputnya. `arm64`Arsitekturnya untuk contoh Graviton. `amd64`Ini untuk contoh non-Graviton. 

```
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1805,
         "digest": "xxx123:6b971cb47d11011ab3d45fff925e9442914b4977ae0f9fbcdcf5cfa99a7593f0",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1805,
         "digest": "xxx123:6f2375582c9c57fa9838c1d3a626f1b4fc281e287d2963a72dfe0bd81117e52f",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      }
   ]
}
```

Ambil langkah-langkah berikut untuk membuat gambar multi-arsitektur:

1. Buat `Dockerfile` dengan konten berikut sehingga Anda dapat menarik `arm64` gambar.

   ```
   FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
    
   RUN pip3 install boto3 // install customizations here
   USER hadoop:hadoop
   ```

1. Ikuti petunjuk di [Memperkenalkan gambar wadah multi-arsitektur untuk Amazon ECR](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/) untuk membuat gambar multi-arsitektur. 
**catatan**  
Anda harus membuat `arm64` gambar pada `arm64` instance. Demikian pula, Anda harus membangun `amd64` gambar pada `amd64` instance.

   Anda juga dapat membuat gambar multi-arsitektur tanpa membangun setiap jenis instance tertentu dengan perintah Docker`buildx`. Untuk informasi selengkapnya, lihat [Memanfaatkan dukungan arsitektur multi-CPU](https://docs.docker.com/desktop/multi-arch/). 

1. Setelah Anda membangun gambar multi-arsitektur, Anda dapat mengirimkan pekerjaan dengan `spark.kubernetes.container.image` parameter yang sama dan mengarahkannya ke gambar. Dalam cluster heterogen dengan instance AWS berbasis Graviton dan non-Graviton-based EC2, instance menentukan gambar arsitektur yang benar berdasarkan arsitektur instance yang menarik gambar.