web-dev-qa-db-ja.com

EMRノートブックは追加のライブラリをインストールします

EMRノートブックを使用して追加のライブラリを操作するのは驚くほど大変です。 EMRのAWSインターフェイスを使用すると、Jupyterノートブックを作成し、実行中のクラスターに接続できます。それらで追加のライブラリを使用したいと思います。マシンにSSHで接続し、ec2-userまたはrootとして手動でインストールしても、明らかにlivyユーザーを使用しているため、ノートブックでライブラリを使用できません。 Bootstrapアクションはhadoopのインストールを実行します。ユーザーのSudogitがないため、ノートブックからインストールできません、など、それはおそらくとにかくスレーブにインストールされません。

EMRインターフェイスを介して作成されたノートブック用の追加ライブラリをインストールする標準的な方法は何ですか?

16
Walrus the Cat

例として、librosa Python module onrunningEMR clusterが必要であると仮定しましょう。Python 2.7は手順が簡単であるため使用します-Python 2.7はクラスター上にあることが保証されており、これがEMRのデフォルトのランタイムです。

パッケージをインストールするスクリプトを作成します。

#!/bin/bash
Sudo easy_install-2.7 pip
Sudo /usr/local/bin/pip2 install librosa

そしてそれをあなたのホームディレクトリに保存してください。 /home/hadoop/install_librosa.sh。名前を書き留めます。後で使用します。

次のステップでは、このスクリプトを Amazon EMR docsemr_install.pyに触発された別のスクリプトで実行します。 AWS Systems Managerを使用して、ノード上でスクリプトを実行します。

import time
from boto3 import client
from sys import argv

try:
  clusterId=argv[1]
except:
  print("Syntax: emr_install.py [ClusterId]")
  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')

    # Run Shell script to install libraries

command=ssmclient.send_command(Targets=[{"Key": "tag:environment", "Values":["coreNodeLibs"]}],
                               DocumentName='AWS-RunShellScript',
                               Parameters={"commands":["bash /home/hadoop/install_librosa.sh"]},
                               TimeoutSeconds=3600)['Command']['CommandId']

command_status=ssmclient.list_commands(
  CommandId=command,
  Filters=[
      {
          'key': 'Status',
          'value': 'SUCCESS'
      },
  ]
)['Commands'][0]['Status']

time.sleep(30)

print("Command:" + command + ": " + command_status)

それを実行するには:

python emr_install.py [cluster_id]

1

この場合、私は通常、クラスターを削除し、bootstrapアクションで新しいクラスターを作成します。Bootstrapアクションを使用すると、クラスターに追加のライブラリーをインストールできます。 https://docs.aws.Amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html 。たとえば、次のスクリプトを記述してS3に保存すると、datadogを使用できるようになりますクラスターの上で実行しているノートブックから(少なくともEMR 5.19で動作します):

#!/bin/bash -xe
#install datadog module for using in pyspark
Sudo pip-3.4 install -U datadog

このクラスターを起動するために実行するコマンドラインは次のとおりです。

aws emr create-cluster --release-label emr-5.19.0 \
--name 'EMR 5.19 test' \
--applications Name=Hadoop Name=Spark Name=Hive Name=Livy \
--use-default-roles \
--instance-groups \
InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.large \
InstanceGroupType=CORE,InstanceCount=2,InstanceType=m4.large \
--region eu-west-1 \
--log-uri s3://<path-to-logs> \
--configurations file://config-emr.json \
--bootstrap-actions Path=s3://<path-to-bootstrap-in-aws>,Name=InstallPythonModules

そして、コンピューターのローカルに保存されているconfig-emr.json:

[{
    "Classification": "spark",
    "Properties": {
    "maximizeResourceAllocation": "true"
    }
},
{
    "Classification": "spark-env",
    "Configurations": [
    {
        "Classification": "export",
        "Properties": {
            "PYSPARK_PYTHON": "/usr/bin/python3"
        }
    }
    ]
}]   

EMRインターフェースを介してクラスターを作成する場合も、作成の詳細オプションを使用して、まったく同じことができると思います。

1
Sacha

EMRインターフェイスを介して作成されたノートブック用の追加ライブラリをインストールする正規の方法は何ですか?

EMR Notebooksは最近 'notebook-scoped libraries'を起動しました。これを使用して、追加のPythonライブラリをパブリックまたはプライベートPyPIリポジトリからクラスターにインストールし、ノートブックセッション内で使用できます。

ノートブックスコープのライブラリには、次の利点があります。

  • クラスターを再作成したり、ノートブックをクラスターに再接続したりすることなく、EMRノートブックでライブラリを使用できます。
  • EMRノートブックのライブラリの依存関係を個々のノートブックセッションに分離できます。ノートブック内からインストールされたライブラリは、クラスター上の他のライブラリまたは他のノートブックセッション内にインストールされたライブラリと干渉することはできません。

詳細はこちら https://docs.aws.Amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks-scoped-libraries.html

テクニカルブログ: https://aws.Amazon.com/blogs/big-data/install-python-libraries-on-a-running-cluster-with-emr-notebooks/

1
Parag Chaudhari