如何将文件上传到 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何将文件从 S3 复制到 Amazon EMR HDFS?
如何使用 POSTMAN 应用程序将文件上传到 Amazon S3