AWS Glue 中的简单 ETL 作业显示“文件已存在”

mbi*_*ios 5 apache-spark aws-glue

我们正在为一个大数据项目评估 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”
    }
    , format = "json",transformation_ctx = "datasink2")
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/dynamicframe.py”,第523行,来自_options
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/PyGlue.zip/awsglue/context.py”,第175行,来自write_options_frame,来自write_options_frame
    文件“/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 行中写入
    文件“/mnt/yarn/usercache/root/appcache/application_1513099821372_0007/container_1513099821372_0007_01_000001/py4j-0.10.4-src.zip/py4j/java_line1__13call, in__line1__3”
    文件“/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_return_value”, in line get
    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, executor 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

小智 -2

目标文件夹为空

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