Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将文件上载到新的EMR群集_Python_Amazon Web Services_Apache Spark_Emr - Fatal编程技术网

Python 如何将文件上载到新的EMR群集

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脚本的参考,但

我想创建一个新的EMR集群,运行一个PySpark作业并销毁它。理想情况下,我希望在创建集群时添加一个步骤。我将在本地运行以启动作业的命令如下所示:

#!/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格式的文件,您可以使用它!尽管如此,仍有一些管道系统可供使用。