如何将文件上传到 Amazon EMR?

Posted

技术标签:

【中文标题】如何将文件上传到 Amazon EMR?【英文标题】:How to upload files to Amazon EMR? 【发布时间】:2021-04-11 06:22:14 【问题描述】:

我的代码如下:

# test2.py

from pyspark import SparkContext, SparkConf, SparkFiles
conf = SparkConf()
sc = SparkContext(
    appName="test",
    conf=conf)
from pyspark.sql import SQLContext
sqlc = SQLContext(sparkContext=sc)
with open(SparkFiles.get("test_warc.txt")) as f:
  print("opened")
sc.stop()

当我在本地运行它时它可以工作:

spark-submit --deploy-mode client --files ../input/test_warc.txt test2.py

但是在将步骤添加到 EMR 分类器之后:

spark-submit --deploy-mode cluster --files s3://brand17-stock-prediction/test_warc.txt s3://brand17-stock-prediction/test2.py

我收到错误:

FileNotFoundError: [Errno 2] 没有这样的文件或目录: '/mnt1/yarn/usercache/hadoop/appcache/application_1618078674774_0001/spark-e7c93ba0-7d30-4e52-8f1b-14dda6ff599c/userFiles-5bb8ea9f-189d-4256-803f-0414209e7862/test_warc.txt'

文件路径正确,但由于某种原因没有从 s3 上传。

我尝试从执行器加载:

from pyspark import SparkContext, SparkConf, SparkFiles
from operator import add

conf = SparkConf()
sc = SparkContext(
    appName="test",
    conf=conf)
from pyspark.sql import SQLContext
sqlc = SQLContext(sparkContext=sc)
def f(_):
    a = 0
    with open(SparkFiles.get("test_warc.txt")) as f:
      a += 1
      print("opened")
    return a#test_module.test()
count = sc.parallelize(range(1, 3), 2).map(f).reduce(add)
print(count) # printing 2

sc.stop()

而且它可以正常工作。

看起来像 --files 参数仅将文件上传到执行程序。我怎样才能上传到master?

【问题讨论】:

【参考方案1】:

你的理解是正确的。

--files 参数仅将文件上传到执行程序。

在 spark 文档中查看此内容

file: - 绝对路径和 file:/ URI 由驱动程序的 HTTP 提供 文件服务器,每个执行程序从驱动程序 HTTP 拉文件 服务器。

您可以在advanced-dependency-management阅读更多相关信息

现在回到你的第二个问题

如何上传到master?

EMR中有bootstrap-action的概念。从官方文档来看,它的含义如下:

您可以使用引导操作来安装其他软件或 自定义集群实例的配置。引导操作 是 Amazon EMR 启动实例后在集群上运行的脚本 使用 Amazon Linux Amazon 系统映像 (AMI)。引导操作 在 Amazon EMR 安装您指定的应用程序之前运行 在集群节点开始处理数据之前创建集群。

我该如何使用它?

在生成集群时,您可以在 BootstrapActions JSON 中指定您的脚本类似于以下内容以及其他自定义配置:

BootstrapActions=[
            'Name': 'Setup Environment for downloading my script',
             'ScriptBootstrapAction':
                 
                     'Path': 's3://your-bucket-name/path-to-custom-scripts/download-file.sh'
                 
             ]

download-file.sh 的内容应如下所示:

#!/bin/bash
set -x
workingDir=/opt/your-path/
sudo mkdir -p $workingDir
sudo aws s3 cp s3://your-bucket/path-to-your-file/test_warc.txt $workingDir

现在在您的 python 脚本中,您可以使用文件workingDir/test_warc.txt 来读取文件。

还有一个选项可以在仅主节点/仅任务节点或两者的混合上执行引导操作。 bootstrap-actions/run-if 是我们可以用于这种情况的脚本。更多关于这方面的阅读可以在emr-bootstrap-runif

【讨论】:

以上是关于如何将文件上传到 Amazon EMR?的主要内容,如果未能解决你的问题,请参考以下文章

amazon emr pig:使用参数文件

如何将文件从 S3 复制到 Amazon EMR HDFS?

如何使用 POSTMAN 应用程序将文件上传到 Amazon S3

将文件从 AWS EMR 集群中的映射器上传到 S3

如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)

如何在不使用 SDK 的情况下将文件从 Android 上传到 Amazon S3