

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

# Notebook Jupyter di Amazon EMR
<a name="emr-jupyter"></a>

[Notebook Jupyter](https://jupyter.org/) adalah aplikasi web sumber terbuka yang dapat Anda gunakan untuk membuat dan berbagi dokumen yang berisi kode langsung, persamaan, visualisasi, dan teks narasi. Amazon EMR menawarkan tiga opsi untuk bekerja dengan notebook Jupyter:

**Topics**
+ [Studio EMR](emr-studio-jupyter.md)
+ [EMR Notebooks](emr-jupyter-emr-managed-notebooks.md)
+ [JupyterHub](emr-jupyterhub.md)

# Studio EMR
<a name="emr-studio-jupyter"></a>

Amazon EMR Studio adalah lingkungan pengembangan terintegrasi berbasis web (IDE) untuk [notebook Jupyter](https://jupyter.org/) yang dikelola sepenuhnya yang berjalan di kluster EMR Amazon. Anda dapat menyiapkan EMR Studio untuk tim Anda untuk mengembangkan, memvisualisasikan, dan men-debug aplikasi yang ditulis dalam R, Python, Scala, dan. PySpark 

Sebaiknya gunakan EMR Studio saat menggunakan notebook Jupyter di Amazon EMR. Untuk informasi selengkapnya, lihat [EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio.html) di Panduan Manajemen *EMR* Amazon.

# Notebook Amazon EMR berdasarkan Notebook Jupyter
<a name="emr-jupyter-emr-managed-notebooks"></a>

EMR Notebooks adalah lingkungan [Notebook Jupyter](https://jupyter.org/) yang dibangun ke konsol Amazon EMR yang memungkinkan Anda untuk membuat notebook Jupyter dengan cepat, melampirkannya ke klaster Spark, dan kemudian buka editor Notebook Jupyter di konsol untuk menjalankan kueri dan kode dari jarak jauh. EMR Notebooks disimpan di Amazon S3 secara independen dari klaster untuk penyimpanan tahan lama, akses cepat, dan fleksibilitas. Anda dapat memiliki beberapa notebook terbuka, melampirkan beberapa notebook ke klaster tunggal, dan kembali menggunakan notebook pada klaster yang berbeda.

Untuk informasi selengkapnya, lihat [EMR Notebooks](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks.html) di *Panduan Pengelolaan Amazon EMR*.

# JupyterHub
<a name="emr-jupyterhub"></a>

[Jupyter Notebook](https://jupyter.org/) adalah aplikasi web open-source yang dapat Anda gunakan untuk membuat dan berbagi dokumen yang berisi kode langsung, persamaan, visualisasi, dan teks naratif. [JupyterHub](https://jupyterhub.readthedocs.io/en/latest/)memungkinkan Anda meng-host beberapa instance server notebook Jupyter pengguna tunggal. Saat Anda membuat cluster dengan JupyterHub, Amazon EMR membuat wadah Docker di node master cluster. JupyterHub, semua komponen yang diperlukan untuk Jupyter, dan [Sparkmagic](https://github.com/jupyter-incubator/sparkmagic/blob/master/README.md) berjalan di dalam wadah.

Sparkmagic adalah perpustakaan kernel yang memungkinkan notebook Jupyter untuk berinteraksi dengan [Apache Spark](https://aws.amazon.com/big-data/what-is-spark/) berjalan di Amazon EMR melalui [Apache Livy](emr-livy.md), yang merupakan server REST untuk Spark. Spark dan Apache Livy diinstal secara otomatis saat Anda membuat cluster dengan. JupyterHub Kernel Python 3 default untuk Jupyter tersedia bersama dengan kernel PySpark 3, PySpark, dan Spark yang tersedia dengan Sparkmagic. Anda dapat menggunakan kernel ini untuk menjalankan kode Spark ad-hoc dan kueri SQL interaktif menggunakan Python dan Scala. Anda dapat menginstal kernel tambahan dalam kontainer Docker secara manual. Untuk informasi selengkapnya, lihat [Memasang kernel dan pustaka tambahan](emr-jupyterhub-install-kernels-libs.md).

Diagram berikut menggambarkan komponen EMR JupyterHub Amazon dengan metode otentikasi yang sesuai untuk pengguna notebook dan administrator. Untuk informasi selengkapnya, lihat [Menambahkan pengguna dan administrator Jupyter Notebook](emr-jupyterhub-user-access.md).

![\[JupyterHub architecture on EMR showing user authentication and component interactions.\]](http://docs.aws.amazon.com/id_id/emr/latest/ReleaseGuide/images/jupyter-arch.png)


Tabel berikut mencantumkan versi yang JupyterHub disertakan dalam rilis terbaru seri Amazon EMR 7.x, bersama dengan komponen yang dipasang Amazon EMR. JupyterHub

Untuk versi komponen yang diinstal JupyterHub dalam rilis ini, lihat Rilis Versi [Komponen 7.12.0](emr-7120-release.md).


**JupyterHub informasi versi untuk emr-7.12.0**  

| Label Rilis Amazon EMR | JupyterHub Versi | Komponen Dipasang Dengan JupyterHub | 
| --- | --- | --- | 
| emr-7.12.0 | JupyterHub 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

Tabel berikut mencantumkan versi yang JupyterHub disertakan dalam rilis terbaru seri Amazon EMR 6.x, bersama dengan komponen yang dipasang Amazon EMR. JupyterHub

Untuk versi komponen yang diinstal JupyterHub dalam rilis ini, lihat Rilis Versi [Komponen 6.15.0](emr-6150-release.md).


**JupyterHub informasi versi untuk emr-6.15.0**  

| Label Rilis Amazon EMR | JupyterHub Versi | Komponen Dipasang Dengan JupyterHub | 
| --- | --- | --- | 
| emr-6.15.0 | JupyterHub 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

Tabel berikut mencantumkan versi yang JupyterHub disertakan dalam rilis terbaru seri Amazon EMR 5.x, bersama dengan komponen yang dipasang Amazon EMR. JupyterHub

Untuk versi komponen yang diinstal JupyterHub dalam rilis ini, lihat [Rilis 5.36.2](emr-5362-release.md) Versi Komponen.


**JupyterHub informasi versi untuk emr-5.36.2**  

| Label Rilis Amazon EMR | JupyterHub Versi | Komponen Dipasang Dengan JupyterHub | 
| --- | --- | --- | 
| emr-5.36.2 | JupyterHub 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 

Kernel Python 3 yang disertakan dengan EMR JupyterHub Amazon adalah 3.6.4.

Pustaka dipasang di dalam `jupyterhub` kontainer dapat bervariasi antara versi rilis Amazon EMR dan versi Amazon EC2 AMI.

**Untuk membuat daftar pustaka yang diinstal menggunakan `conda`**
+ Jalankan perintah berikut pada baris perintah simpul utama:

  ```
  sudo docker exec jupyterhub bash -c "conda list"
  ```

**Untuk membuat daftar pustaka yang diinstal menggunakan `pip`**
+ Jalankan perintah berikut pada baris perintah simpul utama:

  ```
  sudo docker exec jupyterhub bash -c "pip freeze"
  ```

**Topics**
+ [Buat cluster dengan JupyterHub](emr-jupyterhub-launch.md)
+ [Pertimbangan saat menggunakan JupyterHub di Amazon EMR](emr-jupyterhub-considerations.md)
+ [Mengkonfigurasi JupyterHub](emr-jupyterhub-configure.md)
+ [Mengonfigurasi ketekunan untuk notebook di Amazon S3](emr-jupyterhub-s3.md)
+ [Menyambung ke simpul utama dan server Notebook](emr-jupyterhub-connect.md)
+ [JupyterHub konfigurasi dan administrasi](emr-jupyterhub-administer.md)
+ [Menambahkan pengguna dan administrator Jupyter Notebook](emr-jupyterhub-user-access.md)
+ [Memasang kernel dan pustaka tambahan](emr-jupyterhub-install-kernels-libs.md)
+ [JupyterHub riwayat rilis](JupyterHub-release-history.md)

# Buat cluster dengan JupyterHub
<a name="emr-jupyterhub-launch"></a>

Anda dapat membuat klaster EMR Amazon dengan JupyterHub menggunakan Konsol Manajemen AWS, AWS Command Line Interface, atau Amazon EMR API. Pastikan bahwa klaster tidak dibuat dengan pilihan untuk mengakhiri secara otomatis setelah menyelesaikan langkah-langkah (`--auto-terminate` pilihan di AWS CLI). Juga, pastikan bahwa administrator dan notebook pengguna dapat mengakses pasangan kunci yang Anda gunakan ketika membuat klaster. Untuk informasi lebih lanjut, lihat [Gunakan pasangan kunci untuk kredensial SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-access-ssh.html) dalam *Panduan Pengelolaan Amazon EMR*.

## Buat cluster dengan JupyterHub menggunakan konsol
<a name="emr-jupyterhub-launch-console"></a>

Gunakan prosedur berikut untuk membuat cluster dengan JupyterHub diinstal menggunakan **Opsi Lanjutan** di konsol EMR Amazon.

**Untuk membuat cluster EMR Amazon dengan JupyterHub diinstal menggunakan konsol Amazon EMR**

1. Arahkan ke konsol EMR Amazon baru dan pilih **Beralih ke konsol lama** dari navigasi samping. Untuk informasi selengkapnya tentang apa yang diharapkan saat beralih ke konsol lama, lihat [Menggunakan konsol lama](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in).

1. Pilih **Buat klaster**, **Buka opsi lanjutan**.

1. Di bawah **Konfigurasi Perangkat Lunak**:
   + Untuk **Rilis**, pilih emr-5.36.2, dan pilih. JupyterHub
   + Jika Anda menggunakan Spark, untuk menggunakan AWS Glue Data Catalog sebagai metastore untuk Spark SQL, pilih **Gunakan** untuk metadata tabel Spark. Untuk informasi selengkapnya, lihat [Gunakan katalog Katalog Data AWS Glue dengan Spark di Amazon EMR](emr-spark-glue.md).
   + Untuk **Mengedit pengaturan perangkat lunak** pilih **Masukkan konfigurasi** dan tentukan nilai, atau pilih **Muat JSON dari S3** dan tentukan file konfigurasi JSON. Untuk informasi selengkapnya, lihat [Mengkonfigurasi JupyterHub](emr-jupyterhub-configure.md).

1. Di bawah **Tambahkan langkah (opsional)** konfigurasikan langkah-langkah untuk menjalankan ketika klaster dibuat, pastikan bahwa **Penghentian klaster secara otomatis setelah langkah terakhir selesai** tidak dipilih, dan pilih **Selanjutnya**.

1. Pilih opsi **Konfigurasi Perangkat Keras**, **Selanjutnya**. Untuk informasi selengkapnya, lihat [Konfigurasikan perangkat keras klaster](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-instances.html) di *Panduan Pengelolaan Amazon EMR*.

1. Pilih opsi untuk **Pengaturan Klaster Umum**, **Selanjutnya**.

1. Pilih **Opsi Keamanan**, menentukan pasangan kunci, dan pilih **Buat Klaster**.

## Buat cluster dengan JupyterHub menggunakan AWS CLI
<a name="emr-jupyterhub-launch-cli"></a>

Untuk meluncurkan cluster dengan JupyterHub, gunakan `aws emr create-cluster` perintah dan, untuk `--applications` opsi, tentukan`Name=JupyterHub`. Contoh berikut meluncurkan JupyterHub cluster di Amazon EMR dengan dua instans EC2 (satu master dan satu instance inti). Juga, debugging diaktifkan, dengan log disimpan di lokasi Amazon S3 sebagaimana ditentukan oleh `--log-uri`. Pasangan kunci yang ditentukan menyediakan akses ke instans Amazon EC2 di klaster.

**catatan**  
Karakter lanjutan baris Linux (\$1) disertakan agar mudah dibaca Karakter ini bisa dihapus atau digunakan dalam perintah Linux. Untuk Windows, hapus atau ganti dengan tanda sisipan (^).

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair
```

# Pertimbangan saat menggunakan JupyterHub di Amazon EMR
<a name="emr-jupyterhub-considerations"></a>

Pertimbangkan hal berikut saat menggunakan JupyterHub di Amazon EMR.
+ 
**Awas**  
Buku catatan pengguna dan file disimpan ke sistem file di simpul utama. Ini adalah penyimpanan sementara yang tidak bertahan melalui akhir klaster. Ketika klaster berakhir, data ini hilang jika tidak didukung. Kami menyarankan agar Anda menjadwalkan pencadangan reguler menggunakan `cron` tugas atau cara lain yang cocok untuk aplikasi Anda.  
Selain itu, perubahan konfigurasi yang dibuat dalam kontainer mungkin tidak bertahan jika kontainer dimulai ulang. Kami sarankan Anda untuk menulis atau mengotomatisasi konfigurasi kontainer sehingga Anda dapat mereproduksi kustomisasi lebih mudah.
+ Autentikasi Kerberos yang telah diatur menggunakan konfigurasi keamanan Amazon EMR tidak didukung.
+ [OAuthenticator](https://github.com/jupyterhub/oauthenticator) tidak didukung.

# Mengkonfigurasi JupyterHub
<a name="emr-jupyterhub-configure"></a>

Anda dapat menyesuaikan konfigurasi EMR JupyterHub Amazon dan notebook pengguna individual dengan menghubungkan ke node master cluster dan mengedit file konfigurasi. Setelah Anda mengubah nilai, mulai ulang `jupyterhub` kontainer.

Ubah properti dalam file berikut untuk mengkonfigurasi JupyterHub dan notebook Jupyter individual:
+ `jupyterhub_config.py`—Secara default, file ini disimpan dalam `/etc/jupyter/conf/` direktori pada simpul utama. Untuk informasi selengkapnya, lihat [Dasar-dasar konfigurasi](http://jupyterhub.readthedocs.io/en/latest/getting-started/config-basics.html) dalam JupyterHub dokumentasi.
+ `jupyter_notebook_config.py`—File ini disimpan dalam `/etc/jupyter/` direktori secara default dan disalin ke `jupyterhub` sebagai default. Untuk informasi lebih lanjut, lihat [opsi file Config dan baris perintah](https://jupyter-notebook.readthedocs.io/en/5.7.4/config.html) dalam dokumentasi Notebook Jupyter.

Anda juga dapat menggunakan `jupyter-sparkmagic-conf` klasifikasi konfigurasi untuk menyesuaikan Sparkmagic, yang memperbarui nilai-nilai dalam `config.json` file untuk Sparkmagic. Untuk informasi selengkapnya tentang setelan yang tersedia, lihat [example\$1config.json](https://github.com/jupyter-incubator/sparkmagic/blob/master/sparkmagic/example_config.json) aktif. GitHub Untuk informasi selengkapnya tentang penggunaan klasifikasi dengan aplikasi di Amazon EMR, lihat [Konfigurasikan aplikasi](emr-configure-apps.md).

Contoh berikut meluncurkan cluster menggunakan AWS CLI, referensi file `MyJupyterConfig.json` untuk pengaturan klasifikasi konfigurasi Sparkmagic.

**catatan**  
Karakter lanjutan baris Linux (\$1) disertakan agar mudah dibaca Karakter ini bisa dihapus atau digunakan dalam perintah Linux. Untuk Windows, hapus atau ganti dengan tanda sisipan (^).

```
aws emr create-cluster --use-default-roles --release-label emr-5.14.0 \
--applications Name=Jupyter --instance-type m4.xlarge --instance-count 3 \
--ec2-attributes KeyName=MyKey,SubnetId=subnet-1234a5b6 --configurations file://MyJupyterConfig.json
```

Contoh isi `MyJupyterConfig.json` adalah sebagai berikut:

```
[
    {
    "Classification":"jupyter-sparkmagic-conf",
    "Properties": {
      "kernel_python_credentials" : "{\"username\":\"diego\",\"base64_password\":\"mypass\",\"url\":\"http:\/\/localhost:8998\",\"auth\":\"None\"}"
      }
    }
]
```

**catatan**  
Dengan Amazon EMR versi 5.21.0 dan yang lebih baru, Anda dapat mengganti konfigurasi klaster dan menentukan klasifikasi konfigurasi tambahan untuk setiap grup instans dalam klaster berjalan. Anda melakukannya dengan menggunakan konsol EMR Amazon, AWS Command Line Interface (AWS CLI), atau SDK AWS . Untuk informasi selengkapnya, lihat [Menyediakan Konfigurasi untuk Grup Instans dalam Klaster Berjalan](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html).

# Mengonfigurasi ketekunan untuk notebook di Amazon S3
<a name="emr-jupyterhub-s3"></a>

Anda dapat mengonfigurasi JupyterHub klaster di Amazon EMR sehingga notebook yang disimpan oleh pengguna tetap ada di Amazon S3, di luar penyimpanan sementara pada instans EC2 cluster.

Anda menentukan persistensi Amazon S3 menggunakan `jupyter-s3-conf` konfigurasi klasifikasi saat Anda membuat klaster. Untuk informasi selengkapnya, lihat [Konfigurasikan aplikasi](emr-configure-apps.md).

Selain mengaktifkan persistensi Amazon S3 menggunakan `s3.persistence.enabled` properti, Anda menentukan bucket di Amazon S3 tempat buku catatan disimpan menggunakan `s3.persistence.bucket` properti. Notebook untuk setiap pengguna disimpan ke `jupyter/jupyterhub-user-name` folder dalam bucket yang ditentukan. Bucket harus sudah ada di Amazon S3, dan peran untuk profil instans EC2 yang Anda tentukan ketika membuat klaster harus memiliki izin untuk bucket (secara default, perannya adalah `EMR_EC2_DefaultRole`). Untuk informasi selengkapnya, lihat [Mengonfigurasi peran IAM untuk izin AWS EMR Amazon](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles.html) ke layanan.

Ketika Anda meluncurkan klaster baru menggunakan properti klasifikasi konfigurasi yang sama, pengguna dapat membuka notebook dengan konten dari lokasi disimpan.

Perhatikan bahwa ketika Anda mengimpor file sebagai modul di notebook ketika Anda mengaktifkan Amazon S3, ini akan mengakibatkan file mengunggah ke Amazon S3. Saat Anda mengimpor file tanpa mengaktifkan persistensi Amazon S3, file tersebut akan diunggah ke penampung Anda. JupyterHub 

Contoh berikut mengaktifkan persistensi Amazon S3. Notebook yang disimpan oleh pengguna disimpan dalam `s3://MyJupyterBackups/jupyter/jupyterhub-user-name` folder untuk setiap pengguna, di mana `jupyterhub-user-name` adalah nama pengguna, seperti `diego`.

```
[
    {
        "Classification": "jupyter-s3-conf",
        "Properties": {
            "s3.persistence.enabled": "true",
            "s3.persistence.bucket": "MyJupyterBackups"
        }
    }
]
```

# Menyambung ke simpul utama dan server Notebook
<a name="emr-jupyterhub-connect"></a>

JupyterHub administrator dan pengguna notebook harus terhubung ke node master cluster menggunakan terowongan SSH dan kemudian menghubungkan ke antarmuka web yang dilayani oleh JupyterHub pada node master. Untuk informasi lebih lanjut tentang mengonfigurasi terowongan SSH dan menggunakan terowongan ke koneksi Web proksi, lihat [Connect ke klaster](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node.html) dalam *Panduan Pengelolaan Amazon EMR*.

Secara default, JupyterHub di Amazon EMR tersedia melalui **port 9443** pada master node. JupyterHub Proxy internal juga melayani instance notebook melalui port 9443. JupyterHub dan antarmuka web Jupyter dapat diakses menggunakan URL dengan pola berikut:

****https: //:9443 *MasterNodeDNS*****

Anda dapat menentukan port yang berbeda menggunakan `c.JupyterHub.port` properti di `jupyterhub_config.py` file. Untuk informasi selengkapnya, lihat [Dasar-dasar jaringan](http://jupyterhub.readthedocs.io/en/latest/getting-started/networking-basics.html) dalam JupyterHub dokumentasi.

Secara default, JupyterHub di Amazon EMR menggunakan sertifikat yang ditandatangani sendiri untuk enkripsi SSL menggunakan HTTPS. Pengguna diminta untuk mempercayai sertifikat yang ditandatangani sendiri saat tersambung. Anda dapat menggunakan sertifikat terpercaya dan kunci Anda sendiri. Mengganti file sertifikat default, `server.crt`, dan file kunci `server.key` dalam `/etc/jupyter/conf/` direktori pada simpul utama dengan sertifikat dan file kunci Anda sendiri. Gunakan `c.JupyterHub.ssl_key` dan `c.JupyterHub.ssl_cert` properti di `jupyterhub_config.py` file untuk menentukan materi SSL Anda. Untuk informasi selengkapnya, lihat [Pengaturan keamanan](https://jupyterhub.readthedocs.io/en/latest/tutorial/getting-started/security-basics.html) di JupyterHub dokumentasi. Setelah Anda memperbarui `jupyterhub_config.py`, mulai ulang kontainer.

# JupyterHub konfigurasi dan administrasi
<a name="emr-jupyterhub-administer"></a>

JupyterHub dan komponen terkait berjalan di dalam wadah Docker bernama `jupyterhub` yang menjalankan sistem operasi Ubuntu. Ada beberapa cara bagi Anda untuk mengelola komponen yang berjalan di dalam kontainer.

**Awas**  
Kustomisasi yang Anda lakukan dalam kontainer mungkin tidak bertahan jika kontainer dimulai ulang. Kami sarankan Anda untuk menulis atau mengotomatisasi konfigurasi kontainer sehingga Anda dapat mereproduksi kustomisasi lebih mudah.

## Administrasi menggunakan baris perintah
<a name="emr-jupyterhub-administer-cli"></a>

Ketika terhubung ke master utama menggunakan SSH, Anda dapat mengeluarkan perintah dengan menggunakan antarmuka baris perintah Docker (CLI) dan menentukan kontainer dengan nama (`jupyterhub`) atau ID. Misalnya, `sudo docker exec jupyterhub command` menjalankan perintah yang diakui oleh sistem operasi atau aplikasi yang berjalan di dalam kontainer. Anda dapat menggunakan metode ini untuk menambahkan pengguna ke sistem operasi dan menginstal aplikasi tambahan dan perpustakaan dalam kontainer Docker. Misalnya, gambar kontainer default termasuk Conda untuk instalasi paket, sehingga Anda mungkin menjalankan perintah berikut pada baris perintah simpul utama untuk menginstal aplikasi, Keras, dalam kontainer:

```
sudo docker exec jupyterhub conda install keras
```

## Administrasi dengan mengirimkan langkah-langkah
<a name="emr-jupyterhub-administer-steps"></a>

Langkah-langkah adalah cara untuk mengirimkan pekerjaan ke klaster. Anda dapat mengirimkan langkah-langkah ketika Anda meluncurkan sebuah klaster, atau Anda dapat mengirimkan langkah-langkah untuk menjalankan klaster. Perintah yang Anda jalankan pada baris perintah dapat dikirimkan sebagai langkah menggunakan `command-runner.jar`. Untuk informasi lebih lanjut, lihat [Bekerja dengan langkah-langkah menggunakan CLI dan konsol](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html) dalam *Panduan Pengelolaan Amazon EMR* dan [Jalankan perintah dan skrip di klaster EMR Amazon](emr-commandrunner.md).

Misalnya, Anda dapat menggunakan AWS CLI perintah berikut pada komputer lokal untuk menginstal Keras dengan cara yang sama seperti yang Anda lakukan dari baris perintah master node dalam contoh sebelumnya:

```
aws emr add-steps --cluster-id MyClusterID --steps Name="Command Runner",Jar="command-runner.jar",Args="/usr/bin/sudo","/usr/bin/docker","exec","jupyterhub","conda","install","keras"
```

Juga, Anda dapat menuliskan urutan langkah-langkah, mengunggah skrip ke Amazon S3, dan kemudian menggunakan `script-runner.jar` untuk menjalankan skrip saat Anda membuat klaster atau menambahkan skrip sebagai langkah. Untuk informasi selengkapnya, lihat [Jalankan perintah dan skrip di klaster EMR Amazon](emr-commandrunner.md). Sebagai contoh, lihat [Contoh: Skrip Bash untuk menambahkan beberapa pengguna](emr-jupyterhub-pam-users.md#emr-jupyterhub-script-multuser).

## Administrasi menggunakan REST APIs
<a name="emr-jupyterhub-administer-rest"></a>

Jupyter, JupyterHub, dan proxy HTTP untuk JupyterHub menyediakan REST APIs yang dapat Anda gunakan untuk mengirim permintaan. Untuk mengirim permintaan JupyterHub, Anda harus meneruskan token API dengan permintaan tersebut. Anda dapat menggunakan `curl` perintah dari baris perintah simpul utama untuk menjalankan perintah REST. Untuk informasi selengkapnya, lihat sumber daya berikut:
+ [Menggunakan JupyterHub REST API](http://jupyterhub.readthedocs.io/en/latest/reference/rest.html) dalam dokumentasi untuk JupyterHub, yang mencakup instruksi untuk membuat token API
+ API [server Notebook Jupyter](https://github.com/jupyter/jupyter/wiki/Jupyter-Notebook-Server-API) aktif GitHub
+ [configurable-http-proxy](https://github.com/jupyterhub/configurable-http-proxy)pada GitHub

Contoh berikut menunjukkan menggunakan REST API JupyterHub untuk mendapatkan daftar pengguna. Perintah meneruskan token admin yang dibuat sebelumnya dan menggunakan port default, 9443, untuk JupyterHub, menyalurkan output ke [jq agar lebih mudah dilihat:](https://stedolan.github.io/jq/)

```
curl -XGET -s -k https://$HOST:9443/hub/api/users \
-H "Authorization: token $admin_token" | jq .
```

# Menambahkan pengguna dan administrator Jupyter Notebook
<a name="emr-jupyterhub-user-access"></a>

Anda dapat menggunakan salah satu dari dua metode bagi pengguna untuk mengautentikasi JupyterHub sehingga mereka dapat membuat buku catatan dan, secara opsional, mengelola. JupyterHub Metode termudah adalah dengan menggunakan modul otentikasi JupyterHub pluggable (PAM). Selain itu, JupyterHub di Amazon EMR mendukung [plugin otentikator LDAP JupyterHub untuk](https://github.com/jupyterhub/ldapauthenticator/) mendapatkan identitas pengguna dari server LDAP, seperti server Microsoft Active Directory. Petunjuk dan contoh untuk menambahkan pengguna dengan setiap metode autentikasi disediakan di bagian ini.

JupyterHub di Amazon EMR memiliki pengguna default dengan izin administrator. Nama pengguna adalah `jovyan` dan kata sandi `jupyter`. Kami sangat menyarankan Anda mengganti pengguna dengan pengguna lain yang memiliki izin administratif. Anda dapat melakukan ini menggunakan langkah ketika Anda membuat klaster, atau dengan menghubungkan ke simpul utama ketika klaster berjalan.

**Topics**
+ [Menggunakan autentikasi PAM](emr-jupyterhub-pam-users.md)
+ [Menggunakan autentikasi LDAP](emr-jupyterhub-ldap-users.md)
+ [Peniruan pengguna](emr-jupyterhub-user-impersonation.md)

# Menggunakan autentikasi PAM
<a name="emr-jupyterhub-pam-users"></a>

Membuat pengguna PAM JupyterHub di Amazon EMR adalah proses dua langkah. Langkah pertama adalah menambahkan pengguna ke sistem operasi yang berjalan di `jupyterhub` kontainer pada simpul utama, dan menambahkan direktori home pengguna yang sesuai untuk setiap pengguna. Langkah kedua adalah menambahkan pengguna sistem operasi ini sebagai JupyterHub pengguna — proses yang dikenal sebagai daftar putih. JupyterHub Setelah JupyterHub pengguna ditambahkan, mereka dapat terhubung ke JupyterHub URL dan memberikan kredensyal sistem operasi mereka untuk akses.

Ketika pengguna log in, JupyterHub membuka instance server notebook untuk pengguna tersebut, yang disimpan di direktori home pengguna pada node master, yaitu`/var/lib/jupyter/home/username`. Jika instance server notebook tidak ada, JupyterHub memunculkan instance notebook di direktori home pengguna. Bagian berikut menunjukkan cara menambahkan pengguna secara individual ke sistem operasi dan ke JupyterHub, diikuti oleh skrip bash dasar yang menambahkan beberapa pengguna.

## Menambahkan pengguna sistem operasi ke kontainer
<a name="emr-jupyterhub-system-user"></a>

Contoh berikut pertama-tama menggunakan perintah [useradd](https://linux.die.net/man/8/useradd) dalam kontainer untuk menambahkan satu pengguna, diego, dan membuat direktori home untuk pengguna tersebut. Perintah kedua menggunakan [chpasswd](https://linux.die.net/man/8/chpasswd) untuk membuat kata sandi diego untuk pengguna ini. Perintah dijalankan pada baris perintah simpul utama saat terhubung menggunakan SSH. Anda juga dapat menjalankan perintah ini menggunakan langkah seperti yang dijelaskan sebelumnya di [Administrasi dengan mengirimkan langkah-langkah](emr-jupyterhub-administer.md#emr-jupyterhub-administer-steps).

```
sudo docker exec jupyterhub useradd -m -s /bin/bash -N diego
sudo docker exec jupyterhub bash -c "echo diego:diego | chpasswd"
```

## Menambahkan JupyterHub pengguna
<a name="emr-jupyterhub-jupyterhub-user"></a>

Anda dapat menggunakan panel **Admin** di JupyterHub atau REST API untuk menambahkan pengguna dan administrator, atau hanya pengguna.

**Untuk menambahkan pengguna dan administrator menggunakan panel admin di JupyterHub**

1. Connect ke master node menggunakan SSH dan masuk ke https: //:9443 *MasterNodeDNS* dengan identitas yang memiliki izin administrator.

1. Pilih **Panel Kontrol**, **Admin**.

1. Pilih **Pengguna**, **Tambahkan Pengguna**, atau pilih **Admin**, **Tambahkan admin**.

**Untuk menambahkan pengguna menggunakan REST API**

1. Connect ke simpul utama menggunakan SSH dan gunakan perintah berikut pada simpul utama, atau jalankan perintah sebagai langkah.

1. Dapatkan token administratif untuk membuat permintaan API, dan ganti *AdminToken* pada langkah berikut dengan token itu.

1. Gunakan perintah berikut, ganti *UserName* dengan pengguna sistem operasi yang telah dibuat di dalam wadah.

   ```
   curl -XPOST -H "Authorization: token AdminToken" "https://$(hostname):9443/hub/api/users/UserName
   ```

**catatan**  
Anda secara otomatis ditambahkan sebagai pengguna JupyterHub non-admin ketika Anda masuk ke antarmuka JupyterHub web untuk pertama kalinya.

## Contoh: Skrip Bash untuk menambahkan beberapa pengguna
<a name="emr-jupyterhub-script-multuser"></a>

Contoh skrip bash berikut mengikat langkah-langkah sebelumnya di bagian ini untuk membuat banyak JupyterHub pengguna. Skrip dapat dijalankan langsung pada simpul utama, atau dapat diunggah ke Amazon S3 dan kemudian dijalankan sebagai langkah.

Skrip pertama menetapkan array nama pengguna, dan menggunakan `jupyterhub token` perintah untuk membuat token API untuk administrator default, jovyan. Ini kemudian menciptakan pengguna sistem operasi di `jupyterhub` kontainer untuk setiap pengguna, menetapkan kata sandi awal untuk masing-masing yang sama dengan nama pengguna mereka. Akhirnya, ia memanggil operasi REST API untuk membuat setiap pengguna masuk JupyterHub. Melewati token yang dihasilkan sebelumnya dalam skrip dan menyalurkan respon REST `jq` agar lebih mudah dilihat.

```
# Bulk add users to container and JupyterHub with temp password of username
set -x
USERS=(shirley diego ana richard li john mary anaya)
TOKEN=$(sudo docker exec jupyterhub /opt/conda/bin/jupyterhub token jovyan | tail -1)
for i in "${USERS[@]}"; 
do 
   sudo docker exec jupyterhub useradd -m -s /bin/bash -N $i
   sudo docker exec jupyterhub bash -c "echo $i:$i | chpasswd"
   curl -XPOST --silent -k https://$(hostname):9443/hub/api/users/$i \
 -H "Authorization: token $TOKEN" | jq
done
```

Simpan skrip ke lokasi di Amazon S3 seperti `s3://amzn-s3-demo-bucket/createjupyterusers.sh`. Kemudian Anda dapat menggunakan `script-runner.jar` untuk menjalankannya sebagai langkah.

### Contoh: Menjalankan skrip saat membuat sebuah klaster (AWS CLI)
<a name="emr-jupyterhub-multuser-createcluster"></a>

**catatan**  
Karakter lanjutan baris Linux (\$1) disertakan agar mudah dibaca Karakter ini bisa dihapus atau digunakan dalam perintah Linux. Untuk Windows, hapus atau ganti dengan tanda sisipan (^).

```
aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
--applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
--use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
--steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

### Menjalankan skrip pada klaster yang ada (AWS CLI)
<a name="emr-jupyterhub-multuser-runningcluster"></a>

**catatan**  
Karakter lanjutan baris Linux (\$1) disertakan agar mudah dibaca Karakter ini bisa dihapus atau digunakan dalam perintah Linux. Untuk Windows, hapus atau ganti dengan tanda sisipan (^).

```
aws emr add-steps --cluster-id j-XXXXXXXX --steps Type=CUSTOM_JAR,\
Name=CustomJAR,ActionOnFailure=CONTINUE,\
Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://amzn-s3-demo-bucket/createjupyterusers.sh"]
```

# Menggunakan autentikasi LDAP
<a name="emr-jupyterhub-ldap-users"></a>

Lightweight Directory Access Protocol (LDAP) adalah sebuah protokol aplikasi untuk mengkueri dan memodifikasi objek yang sesuai dengan sumber daya seperti pengguna dan komputer yang disimpan dalam penyedia layanan direktori LDAP-kompatibel seperti Direktori Aktif atau OpenLDAP server. Anda dapat menggunakan [plugin otentikator LDAP untuk JupyterHub dengan di JupyterHub Amazon EMR untuk](https://github.com/jupyterhub/ldapauthenticator/) menggunakan LDAP untuk otentikasi pengguna. Plugin menangani sesi login untuk pengguna LDAP dan memberikan informasi pengguna untuk Jupyter. Ini memungkinkan pengguna terhubung ke JupyterHub dan notebook dengan menggunakan kredensyal untuk identitas mereka yang disimpan di server yang kompatibel dengan LDAP.

Langkah-langkah di bagian ini memandu Anda melalui langkah-langkah berikut untuk mengatur dan mengaktifkan LDAP menggunakan Plugin Authenticator LDAP untuk. JupyterHub Anda melakukan langkah-langkah tersebut namun tetap terhubung ke baris perintah simpul utama. Untuk informasi selengkapnya, lihat [Menyambung ke simpul utama dan server Notebook](emr-jupyterhub-connect.md).

1. Buat file konfigurasi LDAP dengan informasi tentang LDAP server, seperti alamat IP host, port, mengikat nama, dan sebagainya.

1. Ubah `/etc/jupyter/conf/jupyterhub_config.py` untuk mengaktifkan Plugin Authenticator LDAP untuk. JupyterHub

1. Buat dan jalankan skrip yang mengonfigurasi LDAP dalam `jupyterhub` kontainer.

1. Kueri LDAP untuk pengguna, lalu buat direktori home di dalam wadah untuk setiap pengguna. JupyterHub membutuhkan direktori rumah untuk meng-host notebook.

1. Jalankan skrip yang dimulai ulang JupyterHub

**penting**  
Sebelum Anda mengatur LDAP, periksa infrastruktur jaringan Anda untuk memastikan bahwa LDAP server dan simpul utama klaster dapat berkomunikasi seperti yang diperlukan. TLS biasanya menggunakan port 389 melalui sambungan TCP biasa. Jika sambungan LDAP Anda menggunakan SSL, port TCP terkenal untuk SSL adalah 636.

## Buat file konfigurasi
<a name="emr-jupyterhub-ldap-config"></a>

Contoh di bawah ini menggunakan nilai konfigurasi tempat-pemegang berikut. Ganti ini dengan parameter yang sesuai dengan implementasi Anda.
+ LDAP server menjalankan versi 3 dan tersedia untuk port 389. Ini adalah port non-SSL standar untuk LDAP.
+ Nama khusus dasar (DN) adalah `dc=example, dc=org`.

Gunakan editor teks untuk membuat file [ldap.conf](http://manpages.ubuntu.com/manpages/bionic/man5/ldap.conf.5.html), dengan konten yang serupa dengan berikut ini. Gunakan nilai-nilai yang sesuai untuk pelaksanaan LDAP Anda. Ganti *host* dengan alamat IP atau nama host yang dapat diselesaikan dari server LDAP Anda.

```
base dc=example,dc=org
uri ldap://host
ldap_version 3
binddn cn=admin,dc=example,dc=org
bindpw admin
```

## Aktifkan Plugin Authenticator LDAP untuk JupyterHub
<a name="emr-jupyterhub-ldap-plugin"></a>

Gunakan editor teks untuk mengubah `/etc/jupyter/conf/jupyterhub_config.py` file dan menambahkan properti [ldapauthenticator](https://github.com/jupyterhub/ldapauthenticator) yang serupa dengan berikut ini. Ganti *host* dengan alamat IP atau nama host yang dapat diselesaikan dari server LDAP. Contoh mengasumsikan bahwa objek pengguna berada dalam unit organisasi (ou) bernama*people*, dan menggunakan komponen nama dibedakan yang Anda buat sebelumnya menggunakan`ldap.conf`.

```
c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
c.LDAPAuthenticator.use_ssl = False
c.LDAPAuthenticator.server_address = 'host' 
c.LDAPAuthenticator.bind_dn_template = 'cn={username},ou=people,dc=example,dc=org'
```

## Konfigurasikan LDAP dalam kontainer
<a name="emr-jupyterhub-ldap-container"></a>

Gunakan editor teks untuk membuat skrip bash dengan konten sebagai berikut:

```
#!/bin/bash

# Uncomment the following lines to install LDAP client libraries only if
# using Amazon EMR release version 5.14.0. Later versions install libraries by default.
# sudo docker exec jupyterhub bash -c "sudo apt-get update"
# sudo docker exec jupyterhub bash -c "sudo apt-get -y install libnss-ldap libpam-ldap ldap-utils nscd"
 
# Copy ldap.conf
sudo docker cp ldap.conf jupyterhub:/etc/ldap/
sudo docker exec jupyterhub bash -c "cat /etc/ldap/ldap.conf"
 
# configure nss switch
sudo docker exec jupyterhub bash -c "sed -i 's/\(^passwd.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^group.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "sed -i 's/\(^shadow.*\)/\1 ldap/g' /etc/nsswitch.conf"
sudo docker exec jupyterhub bash -c "cat /etc/nsswitch.conf"
 
# configure PAM to create home directories
sudo docker exec jupyterhub bash -c "echo 'session required        pam_mkhomedir.so skel=/etc/skel umask=077' >> /etc/pam.d/common-session"
sudo docker exec jupyterhub bash -c "cat /etc/pam.d/common-session"
 
# restart nscd service
sudo docker exec jupyterhub bash -c "sudo service nscd restart"
 
# Test
sudo docker exec jupyterhub bash -c "getent passwd"

# Install ldap plugin
sudo docker exec jupyterhub bash -c "pip install jupyterhub-ldapauthenticator"
```

Simpan skrip ke simpul utama, dan kemudian jalankan dari baris perintah simpul utama. Sebagai contoh, dengan skrip yang disimpan sebagai `configure_ldap_client.sh`, buat file agar dapat dijalankan:

```
chmod +x configure_ldap_client.sh
```

Dan jalankan skrip:

```
./configure_ldap_client.sh
```

## Tambahkan atribut ke Direktori Aktif
<a name="emr-jupyterhub-ldap-adproperties"></a>

Untuk menemukan setiap pengguna dan membuat entri yang sesuai dalam database, wadah JupyterHub docker memerlukan properti UNIX berikut untuk objek pengguna yang sesuai di Active Directory. Untuk informasi lebih lanjut, lihat bagian *Bagaimana cara terus mengedit atribut GID/UID RFC 2307 sekarang karena Plug-in Atribut Unix tidak lagi tersedia untuk snap-in Pengguna Direktori Aktif dan Komputer* MMC? dalam artikel [Klarifikasi mengenai status manajemen identitas untuk peran server Unix (IDMU) dan NIS dalam pratinjau teknis Windows Server 2016](https://blogs.technet.microsoft.com/activedirectoryua/2016/02/09/identity-management-for-unix-idmu-is-deprecated-in-windows-server/) dan seterusnya.
+ `homeDirectory`

  Ini adalah lokasi ke direktori home pengguna, yang biasanya `/home/username`.
+ `gidNumber`

  Ini adalah nilai yang lebih besar dari 60000 yang sudah tidak digunakan oleh pengguna lain. Periksa `etc/passwd` file untuk gids yang digunakan.
+ `uidNumber`

  Ini adalah nilai yang lebih besar dari 60000 yang sudah tidak digunakan oleh grup lain. Periksa `etc/group` file untuk uids yang sedang digunakan.
+ `uid`

  Ini sama dengan*username*.

## Buat direktori home pengguna
<a name="emr-jupyterhub-ldap-directories"></a>

JupyterHub membutuhkan direktori home di dalam wadah untuk mengautentikasi pengguna LDAP dan menyimpan data instance. Contoh berikut menunjukkan dua pengguna, *shirley* dan *diego*, dalam direktori LDAP.

Langkah pertama adalah menanyakan server LDAP untuk setiap id pengguna dan informasi id grup menggunakan [ldapsearch](http://manpages.ubuntu.com/manpages/xenial/man1/ldapsearch.1.html) seperti yang ditunjukkan pada contoh berikut, mengganti *host* dengan alamat IP atau nama host yang dapat diselesaikan dari server LDAP Anda:

```
ldapsearch -x -H ldap://host \
 -D "cn=admin,dc=example,dc=org" \
 -w admin \
 -b "ou=people,dc=example,dc=org" \
 -s sub \
 "(objectclass=*)" uidNumber gidNumber
```

Perintah `ldapsearch` mengembalikan respon LDIF diformat yang terlihat mirip dengan berikut ini untuk pengguna *shirley* dan *diego*.

```
# extended LDIF

# LDAPv3
# base <ou=people,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: uidNumber gidNumber sn 

# people, example.org
dn: ou=people,dc=example,dc=org

# diego, people, example.org
dn: cn=diego,ou=people,dc=example,dc=org
sn: B
uidNumber: 1001
gidNumber: 100

# shirley, people, example.org
dn: cn=shirley,ou=people,dc=example,dc=org
sn: A
uidNumber: 1002
gidNumber: 100

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
```

Menggunakan informasi dari respon, jalankan perintah dalam kontainer untuk membuat direktori home untuk setiap nama umum pengguna (`cn`). Gunakan `uidNumber` dan `gidNumber` untuk memperbaiki kepemilikan direktori home untuk pengguna tersebut. Contoh perintah berikut melakukan ini untuk pengguna*shirley*.

```
sudo docker container exec jupyterhub bash -c "mkdir /home/shirley"
sudo docker container exec jupyterhub bash -c "chown -R $uidNumber /home/shirley"
sudo docker container exec jupyterhub bash -c "sudo chgrp -R $gidNumber /home/shirley"
```

**catatan**  
Authenticator LDAP untuk JupyterHub tidak mendukung pembuatan pengguna lokal. Untuk informasi lebih lanjut, lihat [Catatan konfigurasi autentikator LDAP pada pembuatan pengguna lokal](https://github.com/jupyterhub/ldapauthenticator#configuration-note-on-local-user-creation).   
Untuk membuat pengguna lokal secara manual, gunakan perintah berikut.  

```
sudo docker exec jupyterhub bash -c "echo 'shirley:x:$uidNumber:$gidNumber::/home/shirley:/bin/bash' >> /etc/passwd"
```

## Mulai ulang JupyterHub wadah
<a name="emr-jupyterhub-ldap-restart"></a>

Jalankan perintah berikut untuk memulai ulang `jupyterhub` kontainer:

```
sudo docker stop jupyterhub
sudo docker start jupyterhub
```

# Peniruan pengguna
<a name="emr-jupyterhub-user-impersonation"></a>

Sebuah tugas Spark berjalan di dalam notebook Jupyter melintasi beberapa aplikasi selama pelaksanaannya di Amazon EMR. Misalnya, PySpark 3 kode yang dijalankan pengguna di dalam Jupyter diterima oleh Sparkmagic, yang menggunakan permintaan HTTP POST untuk mengirimkannya ke Livy, yang kemudian membuat pekerjaan Spark untuk dieksekusi di cluster menggunakan YARN.

Secara default, tugas YARN yang dikirimkan dengan cara ini dijalankan sebagai pengguna `livy`, terlepas dari pengguna yang memulai pekerjaan. Dengan menyiapkan *Peniruan pengguna* Anda dapat memiliki ID pengguna dari pengguna notebook yang juga menjadi pengguna yang terkait dengan tugas YARN. Daripada memiliki tugas yang dimulai oleh `shirley` dan `diego` terkait dengan pengguna `livy`, tugas yang dimulai setiap pengguna terkait dengan `shirley` dan `diego` masing-masing. Hal ini membantu Anda untuk melakukan audit penggunaan Jupyter dan mengelola aplikasi dalam organisasi Anda.

Konfigurasi ini hanya didukung bila panggilan dari Sparkmagic ke Livy tidak diautentikasi. Aplikasi yang menyediakan autentikasi atau proksi lapisan antara aplikasi Hadoop dan Livy (seperti Apache Knox Gateway) tidak didukung. Langkah-langkah untuk mengonfigurasi peniruan identitas pengguna di bagian ini mengasumsikan bahwa JupyterHub dan Livy berjalan pada node master yang sama. Jika aplikasi Anda memiliki klaster terpisah, [Langkah 3: Buat direktori home HDFS untuk pengguna](#Step3-UserImpersonation) perlu dimodifikasi agar direktori HDFS bisa dibuat pada simpul utama Livy.

**Topics**
+ [Langkah 1: Konfigurasikan Livy](#Step1-UserImpersonation)
+ [Langkah 2: Tambahkan pengguna](#Step2-UserImpersonation)
+ [Langkah 3: Buat direktori home HDFS untuk pengguna](#Step3-UserImpersonation)

## Langkah 1: Konfigurasikan Livy
<a name="Step1-UserImpersonation"></a>

Anda menggunakan klasifikasi konfigurasi `livy-conf` dan `core-site` ketika membuat klaster untuk mengaktifkan peniruan pengguna Livy seperti yang ditunjukkan dalam contoh berikut. Simpan klasifikasi konfigurasi sebagai JSON dan kemudian referensikan ketika Anda membuat klaster, atau tentukan klasifikasi konfigurasi inline. Untuk informasi selengkapnya, lihat [Konfigurasikan aplikasi](emr-configure-apps.md).

```
[
  {
    "Classification": "livy-conf",
    "Properties": {
      "livy.impersonation.enabled": "true"
    }
  },
  {
    "Classification": "core-site",
    "Properties": {
      "hadoop.proxyuser.livy.groups": "*",
      "hadoop.proxyuser.livy.hosts": "*"
    }
  }
]
```

## Langkah 2: Tambahkan pengguna
<a name="Step2-UserImpersonation"></a>

Tambahkan JupyterHub pengguna menggunakan PAM atau LDAP. Untuk informasi selengkapnya, lihat [Menggunakan autentikasi PAM](emr-jupyterhub-pam-users.md) dan [Menggunakan autentikasi LDAP](emr-jupyterhub-ldap-users.md).

## Langkah 3: Buat direktori home HDFS untuk pengguna
<a name="Step3-UserImpersonation"></a>

Anda terhubung ke simpul utama untuk membuat pengguna. Sementara masih terhubung ke simpul utama, salin isi di bawah ini dan simpan ke file skrip. Skrip membuat direktori rumah HDFS untuk setiap JupyterHub pengguna pada node master. Skrip mengasumsikan Anda menggunakan ID pengguna administrator default,*jovyan*.

```
#!/bin/bash

CURL="curl --silent -k"
HOST=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname)

admin_token() {
    local user=jovyan
    local pwd=jupyter
    local token=$($CURL https://$HOST:9443/hub/api/authorizations/token \
        -d "{\"username\":\"$user\", \"password\":\"$pwd\"}" | jq ".token")
    if [[ $token != null ]]; then
        token=$(echo $token | sed 's/"//g')
    else
        echo "Unable to get Jupyter API Token."
        exit 1
    fi
    echo $token
}

# Get Jupyter Admin token
token=$(admin_token)

# Get list of Jupyter users
users=$(curl -XGET -s -k https://$HOST:9443/hub/api/users \
 -H "Authorization: token $token" | jq '.[].name' | sed 's/"//g')

# Create HDFS home dir 
for user in ${users[@]}; 
do
 echo "Create hdfs home dir for $user"
 hadoop fs -mkdir /user/$user
 hadoop fs -chmod 777 /user/$user
done
```

# Memasang kernel dan pustaka tambahan
<a name="emr-jupyterhub-install-kernels-libs"></a>

Saat Anda membuat cluster dengan EMR JupyterHub Amazon, kernel Python 3 default untuk Jupyter bersama dengan kernel PySpark dan Spark untuk Sparkmagic diinstal pada wadah Docker. Anda bisa memasang kernel tambahan. Anda juga dapat menginstal pustaka tambahan dan paket lalu mengimpornya untuk shell yang sesuai.

## Menginstal sebuah kernel
<a name="emr-jupyterhub-install-kernels"></a>

Kernel dipasang di dalam kontainer Docker. Cara termudah untuk mencapai ini adalah untuk membuat skrip bash dengan instalasi perintah, simpan ke simpul utama, dan kemudian gunakan perintah `sudo docker exec jupyterhub script_name` untuk menjalankan skrip dalam `jupyterhub` kontainer. Contoh skrip berikut menginstal kernel, dan kemudian menginstal beberapa pustaka tersebut untuk kernel di simpul utama sehingga nantinya Anda dapat mengimpor pustaka menggunakan kernel di Jupyter.

```
#!/bin/bash

# Install Python 2 kernel
conda create -n py27 python=2.7 anaconda
source /opt/conda/envs/py27/bin/activate
apt-get update
apt-get install -y gcc
/opt/conda/envs/py27/bin/python -m pip install --upgrade ipykernel
/opt/conda/envs/py27/bin/python -m ipykernel install

# Install libraries for Python 2
/opt/conda/envs/py27/bin/pip install paramiko nltk scipy numpy scikit-learn pandas
```

Untuk menginstal kernel dan pustaka dalam kontainer, buka koneksi terminal ke simpul utama, simpan script ke `/etc/jupyter/install_kernels.sh`, dan jalankan perintah berikut pada baris perintah simpul utama:

```
sudo docker exec jupyterhub bash /etc/jupyter/install_kernels.sh
```

## Menggunakan pustaka dan memasang pustaka tambahan
<a name="emr-jupyterhub-install-libs"></a>

Satu set inti pembelajaran mesin dan perpustakaan ilmu data untuk Python 3 sudah diinstal sebelumnya di JupyterHub Amazon EMR. Anda dapat menggunakan `sudo docker exec jupyterhub bash -c "conda list" ` dan `sudo docker exec jupyterhub bash -c "pip freeze"`.

Jika tugas Spark membutuhkan pustaka pada simpul pekerja, kami sarankan Anda menggunakan tindakan bootstrap untuk menjalankan skrip untuk menginstal pustaka ketika Anda membuat klaster. Tindakan bootstrap berjalan pada semua simpul utama selama proses pembuatan klaster, yang menyederhanakan instalasi. Jika Anda menginstal pustaka pada simpul inti/pekerja setelah klaster berjalan, operasi lebih kompleks. Kami menyediakan contoh program Python di bagian ini yang menunjukkan cara menginstal pustaka ini.

Tindakan bootstrap dan contoh program Python yang ditampilkan di bagian ini menggunakan skrip bash yang disimpan ke Amazon S3 untuk menginstal pustaka pada semua simpul.

Skrip direferensikan dalam contoh berikut menggunakan `pip` untuk menginstal paramiko, nltk, scipy, scikit-learn, dan for the Python 3 kernel:

```
#!/bin/bash

sudo python3 -m pip install boto3 paramiko nltk scipy scikit-learn pandas
```

Setelah Anda membuat skrip, unggah ke lokasi di Amazon S3, misalnya, `s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh`. Untuk informasi selengkapnya, lihat [Mengunggah objek](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html) di *Panduan Pengguna Layanan Penyimpanan Sederhana Amazon* sehingga Anda dapat menggunakannya dalam tindakan bootstrap atau dalam program Python Anda.

**Untuk menentukan tindakan bootstrap yang menginstal pustaka di semua node saat Anda membuat klaster menggunakan AWS CLI**

1. Buat skrip yang mirip dengan contoh sebelumnya dan simpan ke lokasi di Amazon S3. Kami menggunakan contoh `s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh`.

1. Buat cluster dengan JupyterHub dan gunakan `Path` argumen `--bootstrap-actions` opsi untuk menentukan lokasi skrip seperti yang ditunjukkan pada contoh berikut:
**catatan**  
Karakter lanjutan baris Linux (\$1) disertakan agar mudah dibaca Karakter ini bisa dihapus atau digunakan dalam perintah Linux. Untuk Windows, hapus atau ganti dengan tanda sisipan (^).

   ```
   aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \
   --applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \
   --use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \
   --bootstrap-actions Path=s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh,Name=InstallJupyterLibs
   ```

**Untuk menentukan tindakan bootstrap yang menginstal pustaka pada semua simpul ketika Anda membuat sebuah klaster menggunakan konsol**

1. Arahkan ke konsol EMR Amazon baru dan pilih **Beralih ke konsol lama** dari navigasi samping. Untuk informasi selengkapnya tentang apa yang diharapkan saat beralih ke konsol lama, lihat [Menggunakan konsol lama](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in).

1. Pilih **Buat klaster**, **Buka opsi lanjutan**.

1. Tentukan pengaturan untuk **Perangkat Lunak dan Langkah** dan **Perangkat Keras** yang sesuai untuk aplikasi Anda.

1. Pada **Pengaturan Klaster Umum** layar, perluas **Tindakan Bootstrap**.

1. Untuk **Menambahkan tindakan bootstrap**, pilih **Tindakan kustom**, **Konfigurasikan dan tambahkan**.

1. Untuk **Nama**, masukkan nama yang ramah. Untuk **lokasi Script**, masukkan lokasi di Amazon S3 skrip Anda (contoh yang kami gunakan adalah *s3://amzn-s3-demo-bucket/ install-my-jupyter-libraries .sh*). Biarkan **Pendapat opsional** kosong, dan pilih **Tambahkan**.

1. Tentukan pengaturan lain untuk klaster Anda, dan pilih **Selanjutnya**.

1. Tentukan pengaturan keamanan, dan pilih **Buat Klaster**.

**Example Menginstal pustaka pada simpul inti dari sebuah klaster berjalan**  
Setelah Anda menginstal pustaka pada simpul utama dari dalam Jupyter, Anda dapat menginstal pustaka pada simpul utama yang sedang dalam berbagai cara. Contoh berikut menunjukkan program Python yang ditulis untuk berjalan pada mesin lokal. Ketika Anda menjalankan program Python secara lokal, ia menggunakan `AWS-RunShellScript` dari AWS Systems Manager untuk menjalankan skrip contoh, yang ditunjukkan sebelumnya di bagian ini, yang menginstal pustaka pada node inti cluster.  

```
import argparse
import time
import boto3


def install_libraries_on_core_nodes(cluster_id, script_path, emr_client, ssm_client):
    """
    Copies and runs a shell script on the core nodes in the cluster.

    :param cluster_id: The ID of the cluster.
    :param script_path: The path to the script, typically an Amazon S3 object URL.
    :param emr_client: The Boto3 Amazon EMR client.
    :param ssm_client: The Boto3 AWS Systems Manager client.
    """
    core_nodes = emr_client.list_instances(
        ClusterId=cluster_id, InstanceGroupTypes=["CORE"]
    )["Instances"]
    core_instance_ids = [node["Ec2InstanceId"] for node in core_nodes]
    print(f"Found core instances: {core_instance_ids}.")

    commands = [
        # Copy the shell script from Amazon S3 to each node instance.
        f"aws s3 cp {script_path} /home/hadoop",
        # Run the shell script to install libraries on each node instance.
        "bash /home/hadoop/install_libraries.sh",
    ]
    for command in commands:
        print(f"Sending '{command}' to core instances...")
        command_id = ssm_client.send_command(
            InstanceIds=core_instance_ids,
            DocumentName="AWS-RunShellScript",
            Parameters={"commands": [command]},
            TimeoutSeconds=3600,
        )["Command"]["CommandId"]
        while True:
            # Verify the previous step succeeded before running the next step.
            cmd_result = ssm_client.list_commands(CommandId=command_id)["Commands"][0]
            if cmd_result["StatusDetails"] == "Success":
                print(f"Command succeeded.")
                break
            elif cmd_result["StatusDetails"] in ["Pending", "InProgress"]:
                print(f"Command status is {cmd_result['StatusDetails']}, waiting...")
                time.sleep(10)
            else:
                print(f"Command status is {cmd_result['StatusDetails']}, quitting.")
                raise RuntimeError(
                    f"Command {command} failed to run. "
                    f"Details: {cmd_result['StatusDetails']}"
                )


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("cluster_id", help="The ID of the cluster.")
    parser.add_argument("script_path", help="The path to the script in Amazon S3.")
    args = parser.parse_args()

    emr_client = boto3.client("emr")
    ssm_client = boto3.client("ssm")

    install_libraries_on_core_nodes(
        args.cluster_id, args.script_path, emr_client, ssm_client
    )


if __name__ == "__main__":
    main()
```

# JupyterHub riwayat rilis
<a name="JupyterHub-release-history"></a>

Tabel berikut mencantumkan versi yang JupyterHub disertakan dalam setiap versi rilis Amazon EMR, bersama dengan komponen yang diinstal dengan aplikasi. Untuk versi komponen di setiap rilis, lihat bagian Versi Komponen untuk rilis Anda di[Amazon EMR 7.x versi rilis](emr-release-7x.md),[Amazon EMR versi rilis 6.x](emr-release-6x.md), atau[Amazon EMR versi rilis 5.x](emr-release-5x.md).


**JupyterHub informasi versi**  

| Label Rilis Amazon EMR | JupyterHub Versi | Komponen Dipasang Dengan JupyterHub | 
| --- | --- | --- | 
| emr-7.12.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.11.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-hdfs-zkfc, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.10.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.9.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.8.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.7.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.6.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.5.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.4.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.3.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.2.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.2 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.1.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-7.0.0 | 1.5.0 | emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.15.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.14.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.13.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.12.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.11.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.11.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.10.1 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.10.0 | 1.5.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.9.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.9.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.8.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.8.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.7.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.1 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.36.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.6.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, hudi, hudi-spark, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.35.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.5.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.4.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.3.1 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.3.0 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.2.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.2.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.1.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.1.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.0.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-6.0.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.34.0 | 1.4.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.33.1 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.33.0 | 1.2.2 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.32.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.32.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.31.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.31.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.2 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.1 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.30.0 | 1.1.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.29.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.28.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.28.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.27.1 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.27.0 | 1.0.0 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.26.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.25.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.24.1 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.24.0 | 0.9.6 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.23.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.23.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.22.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.2 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.21.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.20.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.20.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.19.1 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.19.0 | 0.9.4 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.18.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.18.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.2 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.17.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.16.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.16.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.15.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.15.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.2 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.1 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 
| emr-5.14.0 | 0.8.1 | aws-sagemaker-spark-sdk, emrfs, emr-goodies, emr-ddb, hadoop-client, hadoop-hdfs-datanode, hadoop-hdfs-library, hadoop-hdfs-namenode, hadoop-kms-server, hadoop-yarn-nodemanager, hadoop-yarn-resourcemanager, hadoop-yarn-timeline-server, r, spark-client, spark-history-server, spark-on-yarn, spark-yarn-slave, livy-server, jupyterhub | 