

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

# 추가 커널 및 라이브러리 설치
<a name="emr-jupyterhub-install-kernels-libs"></a>

Amazon EMR에서 JupyterHub를 포함하는 클러스터를 생성하는 경우, Jupyter용 기본 Python 3 커널 및 Sparkmagic용 PySpark 및 Spark 커널이 Docker 컨테이너에 설치됩니다. 추가 커널을 설치할 수 있으며, 추가 라이브러리 및 패키지를 설치한 다음 해당 셸을 위해 이를 가져올 수도 있습니다.

## 커널 설치
<a name="emr-jupyterhub-install-kernels"></a>

커널은 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
```

## 라이브러리 사용 및 추가 라이브러리 설치
<a name="emr-jupyterhub-install-libs"></a>

핵심 기계 학습 세트 및 Python 3용 데이터 과학 라이브러리는 Amazon EMR에 JupyterHub와 함께 사전 설치되어 있습니다. `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 사용 설명서*에서 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하세요.

**를 사용하여 클러스터를 생성할 때 모든 노드에 라이브러리를 설치하는 부트스트랩 작업을 지정하려면 AWS CLI**

1. 앞의 예제와 유사한 스크립트를 생성하고 이를 Amazon S3의 위치에 저장합니다. 이 예에서는 `s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh`를 사용합니다.

1. JupyterHub를 포함하는 클러스터를 생성하고 `--bootstrap-actions` 옵션의 `Path` 인수를 사용하여 다음 예제에 표시된 대로 스크립트 위치를 지정합니다.
**참고**  
가독성을 위해 Linux 줄 연속 문자(\$1)가 포함됩니다. 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 콘솔로 이동하고 측면 탐색에서 **이전 콘솔로 전환**을 선택합니다. 이전 콘솔로 전환할 때 예상되는 사항에 대한 자세한 내용은 [이전 콘솔 사용](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)을 참조하세요.

1. **클러스터 생성** 및 **고급 옵션으로 이동**을 선택합니다.

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

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

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

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

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

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

**Example 실행 중인 클러스터의 코어 노드에 라이브러리 설치**  
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()
```