pyspark - 导出到 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)
解决方案
尝试直接写入本地 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-cp
或hadoop fs
复制到/从 S3,如下所述:EMR 如何处理 s3 存储桶以进行输入和输出?
推荐阅读
- python - 字典python的空间复杂度
- python-3.x - 如何将日期作为熊猫数据框中的一列?
- git - Bitbucket 恢复到特定的提交,然后使用消息提交,然后推送到功能分支
- php - 如何将图像发布到此 Web 服务
- python - 使用熊猫转换嵌套数组/列表中的excel列
- sql - 使用 Microsoft Query 和 SQL 过程返回多行数据
- html - 如何在本地工作时在 HTML 文件中显示 SVG Sprite 图标?
- javascript - Discord.js 自定义表情符号错误看起来很简单,但我该如何解决?
- javascript - 将行号添加到预格式化文本
- django - React 和 Django 如何真正协同工作