6

我们正在为一个大数据项目评估 AWS Glue,其中包含一些 ETL。我们添加了一个爬虫,它可以正确地从 S3 中获取一个 CSV 文件。最初,我们只是想将该 CSV 转换为 JSON,然后将文件放到另一个 S3 位置(相同的存储桶,不同的路径)。

我们使用了 AWS 提供的脚本(这里没有自定义脚本)。并且只是映射了所有的列。

目标文件夹为空(刚刚创建了作业),但作业失败并显示“文件已存在”: 此处为快照。在开始工作之前 ,我们假装删除输出的 S3 位置是空的。然而,在出现错误后,我们确实看到了两个文件,但它们似乎是部分文件: 快照

关于可能发生的事情有什么想法吗?

这是完整的堆栈:

    容器: ip-172-31-49-38.ec2.internal_8041 上的 container_1513099821372_0007_01_000001
    日志类型:标准输出
    日志上传时间:2017年12月12日星期二19:12:04 +0000
    日志长度:8462
    日志内容:
    回溯(最近一次通话最后):
    文件“script_2017-12-12-19-11-08.py”,第 30 行,在
    datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options =
    {
        “路径”:“s3://primero-viz/output/tcw_entries”
    }
    , 格式 = "json", transformation_ctx = "datasink2")
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/dynamicframe.py”,第 523 行,在 from_options
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/context.py”,第 175 行,位于 write_dynamic_frame_from_options
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/context.py”,第 198 行,在 write_from_options
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/data_sink.py”,第 32 行,写入
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/data_sink.py”,第 28 行,在 writeFrame
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py”,第1133行,在__call__
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/pyspark.zip/pyspark/sql/utils.py”,第 63 行,在 deco
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/py4j-0.10.4-src.zip/py4j/protocol.py”,第 319 行,在 get_return_value
    py4j.protocol.Py4JJavaError: 调用 o86.pyWriteDynamicFrame 时出错。
    :org.apache.spark.SparkException:作业因阶段失败而中止:阶段 0.0 中的任务 0 失败 4 次,最近一次失败:阶段 0.0 中丢失任务 0.3(TID 3,ip-172-31-63-141.ec2 .internal,执行器 1):java.io.IOException:文件已存在:s3://primero-viz/output/tcw_entries/run-1513105898742-part-r-00000
    在 com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.create(S3NativeFileSystem.java:604)
    在 org.apache.hadoop.fs.FileSystem.create(FileSystem.java:915)
    在 org.apache.hadoop.fs.FileSystem.create(FileSystem.java:896)
    在 org.apache.hadoop.fs.FileSystem.create(FileSystem.java:793)
    在 com.amazon.ws.emr.hadoop.fs.EmrFileSystem.create(EmrFileSystem.java:176)
    在 com.amazonaws.services.glue.hadoop.TapeOutputFormat.getRecordWriter(TapeOutputFormat.scala:65)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1119)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1$$anonfun$12.apply(PairRDDFunctions.scala:1102)
    在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    在 org.apache.spark.scheduler.Task.run(Task.scala:99)
    在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282)
    在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    在 java.lang.Thread.run(Thread.java:748)

    驱动程序堆栈跟踪:
    在 org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1435)
    在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1423)
    在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1422)
    在 scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    在 scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    在 org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1422)
    在 org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:802)
    在 org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:802)
    在 scala.Option.foreach(Option.scala:257)
    在 org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:802)
    在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1650)
    在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1605)
    在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1594)
    在 org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48)
    在 org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:628)
    在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1918)
    在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1931)
    在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1951)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1.apply$mcV$sp(PairRDDFunctions.scala:1158)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1.apply(PairRDDFunctions.scala:1085)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1.apply(PairRDDFunctions.scala:1085)
    在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    在 org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
    在 org.apache.spark.rdd.PairRDDFunctions.saveAsNewAPIHadoopDataset(PairRDDFunctions.scala:1085)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopFile$2.apply$mcV$sp(PairRDDFunctions.scala:1005)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopFile$2.apply(PairRDDFunctions.scala:996)
    在 org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopFile$2.apply(PairRDDFunctions.scala:996)
    在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    在 org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
    在 org.apache.spark.rdd.PairRDDFunctions.saveAsNewAPIHadoopFile(PairRDDFunctions.scala:996)
    在 com.amazonaws.services.glue.HadoopDataSink$$anonfun$2.apply$mcV$sp(DataSink.scala:192)
    在 com.amazonaws.services.glue.HadoopDataSink.writeDynamicFrame(DataSink.scala:202)
    在 com.amazonaws.services.glue.DataSink.pyWriteDynamicFrame(DataSink.scala:48)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke(Method.java:498)
    在 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    在 py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    在 py4j.Gateway.invoke(Gateway.java:280)
    在 py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    在 py4j.commands.CallCommand.execute(CallCommand.java:79)
    在 py4j.GatewayConnection.run(GatewayConnection.java:214)
    在 java.lang.Thread.run(Thread.java:748)
    引起:java.io.IOException:文件已存在:s3://primero-viz/output/tcw_entries/run-1513105898742-part-r-00000
4

2 回答 2

-1

将写入模式设置为“附加”,无论您的负载是增量的还是“覆盖”,如果它是满载。

一个例子可能是:

events.toDF().write.json(events_dir, mode="append", partitionBy=["partition_0", "partition_1"])
于 2017-12-18T17:08:01.387 回答
-1

目标文件夹为空

空不等于不存在。它看起来不write_dynamic_frame支持写入模式,因此可能必须先删除目录。

于 2017-12-14T11:27:33.623 回答