

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

# 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 (\\) 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()
```