【问题标题】:AWS Glue export to parquet issue using glueContext.write_dynamic_frame.from_optionsAWS Glue使用glueContext.write_dynamic_frame.from_options导出到镶木地板问题
【发布时间】:2018-09-28 07:45:33
【问题描述】:

我有以下问题。

以下代码由 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 时出错

日志文件还包含:

作业因阶段失败而中止:... 写入行时任务失败

知道如何找出失败的原因吗?

或者它可能是什么?

【问题讨论】:

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


    【解决方案1】:

    第 1 部分:识别问题

    如何找到导致问题的原因的解决方案是将输出从.parquet 切换到.csv 并删除ResolveChoiceDropNullFields(因为它是由Glue 自动为.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,执行者 15): com.amazonaws.services.glue.util.FatalException:无法解析文件: xxxx1.csv.gz

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

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

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

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

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

    注意 #1:该列在 Athena 中被声明为 string,所以我认为这种行为是错误

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

    【讨论】:

    • 那你是怎么解决的呢?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2021-10-23
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2020-04-30
      • 2019-01-09
      相关资源
      最近更新 更多