如何将文件上传到amazon emr?

wwtsj6pe  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(436)

我的代码如下:


# 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 claster之后:

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\u 1618078674774\u 0001/spark-e7c93ba0-7d30-4e52-8f1b-14dda6ff599c/userfiles-5bb8ea9f-189d-4256-803f-0414209e7862/test\u 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 参数仅将文件上载到执行者。如何上传到主机?

8wigbo56

8wigbo561#

你的理解是正确的。
--文件参数仅将文件上载到执行器。
请参阅spark文档
file:-绝对路径和file:/uri由驱动程序的http文件服务器提供服务,每个执行器从驱动程序http服务器提取文件。
您可以在advanced dependency management上了解更多信息
现在回到你的第二个问题
如何上传到主机?
emr中有一个bootstrap动作的概念。从官方文件来看,这意味着:
您可以使用引导操作来安装其他软件或自定义群集示例的配置。引导操作是AmazonEMR使用AmazonLinuxAmazonMachine映像(ami)启动示例后在集群上运行的脚本。在amazonemr安装您在创建集群时指定的应用程序之前以及在集群节点开始处理数据之前运行引导操作。
在我的案例中如何使用它?
在生成集群时,可以在中指定脚本 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上完成

相关问题