Memasang kernel dan pustaka tambahan - Amazon EMR

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

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

Menginstal sebuah kernel

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

Satu set inti machine learning dan pustaka ilmu data untuk Python 3 sudah diinstal sebelumnya dengan JupyterHub di 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://mybucket/install-my-jupyter-libraries.sh. Untuk informasi selengkapnya, lihat Mengunggah objek di Panduan Pengguna Amazon Simple Storage Service sehingga Anda dapat menggunakannya dalam tindakan bootstrap Anda atau dalam program Python Anda.

Untuk menentukan tindakan bootstrap yang menginstal perpustakaan pada semua simpul ketika Anda membuat sebuah klaster menggunakan AWS CLI
  1. Buat skrip yang mirip dengan contoh sebelumnya dan simpan ke lokasi di Amazon S3. Kami menggunakan contoh s3://mybucket/install-my-jupyter-libraries.sh.

  2. Buat klaster dengan JupyterHub dan gunakanPath 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.0 \ --applications Name=JupyterHub --log-uri s3://MyBucket/MyJupyterClusterLogs \ --use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \ --bootstrap-actions Path=s3://mybucket/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. Buka konsol Amazon EMR di https://console.aws.amazon.com/emr.

  2. Pilih Buat klaster, Buka opsi lanjutan.

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

  4. Pada Pengaturan Klaster Umum layar, perluas Tindakan Bootstrap.

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

  6. Untuk Nama, masukkan nama yang ramah. Untuk Lokasi skrip, masukkan lokasi di Amazon S3 skrip Anda (contoh yang kita gunakan adalah s3://mybucket/install-my-jupyter-libraries .sh). Biarkan Pendapat opsional kosong, dan pilih Tambahkan.

  7. Tentukan pengaturan lain untuk klaster Anda, dan pilih Selanjutnya.

  8. Tentukan pengaturan keamanan, dan pilih Buat Klaster.

contoh 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 ditampilkan sebelumnya dalam bagian ini, yang menginstal pustaka di simppul utama klaster.

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()