AWS胶水使用glueContext.write_dynamic_frame.from_options导出到镶木地板问题

时间:2018-04-18 07:13:03

标签: amazon-web-services pyspark etl aws-glue

我有以下问题。

以下代码由AWS Glue自动生成。

它的任务是从Athena(由.csv @ S3支持)获取数据并将数据转换为Parquet。

该代码适用于参考飞行数据集和一些相对较大的表(约100 Gb)。

但是,在大多数情况下,它会返回错误,这对我来说并不多。

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkConf, SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

conf = (SparkConf()
    .set("spark.driver.maxResultSize", "8g"))

sc = SparkContext(conf=conf)
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "XXX", table_name = "csv_impressions", transformation_ctx = "datasource0")

applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("event time", "long", "event_time", "long"), ("user id", "string", "user_id", "string"), ("advertiser id", "long", "advertiser_id", "long"), ("campaign id", "long", "campaign_id", "long")], transformation_ctx = "applymapping1")

resolvechoice2 = ResolveChoice.apply(frame = applymapping1, choice = "make_struct", transformation_ctx = "resolvechoice2")

dropnullfields3 = DropNullFields.apply(frame = resolvechoice2, transformation_ctx = "dropnullfields3")

datasink4 = glueContext.write_dynamic_frame.from_options(frame = dropnullfields3, connection_type = "s3", connection_options = {"path": "s3://xxxx"}, format = "parquet", transformation_ctx = "datasink4")
job.commit()

AWS Glue识别的错误消息是:

  

调用o72.pyWriteDynamicFrame

时发生错误

日志文件还包含:

  

由于舞台失败导致作业中止:...       写行时任务失败

知道怎么找出失败的原因吗?

或者它可能是什么?

2 个答案:

答案 0 :(得分:1)

第1部分:确定问题

如何查找导致问题的原因的解决方案是将输出从.parquet切换为.csv并删除ResolveChoiceDropNullFields(因为它是由Glue自动建议的) for .parquet):

datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://xxxx"}, format = "csv", transformation_ctx = "datasink2")
job.commit()

它产生了更详细的错误消息:

  

调用o120.pyWriteDynamicFrame时发生错误。工作中止了   由于阶段失败:阶段0.0中的任务5失败了4次,最近一次   失败:第0.0阶段失去任务5.3(TID 182,   ip-172-31-78-99.ec2.internal,executor 15):   com.amazonaws.services.glue.util.FatalException:无法解析文件:   xxxx1.csv.gz

错误消息中提到的文件xxxx1.csv.gz对于Glue来说太大了(~100Mb .gzip和〜350Mb是未压缩的.csv)。

第2部分:问题的真正来源并修复

如第1部分所述,由于导出到.csv,可以识别错误的文件。

通过将.csv加载到R中进行的进一步调查显示,其中一列包含单个string记录,而此列的所有其他值均为longNULL

在R中删除此值并将数据重新上传到S3后,问题就消失了。

注意#1:列在Athena中声明为string,所以我将此行为视为错误

注意#2:问题的本质不是数据的大小。我已经成功处理了高达200Mb .csv.gz的文件,这些文件相当于600 Mb .csv

答案 1 :(得分:0)

请使用数据目录中更新后的表架构。

我也遇到过同样的错误。在我的例子中,爬虫在数据库中创建了另一个相同文件的表。我指的是旧的。如果爬虫一次又一次地爬行相同的路径并在数据目录中创建不同的模式表,就会发生这种情况。所以粘合工作没有找到表名和模式。从而给出这个错误。

此外,您可以将 DeleteBehavior: "LOG" 更改为 DeleteBehavior: "DELETE_IN_DATABASE"