Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

安装其他内核和库

当创建包含 JupyterHub on Amazon EMR 的集群时,将在 Docker 容器上安装适用于 Jupyter 的默认 Python 3 内核和适用于 Sparkmagic 的 PySpark、SparkR 和 Spark 内核。可以安装其他内核。还可以安装其他库和软件包,然后将它们导入相应的 shell。

安装内核

内核安装在 Docker 容器中。安装内核最简单的方式是,创建包含安装命令的清除脚本,将脚本保存到主节点,然后使用 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 Python2 /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

使用库和安装其他库

JupyterHub on Amazon EMR 上预安装有适用于 Python 3 的一组核心的机器学习和数据科学库。可以使用 sudo docker exec jupyterhub bash -c "conda list" sudo docker exec jupyterhub bash -c "pip freeze"

如果 Spark 作业需要工作线程节点上的库,建议使用引导操作运行脚本以在创建集群时安装库。集群创建过程中,引导操作将在所有集群节点上运行,这将简化安装。如果于集群运行后在核心/工作线程节点上安装库,则操作更复杂。我们在此部分中提供了示例 Python 程序以演示如何安装这些库。

此部分中演示的引导操作和 Python 程序示例都使用保存到 Amazon S3 的清除脚本在所有节点上安装库。此脚本使用 easy_install-3.4 安装 pip,然后使用 pip 安装库。指定了 easy_install 版本 3.4,因为默认情况下,所有集群实例上安装的是 Python 版本 3.4 以及版本 2.7。

以下示例中引用的脚本将安装适用于 Python 3 内核的 paramiko、nltk、scipy、scikit-learn 和 pandas:

#!/bin/bash sudo easy_install-3.4 pip sudo /usr/local/bin/pip3 install paramiko nltk scipy scikit-learn pandas

创建脚本后,将其上传到 Amazon S3 中的位置(例如,s3://mybucket/install-my-jupyter-libraries.sh)。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南中的如何将文件和文件夹上传至 S3 存储桶,以便可以在引导操作或 Python 程序中使用此脚本。

指定将在使用 AWS CLI 创建集群时在所有节点上安装库的引导操作

  1. 创建与之前的示例类似的脚本并将脚本保存在 Amazon S3 中的位置。我们将使用示例 s3://mybucket/install-my-jupyter-libraries.sh

  2. 创建包含 JupyterHub 的集群并使用 --bootstrap-actions 选项的 Path 参数指定脚本位置,如以下示例所示:

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.23.0 \ --applications Name=JupyterHub --log-uri s3://MyBucket/MyJupyterClusterLogs \ --use-default-roles --instance-type m4.large --instance-count 2 --ec2-attributes KeyName=MyKeyPair \ --bootstrap-actions Path=s3://mybucket/install-my-jupyter-libraries.sh,Name=InstallJupyterLibs

指定将在使用 AWS CLI 创建集群时在所有节点上安装库的引导操作

  1. 通过以下网址打开 Amazon EMR 控制台:https://console.amazonaws.cn/elasticmapreduce/

  2. Choose Create cluster, Go to advanced options.

  3. 根据应用程序的情况,指定 Software and Steps (软件和步骤)Hardware (硬件) 的设置。

  4. General Cluster Settings (常规集群设置) 屏幕上,展开 Bootstrap Actions (引导操作)

  5. 对于 Add bootstrap action (添加引导操作),选择 Custom action (自定义操作)Configure and add (配置和添加)

  6. 对于 Name (名称),输入一个易于理解的名称。对于 Script location (脚本位置),输入 Amazon S3 中脚本的位置(例如,我们使用的位置为 s3://mybucket/install-my-jupyter-libraries.sh)。保留 Optional arguments (可选参数) 为空,然后选择 Add (添加)

  7. 指定集群的其他设置,然后选择 Next (下一步)

  8. 指定安全设置,然后选择 Create cluster (创建集群)

例 在运行集群的核心节点上安装库

在 Jupyter 内的主节点上安装库之后,可以通过不同的方式将库安装在运行的核心节点上。以下示例显示了编写为在本地计算机上运行的 Python 程序。当在本地运行 Python 程序时,此程序将使用 AWS Systems Manager 的 AWS-RunShellScript 运行此节中之前所示的示例脚本,从而在集群的核心节点上安装库。

# Install Python libraries on running cluster nodes from boto3 import client from sys import argv try: clusterId=argv[1] script=argv[2] except: print("Syntax: librariesSsm.py [ClusterId] [S3_Script_Path]") import sys sys.exit(1) emrclient=client('emr') # Get list of core nodes instances=emrclient.list_instances(ClusterId=clusterId,InstanceGroupTypes=['CORE'])['Instances'] instance_list=[x['Ec2InstanceId'] for x in instances] # Attach tag to core nodes ec2client=client('ec2') ec2client.create_tags(Resources=instance_list,Tags=[{"Key":"environment","Value":"coreNodeLibs"}]) ssmclient=client('ssm') # Download shell script from S3 command = "aws s3 cp " + script + " /home/hadoop" try: first_command=ssmclient.send_command(Targets=[{"Key":"tag:environment","Values":["coreNodeLibs"]}], DocumentName='AWS-RunShellScript', Parameters={"commands":[command]}, TimeoutSeconds=3600)['Command']['CommandId'] # Wait for command to execute import time time.sleep(15) first_command_status=ssmclient.list_commands( CommandId=first_command, Filters=[ { 'key': 'Status', 'value': 'SUCCESS' }, ] )['Commands'][0]['Status'] second_command="" second_command_status="" # Only execute second command if first command is successful if (first_command_status=='Success'): # Run shell script to install libraries second_command=ssmclient.send_command(Targets=[{"Key":"tag:environment","Values":["coreNodeLibs"]}], DocumentName='AWS-RunShellScript', Parameters={"commands":["bash /home/hadoop/install_libraries.sh"]}, TimeoutSeconds=3600)['Command']['CommandId'] second_command_status=ssmclient.list_commands( CommandId=first_command, Filters=[ { 'key': 'Status', 'value': 'SUCCESS' }, ] )['Commands'][0]['Status'] time.sleep(30) print("First command, " + first_command + ": " + first_command_status) print("Second command:" + second_command + ": " + second_command_status) except Exception as e: print(e)