【问题标题】:I have an error "java.io.FileNotFoundException: No such file or directory" while trying to create a dynamic frame using a notebook in AWS Glue尝试使用 AWS Glue 中的笔记本创建动态框架时出现错误“java.io.FileNotFoundException:没有这样的文件或目录”
【发布时间】:2019-11-19 09:10:45
【问题描述】:

我正在 AWS Glue 中设置一个新的 Jupyter Notebook 作为开发终端节点,以便测试一些用于运行 ETL 脚本的代码。到目前为止,我使用 AWS Glue 创建了一个基本的 ETL 脚本,但由于某种原因,当尝试在 Jupyter Notebook 上运行代码时,我不断收到FileNotFoundException。

我正在使用由 AWS Crawler 创建的表(在数据目录中)来获取与 S3 存储桶关联的信息,并且我实际上能够获取存储桶中的文件名,但是当我尝试使用动态帧读取文件,抛出FileNotFoundException。

以前有人遇到过这个问题吗?

这是在 N.Virginia AWS 账户上运行的。我已经设置了权限,将 IAM 角色授予 AWS Glue 服务,设置了 VPC 终端节点并尝试直接在 AWS Glue 中运行作业,但无济于事。

这是基本代码:

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "xxx-database", table_name = "mytable_item", transformation_ctx = "datasource0")

datasource0.printSchema()
datasource0.show()

或者:

datasource0 = glueContext.create_dynamic_frame.from_options('s3', connection_options={"paths":["s3://my-bucket/92387979/My-Table-Item/2016-09-11T16:30:00.000Z/"]}, format="json", transformation_ctx="")


datasource0.printSchema()
datasource0.show()

我希望收到一个动态帧内容,但这实际上是抛出这个错误:

An error occurred while calling o343.schema.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 8.0 failed 4 times, most recent failure: Lost task 0.3 in stage 8.0 (TID 23, ip-172-31-87-88.ec2.internal, executor 6): java.io.FileNotFoundException: No such file or directory 's3://my-bucket/92387979/My-Table-Item/2016-09-11T16:30:00.000Z/92387979-My-Table-Item-2016-09-11T16:30:00.000Z.json.gz'
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.getFileStatus(S3NativeFileSystem.java:826)
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.open(S3NativeFileSystem.java:1206)
    at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:773)
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.open(EmrFileSystem.java:166)
    at com.amazonaws.services.glue.hadoop.TapeHadoopRecordReader.initialize(TapeHadoopRecordReader.scala:99)
    at org.apache.spark.rdd.NewHadoopRDD$$anon$1.liftedTree1$1(NewHadoopRDD.scala:182)
    at org.apache.spark.rdd.NewHadoopRDD$$anon$1.<init>(NewHadoopRDD.scala:179)
    at org.apache.spark.rdd.NewHadoopRDD.compute(NewHadoopRDD.scala:134)
    at org.apache.spark.rdd.NewHadoopRDD.compute(NewHadoopRDD.scala:69)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.UnionRDD.compute(UnionRDD.scala:105)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287)

提前感谢您提供的任何帮助。

【问题讨论】:

  • 乍看之下听起来像是 s3 权限问题,您能发布吗?
  • 表和/或 S3 权限似乎有些问题。您能否提供您的创建表命令的详细信息以及对所述存储桶的 S3 权限?
  • 是的,这是一个 S3 权限问题。我还使用 Boto3 进行了测试,以使用 S3 客户端获取对象,它让我访问被拒绝。感谢两位指出。

标签: amazon-s3 pyspark etl aws-glue


【解决方案1】:

好吧,正如Chris D'Englere 和Harsh Bafna 所指出的,这确实是权限问题。事实证明,我忘记为存储桶内的对象 (GetObject) 添加特定的 S3 权限,而不仅仅是存储桶本身。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多