【问题标题】:How to bootstrap installation of Python modules on Amazon EMR?如何在 Amazon EMR 上引导安装 Python 模块?
【发布时间】:2015-10-10 01:52:49
【问题描述】:

我想做一些非常基本的事情,只需通过 EMR 控制台启动 Spark 集群并运行依赖于 Python 包的 Spark 脚本(例如,Arrow)。最直接的方法是什么?

【问题讨论】:

    标签: python amazon-web-services apache-spark emr


    【解决方案1】:

    最直接的方法是创建一个包含安装命令的 bash 脚本,将其复制到 S3,然后从控制台设置引导操作以指向您的脚本。

    这是我在生产中使用的示例:

    s3://mybucket/bootstrap/install_python_modules.sh

    #!/bin/bash -xe
    
    # Non-standard and non-Amazon Machine Image Python modules:
    sudo pip install -U \
      awscli            \
      boto              \
      ciso8601          \
      ujson             \
      workalendar
    
    sudo yum install -y python-psycopg2
    

    【讨论】:

    • 这会将软件包安装在 EMR 集群中的一个节点上。如何确保软件包安装在所有节点上?
    • 这会在所有节点上安装包
    • 这不适用于 Python3。我正在尝试安装熊猫。有什么新建议吗?
    • @EvanZamir 检查我的答案,您需要在脚本中使用 pip-3.4 而不是 stackoverflow.com/a/51210608/3424322
    • 这不遵循使用 requirements.txt 来包含需求的典型约定。为了允许本地和远程执行,您应该使用 aws s3 cp 将 requirements.txt 复制到本地文件夹,然后在从 s3 复制需求文件后使用 pip install -y requirements.txt 安装。
    【解决方案2】:

    简而言之,有两种方法可以使用 pip 安装软件包,具体取决于平台。首先,你安装你需要的任何东西,然后你可以运行你的 Spark 步骤。最简单的是使用 emr-4.0.0 和 'command-runner.jar':

    from boto.emr.step import JarStep
    >>> pip_step=JarStep(name="Command Runner",
    ...             jar="command-runner.jar",
    ...             action_on_failure="CONTINUE",
    ...             step_args=['sudo','pip','install','arrow']
    ... )
    >>> spark_step=JarStep(name="Spark with Command Runner",
    ...                    jar="command-runner.jar",
    ...                    step_args=["spark-submit","/usr/lib/spark/examples/src/main/python/pi.py"]
    ...                    action_on_failure="CONTINUE"
    )
    >>> step_list=conn.add_jobflow_steps(emr.jobflowid, [pip_step,spark_step])
    

    在 2.x 和 3.x 上,您可以以类似的方式使用 script-runner.jar,但您必须为 scriptrunner 指定完整的 URI。

    编辑: 抱歉,我没有看到您想通过控制台执行此操作。您也可以在控制台中添加相同的步骤。第一步将是一个具有与上述相同参数的客户 JAR。第二步是火花步骤。希望这会有所帮助!

    【讨论】:

    • conn 来自哪里
    【解决方案3】:

    根据您使用的是 Python 2(EMR 中的默认设置)还是 Python 3,pip install 命令应该有所不同。 按照noli's answer 的建议,您应该创建一个shell 脚本,将其上传到S3 中的存储桶,并将其用作Bootstrap action

    对于 Python 2(在 Jupyter 中:用作 pyspark 内核的默认值):

    #!/bin/bash -xe
    sudo pip install your_package
    

    对于 Python 3(在 Jupyter 中:用作 Python 3 和 pyspark3 内核的默认值):

    #!/bin/bash -xe
    sudo pip-3.4 install your_package
    

    【讨论】:

    • 如果您使用的是使用 python 3.4 的特定 EMR,这可以正常工作。这需要针对每个 EMR 版本单独检查。例如emr-5.21.0 使用python-3.6,因此您需要将pip 调整为pip-3.6,因此这不是一刀切的解决方案。
    • 另一个注意事项是,如果您想在使用两个版本的 pip 安装时摆脱整个 stderr 日志,以下内容将有助于您的引导操作 shell 脚本:sudo sed -i -e 's/$OLD_PIP_VERSION/$PIP_VERSION/g' /usr/bin/pip-3.6,基于指定的版本
    • sudo pip3 install.. 会绕过版本标记问题吗?
    • #! /bin/bash -xe ; sudo pip-3.6 install boto3 为我工作
    【解决方案4】:

    这篇文章让我开始走上正确的道路,但最终我选择了不同的解决方案。

    boostrap.sh

    #!/bin/bash
    
    sudo python3 -m pip install \
        botocore \
        boto3 \
        ujson \
        warcio \
        beautifulsoup4  \
        lxml
    

    create_emr_cluster.sh

    #!/bin/bash
    
    pem_file="~/.ssh/<your pem file>.pem"
    bootstrap_path="s3://<path without filename>/"
    subnet_id="subnet-<uniuqe subnet id>"
    logs_path="s3://<log directory (optional)>/elasticmapreduce/"
    
    aws s3 cp ./bootstrap.sh $bootstrap_path
    
    ID=$(aws emr create-cluster \
    --name spark-data-processing \
    --use-default-roles \
    --release-label emr-5.30.1 \
    --instance-count 2 \
    --application Name=Spark Name=Hive Name=Ganglia Name=Zeppelin \
    --ec2-attributes KeyName=<your pem file>,SubnetId=$subnet_id \
    --instance-type m4.large \
    --bootstrap-actions Path=${bootstrap_path}bootstrap.sh \
    --query ClusterId \
    --output text \
    --log-uri ${logs_path})
    

    credit to他的帮助

    【讨论】:

      【解决方案5】:

      对于 Python 3 - 创建一个 bash 脚本:

      #!/bin/bash -xe
      sudo pip3 install your_package
      

      将其复制到 S3,并从控制台设置引导操作以指向您的脚本。

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        相关资源
        最近更新 更多