通过我的EMR笔记本,我在处理额外的库时遇到了令人惊讶的困难。用于EMR的AWS接口允许我创建Jupyter笔记本并将它们附加到正在运行的集群。我想在其中使用其他库。SSHing into the machines and installing manually asec2-userorroot将无法将库提供给笔记本电脑,因为它显然使用了livy用户。引导操作安装hadoop的内容。我无法从笔记本安装,因为它的用户显然没有sudogit等,而且它可能无论如何也不会安装到从机。
为通过EMR接口创建的笔记本安装附加库的规范方法是什么?

最佳答案

为了一个例子,假设在运行EMR集群时需要librosaPython模块。我们将使用Python2.7,因为过程更简单-Python2.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系统管理器在节点上执行脚本。
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]

关于bash - EMR笔记本安装其他库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54697280/

10-12 23:37