在 AWS EMR 上的 PySpark 脚本上找不到 com.amazon.ws.emr.hadoop.fs.EmrFileSystem

Posted

技术标签:

【中文标题】在 AWS EMR 上的 PySpark 脚本上找不到 com.amazon.ws.emr.hadoop.fs.EmrFileSystem【英文标题】:com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found on PySpark script on AWS EMR 【发布时间】:2020-08-01 22:10:08 【问题描述】:

我正在尝试使用 AWS CLI 创建一个 EMR 集群来运行 python 脚本(使用 pyspark),如下所示:

aws emr create-cluster --name "emr cluster for pyspark (test)"\
 --applications Name=Spark Name=Hadoop --release-label emr-5.25.0 --use-default-roles \
 --ec2-attributes KeyName=my-key --instance-groups \
 InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.xlarge \
 InstanceGroupType=CORE,InstanceCount=2,InstanceType=m4.xlarge \
 --bootstrap-actions Path="s3://mybucket/my_bootstrap.sh" --steps \
 Type=CUSTOM_JAR,Name="Spark Count group by QRACE",ActionOnFailure=CONTINUE\
 ,Jar=s3://us-east-2.elasticmapreduce/libs/script-runner/script-runner.jar,\
 Args=["s3://mybucket/my_step.py","s3://mybucket/my_input.txt","s3://mybucket/output"]\
 --log-uri "s3://mybucket/logs"

引导脚本设置 Python3.7,安装 pyspark (2.4.3) 并安装 Java 8。但是,我的脚本失败并出现以下错误:

y4j.protocol.Py4JJavaError: An error occurred while calling o32.csv.
: java.lang.RuntimeException: 
java.lang.ClassNotFoundException: Class com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found

我尝试将带有以下 json 文件的 --configurations 参数添加到 create-cluster 命令(但没有帮助):

[

  "Classification":"spark-defaults",
  "Properties":
    "spark.executor.extraClassPath":"/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*",
    "spark.driver.extraClassPath":"/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*"
  
 

]

任何关于我可以在哪里查看或我可以做什么的指示都会非常有帮助!

编辑:我能够按照@Lamanus 的建议解决这个问题。但我的 PySpark 应用程序似乎在 EMR 5.30.1 上完美运行,但在 EMR 5.25.0 上却没有

我现在收到以下错误:

Exception in thread "main" org.apache.spark.SparkException: Application application_1596402225924_0001 finished with failed status
at org.apache.spark.deploy.yarn.Client.run(Client.scala:1148)
at org.apache.spark.deploy.yarn.YarnClusterApplication.start(Client.scala:1525)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我不知道在哪里可以找到有用的错误报告/日志以了解问题所在。它与 EMR-5.30.1 和 Spark-2.4.5 完美配合。

【问题讨论】:

EMR已经有了pyspark,为什么还要重新安装? 我想使用不同的版本。有没有办法在不手动安装我想要的版本的情况下做到这一点? 图像 emr 5.25.0 中的 spark 版本是 2.4.3,所以我认为 pyspark 具有相同的版本。 不要安装 pyspark。它会覆盖所有设置。我也对 anaconda 进行了同样的尝试。但仅供参考 EMRFS jar 位于名为 emrfs-hadoop-assembly-<version>.jar/usr/share/aws/emr/emrfs/lib/ 目录中。 @Lamanus 谢谢!这解决了我原来的问题,但我现在遇到了一个新问题。关于我可能在哪里寻找的任何想法? 【参考方案1】:

更新:发生这种情况是因为引导脚本安装了 pyspark,而集群已经附带了一个。

【讨论】:

我遇到了同样的错误,因为使用 pip 安装的一个库正在安装 pyspark 作为依赖项【参考方案2】:

无法对@chittychitty 的最后一个答案进行投票,但这是正确的!不要将 PySpark 安装在 EMR 提供的版本之上。

【讨论】:

以上是关于在 AWS EMR 上的 PySpark 脚本上找不到 com.amazon.ws.emr.hadoop.fs.EmrFileSystem的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS EMR 上的 zip 文件中提交 pyspark 支持 sql 文件

如何使用 AWS Lambda 在 AWS EMR 上运行 PySpark

在 AWS EMR 上使用 pyspark

带有 tez 的 aws emr 上的 Pig 脚本偶尔会因 OutOfMemoryException 而失败

AWS 设置以在 Apache pyspark env 上运行 python 脚本

如何在 AWS EMR 中一起添加 2 个(pyspark、scala)步骤?