추가 커널 및 라이브러리 설치 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

추가 커널 및 라이브러리 설치

Amazon JupyterHub 에서 를 사용하여 클러스터를 생성하면 기본 EMRPython 3 kernel for Jupyter PySpark 와 Sparkmagic 및 Spark kernels for Sparkmagic이 Docker 컨테이너에 설치됩니다. 추가 커널을 설치할 수 있으며, 추가 라이브러리 및 패키지를 설치한 다음 해당 셸을 위해 이를 가져올 수도 있습니다.

커널 설치

커널은 Docker 컨테이너 내에 설치됩니다. 이를 수행하는 가장 쉬운 방법은 설치 명령이 포함된 bash 스크립트를 작성하고, 이를 마스터 노드에 저장한 다음, sudo docker exec jupyterhub script_name 명령을 사용하여 jupyterhub 컨테이너 내에서 스크립트를 실행하는 것입니다. 다음 스크립트 예에서는 커널을 설치한 다음 해당 커널용 라이브러리 몇 개를 마스터 노드에 설치하여 사용자가 나중에 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

컨테이너 내에 커널 및 라이브러리를 설치하려면 마스터 노드에 대한 터미널 연결을 열고, 스크립트를 /etc/jupyter/install_kernels.sh에 저장한 다음, 마스터 노드 명령줄에서 다음 명령을 실행합니다.

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

라이브러리 사용 및 추가 라이브러리 설치

Python 3용 기계 학습 및 데이터 과학 라이브러리의 코어 세트는 Amazon JupyterHub 에 에 사전 설치되어 있습니다EMR. sudo docker exec jupyterhub bash -c "conda list" sudo docker exec jupyterhub bash -c "pip freeze"를 사용할 수 있습니다.

Spark 작업에서 작업자 노드에 있는 라이브러리를 필요로 하는 경우, 부트스트랩 작업을 사용하여 클러스터 생성 시 라이브러리를 설치하는 스크립트를 실행하는 것이 좋습니다. 부트스트랩 작업은 클러스터 생성 프로세서 중에 모든 클러스터 노드에서 실행되므로 설치 작업을 간소화해 줍니다. 클러스터 실행 후 코어/작업자 노드에 라이브러리를 설치하는 경우, 작업이 더 복잡합니다. 이 단원에서는 이러한 라이브러리 설치 방법을 보여주는 Python 예제 프로그램이 제공됩니다.

이 섹션에 표시된 부트스트랩 작업 및 Python 프로그램에서는 Amazon S3에 저장된 bash 스크립트를 사용하여 모든 노드에 라이브러리를 설치합니다.

다음 예제에서 참조되는 스크립트는 pip를 사용하여 Python 3 커널용 paramiko, nltk, scipy, scikit-learn, pandas를 설치합니다.

#!/bin/bash sudo python3 -m pip install boto3 paramiko nltk scipy scikit-learn pandas

스크립트를 생성했으면 이를 Amazon S3의 위치(예: s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh)에 업로드합니다. 부트스트랩 작업이나 Python 프로그램에서 사용할 수 있도록 자세한 내용은 Amazon Simple Storage Service 사용 설명서에서 객체 업로드를 참조하세요.

를 사용하여 클러스터를 생성할 때 모든 노드에 라이브러리를 설치하는 부트스트랩 작업을 지정하려면 AWS CLI
  1. 앞의 예제와 유사한 스크립트를 생성하고 이를 Amazon S3의 위치에 저장합니다. 이 예에서는 s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh를 사용합니다.

  2. 로 클러스터를 생성하고 --bootstrap-actions 옵션의 Path 인수를 JupyterHub 사용하여 다음 예제와 같이 스크립트 위치를 지정합니다.

    참고

    가독성을 위해 Linux 줄 연속 문자(\)가 포함됩니다. Linux 명령에 사용하거나 제외할 수 있습니다. Windows에서는 제외시키거나 캐럿(^)으로 바꿉니다.

    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
콘솔을 사용하여 클러스터 생성 시 모든 노드에 라이브러리를 설치하는 부트스트랩 작업을 지정하려면
  1. 새 Amazon EMR 콘솔로 이동하여 측면 탐색에서 이전 콘솔로 전환을 선택합니다. 이전 콘솔로 전환할 때 예상되는 사항에 대한 자세한 내용은 이전 콘솔 사용을 참조하세요.

  2. 클러스터 생성Go to advanced options(고급 옵션으로 이동)를 선택합니다.

  3. 소프트웨어 및 단계하드웨어의 설정을 애플리케이션에 적절하게 지정합니다.

  4. 일반 클러스터 설정 화면에서 부트스트랩 작업을 확장합니다.

  5. 부트스트랩 작업 추가에서 사용자 지정 작업, 구성 및 추가를 선택합니다.

  6. 명칭에 기억하기 쉬운 명칭을 입력합니다. 스크립트 위치 에 스크립트의 Amazon S3에 위치를 입력합니다(사용하는 예는 s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh ). 선택적 인수를 비워 두고 추가를 선택합니다.

  7. 클러스터에 대한 다른 설정을 지정하고 다음을 선택합니다.

  8. 보안 설정을 지정하고 클러스터 생성을 선택합니다.

예 실행 중인 클러스터의 코어 노드에 라이브러리 설치

Jupyter 내의 마스터 노드에 라이브러리를 설치했으면 다양한 방법으로 실행 중인 코어 노드에 라이브러리를 설치할 수 있습니다. 다음 예제에서는 로컬 컴퓨터에서 실행하도록 작성된 Python 프로그램을 보여줍니다. Python 프로그램을 로컬에서 실행할 때 AWS-RunShellScript의 AWS Systems Manager 를 사용하여 클러스터의 코어 노드에 라이브러리를 설치하는 이 섹션의 앞부분에 표시된 예제 스크립트를 실행합니다.

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