首页 > 解决方案 > 导出到 S3 时出现 AWS EMR 错误:找不到类 com.amazon.ws.emr.hadoop.fs.EmrFileSystem

问题描述

我正在尝试将数据从 EMR 主节点导出到 S3 存储桶,但失败了。从我的 pyspark 代码执行以下代码行时:

DF1
.coalesce(1)
.write
.format("csv")
.option("header","true")
.save("s3://fittech-bucket/emr/outputs/test_data")

下面的错误来了:

An error occurred while calling o78.save.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2369)
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2840)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2857)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:99)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2896)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2878)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:392)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:356)
        at org.apache.spark.sql.execution.datasources.DataSource.planForWritingFileFormat(DataSource.scala:452)
        at org.apache.spark.sql.execution.datasources.DataSource.planForWriting(DataSource.scala:548)
        at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:278)
        at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:267)
        at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:225)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:282)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
        at py4j.commands.CallCommand.execute(CallCommand.java:79)
        at py4j.GatewayConnection.run(GatewayConnection.java:238)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: Class com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2273)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2367)

标签: pysparkamazon-emr

解决方案


尝试直接写入本地 HDFS 文件系统,然后使用aws s3 cp将本地文件复制到 S3。或者,您可以启用 EMRFS 并使用同步,以便它自动将您的本地更改推送到 S3。有关 EMRFS 参考,请参阅https://docs.aws.amazon.com/emr/latest/ManagementGuide/emrfs-cli-reference.html。这可能是一种解决方法,但它应该可以解决您的主要问题。此外,如果您使用 EMRFS,您将获得许多好处。如果您想从 Python 中执行 EMRFS 同步命令,因为我不确定是否有办法从 boto3 执行此操作,您可以通过从 Python 执行 bash 命令来实现,如下所示:Running Bash commands in Python

如果您只想使用 boto3 将文件推送到 S3,此处记录了通过 Boto3 上传到 S3 的文件:https ://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example -创建-buckets.html

您还可以使用s3-dist-cphadoop fs复制到/从 S3,如下所述:EMR 如何处理 s3 存储桶以进行输入和输出?


推荐阅读