【问题标题】:Copying/using Python files from S3 to Amazon Elastic MapReduce at bootstrap time在引导时将 Python 文件从 S3 复制/使用到 Amazon Elastic MapReduce
【发布时间】:2013-08-20 14:21:19
【问题描述】:

我已经弄清楚如何在引导步骤使用 boto 安装 python 包(numpy 等),以及将文件从 S3 复制到我的 EC2 实例,仍然使用 boto。

我还没有弄清楚如何使用 boto 将 python 脚本(或任何文件)从 S3 存储桶分发到每个 EMR 实例。有什么指点吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-ec2 boto elastic-map-reduce


    【解决方案1】:

    如果您使用的是 boto,我建议您将所有 Python 文件打包成一个存档(.tar.gz 格式),然后使用 Hadoop/EMR 中的 cacheArchive 指令来访问它。

    这就是我的工作:

    1. 将所有必要的 Python 文件放在一个子目录中,例如“required/”并在本地进行测试。
    2. 为此创建一个存档:cd required && tar czvf required.tgz *
    3. 将此存档上传到 S3:s3cmd put required.tgz s3://yourBucket/required.tgz
    4. 将此命令行选项添加到您的步骤中:-cacheArchive s3://yourBucket/required.tgz#required

    最后一步将确保包含 Python 代码的存档文件与本地开发机器中的目录格式相同。

    要在 boto 中实际执行第 4 步,代码如下:

    step = StreamingStep(name=jobName,
      mapper='...',
      reducer='...',
      ...
      cache_archives=["s3://yourBucket/required.tgz#required"],
    )
    conn.add_jobflow_steps(jobID, [step])
    

    为了让 Python 中的导入代码在您的映射器中正常工作,请确保像引用子目录一样引用它:

    sys.path.append('./required')
    import myCustomPythonClass
    
    # Mapper: do something!
    

    【讨论】:

    • 谢谢!完美运行。我理解正确吗? : Hadoop/EMR 需要对所有必要文件进行 tgz 压缩,并且 -cacheArchive 选项 s3://yourBucket/required.tgz#required 定义了 hdfs 上的目标提取目录 (./required)。
    • 好问题。我实际上不确定是否需要 TGZ;我已经看到使用 TGZ 的示例,因此我自己也将这种格式用于 Hadoop/EMR。我的理解是,通过 -cacheArchive 规范,Hadoop/EMR 确实会下载指定的 TGZ 文件并将其解压缩到 HDFS 上的指定目录中,因此它可以作为本地文件提供给您的流映射器。
    • 我现在已经使用您上面指出的步骤运行了几个 emr 作业,并且全部完成:tgz 现在是我最喜欢的压缩方案...
    • 哈哈很好,很高兴它有帮助! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2020-07-26
    相关资源
    最近更新 更多