Python 如何将文件上载到新的EMR群集
我想创建一个新的EMR集群,运行一个PySpark作业并销毁它。理想情况下,我希望在创建集群时添加一个步骤。我将在本地运行以启动作业的命令如下所示:Python 如何将文件上载到新的EMR群集,python,amazon-web-services,apache-spark,emr,Python,Amazon Web Services,Apache Spark,Emr,我想创建一个新的EMR集群,运行一个PySpark作业并销毁它。理想情况下,我希望在创建集群时添加一个步骤。我将在本地运行以启动作业的命令如下所示: #!/bin/bash echo "Copying ${1} to ${2}" hadoop fs -copyToLocal ${1} ${2} spark submit calculate.py--输入x.csv--输出输出 我不明白的是如何确保calculate.py在主节点上已经可用。我看到了一个从S3存储桶读取python脚本的参考,但
#!/bin/bash
echo "Copying ${1} to ${2}"
hadoop fs -copyToLocal ${1} ${2}
spark submit calculate.py--输入x.csv--输出输出
我不明白的是如何确保calculate.py在主节点上已经可用。我看到了一个从S3存储桶读取python脚本的参考,但我无法让它正常工作
现在我有了单独的命令来创建集群,将脚本放在主节点上并添加步骤。这样做的问题是,集群在作业步骤完成后会继续运行。一种方法是通过引导操作将所需文件复制到节点上。我们有一个小的shell脚本,s3-to-local.sh,它位于s3上的一个bucket中,可以实现这一点。该脚本非常简单,如下所示:
#!/bin/bash
echo "Copying ${1} to ${2}"
hadoop fs -copyToLocal ${1} ${2}
在我的createcluster
命令中,添加引导操作:
aws --profile myProfile create-cluster \
--name "My cluster name" \
--auto-terminate \
--bootstrap-actions Path=s3://path/to/s3-to-local.sh,Name=copy-file,Args=[s3://path/to/file.ext,/local/filepath/file.ext] \
--steps ...
文件.ext被复制到我的EMR集群的节点上
对于未终止的集群,您可以像上面一样添加自动终止
标志。这将导致在完成所有步骤后终止集群
请注意,还有其他方法,但这是一种简单且非常直接的方法。它可以工作:)我通过创建一个额外的步骤来解决这个问题,该步骤只需调用hadoop fs-copyToLocal来下载文件 我在引导步骤中遇到了一个问题,hadoop命令还没有安装 使用boto3的完整工作示例:
import boto3
client = boto3.client('emr', region_name='eu-central-1')
cluster_id = client.run_job_flow(
Name='My job',
LogUri='s3://my-bucket/emr-logs/',
ReleaseLabel='emr-4.0.0',
Instances={
'MasterInstanceType': 'm3.xlarge',
'SlaveInstanceType': 'm3.xlarge',
'InstanceCount': 2,
'Ec2KeyName': 'my_key',
'Ec2SubnetId': 'subnet-123456'
},
Applications=[
{
'Name': 'Spark'
}
],
Steps=[
{
'Name': 'Copy files to master',
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': [
'hadoop',
'fs',
'-copyToLocal',
'%s/code/*' % S3_BUCKET,
'/home/hadoop/'
]
}
},
{
'Name': 'Calculate step',
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': [
'spark-submit',
'/home/hadoop/calculate.py',
'--param',
'value'
]
}
}
],
VisibleToAllUsers=True,
JobFlowRole='EMR_EC2_DefaultRole',
ServiceRole='EMR_DefaultRole')
print cluster_id
您必须使用s3,或者如果您在远程服务器上有HDFS格式的文件,您可以使用它!尽管如此,仍有一些管道系统可供使用。