标签: aws-glue

AWS Athena 并发限制:提交的查询数 VS 正在运行的查询数

根据AWS Athena 限制,您一次最多可以提交 20 个相同类型的查询,但这是一个软限制,可以根据要求增加。我曾经boto3与 Athena 进行交互,我的脚本提交了 16 个 CTAS 查询,每个查询大约需要 2 分钟才能完成。在 AWS 账户中,只有我在使用 Athena 服务。但是,当我通过控制台查看查询状态时,我发现尽管所有查询都处于 state 状态,但实际上只有少数查询(平均 5 个)正在执行Running。以下是通常会在 Athena 历史选项卡中看到的内容:

雅典娜历史选项卡

我了解,在我向 Athena 提交查询后,它会根据整体服务负载和传入请求的数量分配资源来处理查询。但是我尝试在不同的日期和时间运行它们,仍然会同时执行大约 5 个查询。

所以我的问题是它应该如何?如果是这样,那么如果其中大约 15 个查询处于空闲状态并等待可用插槽,那么能够提交多达 20 个查询又有什么意义呢?

更新 2019-09-26

刚刚在 presto 文档中偶然发现了 HIVE CONNECTOR,其中有一节AWS Glue Catalog Configuration Properties。在那里我们可以看到

hive.metastore.glue.max-connections:到 Glue 的最大并发连接数(默认为 5)。

这让我想知道它是否与我的问题有关。据我了解,Athena 只是一个在 EMR 集群上运行的 Presto,该集群配置为使用 AWS Glue 数据目录作为 Metastore。

那么,如果我的问题来自这样一个事实,即 Athena 的 EMR 集群只是使用默认值来连接到 Glue 的并发连接,即 5,这正是在我的情况下实际执行(平均)并发查询的数量。

更新 2019-11-27

Athena 团队最近为 Athena 部署了许多新功能。虽然 …

concurrency limit amazon-emr amazon-athena aws-glue

15
推荐指数
1
解决办法
6359
查看次数

如何将消息写入AWS Glue上的输出日志?

AWS胶作业日志输出和错误两种不同的CloudWatch的日志,/aws-glue/jobs/error/aws-glue/jobs/output在默认情况下.当我在脚本中包含print()语句进行调试时,它们会被写入错误日志(print()).

我尝试过使用:

/aws-glue/jobs/error

但是"Hello World!" 在我运行的测试作业的任何一个日志中都没有显示.

有谁知道如何将调试日志语句写入输出log(/aws-glue/jobs/output)?

TIA!

编辑:

事实证明,上面确实有效.发生的事情是我在AWS Glue Script编辑器窗口中运行该工作,该窗口捕获Command-F组合键并仅在当前脚本中搜索.因此,当我尝试在页面内搜索日志记录输出时,似乎它没有被记录.

注意:我确实通过测试第一响应者的建议发现AWS Glue脚本似乎没有输出任何低于WARN的日志消息!

pyspark aws-glue

14
推荐指数
4
解决办法
7424
查看次数

AWS Glue 作业使用来自外部 REST API 的数据

我正在尝试创建一个工作流程,其中 AWS Glue ETL 作业将从外部 REST API(而不是 S3 或任何其他 AWS 内部源)提取 JSON 数据。这可能吗?有人做吗?请帮忙!

aws-glue aws-glue-data-catalog

14
推荐指数
1
解决办法
3万
查看次数

Glue Dynamic Frame 比普通 Spark 慢得多

在下图中,就如何写入 S3 而言,我们使用三种不同的配置运行相同的粘合作业:

  1. 我们使用动态帧写入S3
  2. 我们使用纯spark框架写入S3
  3. 与 1 相同,但工作节点数量从 80 个减少到 60 个
  • 在所有条件相同的情况下,动态框架需要 75 分钟才能完成这项工作,普通 Spark 需要 10 分钟。输出为 100 GB 的数据。
  • 动态帧对worker节点数量超级敏感,稍微减少worker节点数量时,处理2小时后会因内存问题而失败。这是令人惊讶的,因为我们期望 Glue 作为一项 AWS 服务能够更好地处理 S3 写入操作。

代码差异是这样的:

if dynamic:
    df_final_dyn = DynamicFrame.fromDF(df_final, glueContext, "df_final")

    glueContext.write_dynamic_frame.from_options(
    frame=df_final_dyn, connection_type="s3", format="glueparquet", transformation_ctx="DataSink0",
    connection_options={"path": "s3://...", 
    "partitionKeys": ["year", "month", "day"]})
else:
    spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
    df_final.write.mode("overwrite").format("parquet").partitionBy("year", "month", "day")\
             .save("s3://.../")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为什么效率如此低下?

amazon-s3 amazon-web-services apache-spark aws-glue

14
推荐指数
1
解决办法
2121
查看次数

AWS Athena - GENERIC_INTERNAL_ERROR:分区值的数量与过滤器的数量不匹配

我在 Athena 中查询给出错误的表:GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters

我能够更早地查询它,但添加了另一个分区(AWS 粘合作业)来尝试优化我稍后将在查询中执行的连接。我确实重新运行了爬虫来更新表以反映分区。

我想知道这个错误实际上意味着什么。

我尝试重新抓取数据,但没有成功。接下来,我将清除底层 S3 数据并从头开始重新处理整个数据集,然后重新对其进行爬网。

SELECT *
FROM mydb.mytable
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我想了解错误的含义,以及除了重新处理整个原始数据集并重新对其进行爬网之外,是否还有其他解决方法。

amazon-web-services presto amazon-athena aws-glue

13
推荐指数
1
解决办法
6515
查看次数

AWS Glue需要很长时间才能完成

我只是按如下方式完成一项非常简单的工作

glueContext = GlueContext(SparkContext.getOrCreate())
l_table = glueContext.create_dynamic_frame.from_catalog(
             database="gluecatalog",
             table_name="fctable") 
l_table = l_table.drop_fields(['seq','partition_0','partition_1','partition_2','partition_3']).rename_field('tbl_code','table_code')
print "Count: ", l_table.count()
l_table.printSchema()
l_table.select_fields(['trans_time']).toDF().distinct().show()
dfc = l_table.relationalize("table_root", "s3://my-bucket/temp/")
print "Before keys() call "
dfc.keys()
print "After keys() call "
l_table.select_fields('table').printSchema()
dfc.select('table_root_table').toDF().where("id = 1 or id = 2").orderBy(['id','index']).show()
dfc.select('table_root').toDF().where("table = 1 or table = 2").show()
Run Code Online (Sandbox Code Playgroud)

数据结构也很简单

root
|-- table: array
| |-- element: struct
| | |-- trans_time: string
| | |-- seq: null
| | |-- operation: string
| | |-- order_date: string
| | |-- …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-glue

11
推荐指数
2
解决办法
5184
查看次数

AWS Glue Python

在AWS上新的ETL工具中使用诸如numpy和pandas之类的软件包的最简单方法是什么?我在Python中有一个完整的脚本我想在AWS Glue中运行,它使用numpy和pandas.

python amazon-web-services pandas aws-lambda aws-glue

11
推荐指数
4
解决办法
8309
查看次数

AWS Glue:如何使用不同的模式处理嵌套的JSON

目标: 我们希望使用AWS Glue Data Catalog为驻留在S3存储桶中的JSON数据创建单个表,然后我们将通过Redshift Spectrum进行查询和解析.

背景: JSON数据来自DynamoDB Streams,并且是深层嵌套的.第一级JSON具有一组一致的元素:Keys,NewImage,OldImage,SequenceNumber,ApproximateCreationDateTime,SizeBytes和EventName.唯一的变化是有些记录没有NewImage,有些没有OldImage.但是,在第一级之下,架构变化很大.

理想情况下,我们希望使用Glue仅解析第一级JSON,并且基本上将较低级别视为大型STRING对象(我们将根据需要使用Redshift Spectrum对其进行解析).目前,我们将整个记录加载到Redshift中的单个VARCHAR列中,但记录接近Redshift中数据类型的最大大小(最大VARCHAR长度为65535).因此,我们希望在记录达到Redshift之前执行第一级解析.

到目前为止我们尝试/引用的内容:

  • 将AWS Glue Crawler指向S3存储桶会导致数百个表具有一致的顶级模式(上面列出的属性),但STRUCT元素中更深层次的模式会有所不同.我们还没有找到一种方法来创建一个Glue ETL Job,它可以从所有这些表中读取并将其加载到一个表中.
  • 手动创建表并不富有成效.我们尝试将每列设置为STRING数据类型,但是作业没有成功加载数据(可能因为这会涉及从STRUCT到STRING的一些转换).将列设置为STRUCT时,它需要一个已定义的模式 - 但这正是从一个记录到另一个记录的不同,因此我们无法提供适用于所有相关记录的通用STRUCT模式.
  • AWS Glue Relationalize转换很有趣,但不是我们在这种情况下要寻找的(因为我们希望保留一些JSON完整,而不是完全展平它).Redshift Spectrum支持几周前的标量JSON数据,但这不适用于我们正在处理的嵌套JSON.这些似乎都没有帮助处理由Glue Crawler创建的数百个表.

问题: 我们如何使用Glue(或其他方法)来解析这些记录的第一级 - 同时忽略顶层元素下面的不同模式 - 以便我们可以从Spectrum访问它或加载它身体进入Redshift?

我是Glue的新手.我花了很多时间在Glue文档中并在论坛上查看(有些稀疏)信息.我可能会遗漏一些明显的东西 - 或者这可能是目前形式的胶水限制.欢迎任何建议.

谢谢!

amazon-redshift amazon-dynamodb-streams amazon-redshift-spectrum aws-glue

11
推荐指数
1
解决办法
7707
查看次数

AWS Glue 无法从爬网程序创建数据库:权限被拒绝

我正在尝试在 S3 存储桶上使用 AWS Glue 爬网程序来填充 Glue 数据库。我运行 Create Crawler 向导,选择我的数据源(带有 avro 文件的 S3 存储桶),让它创建 IAM 角色并运行它,但我收到以下错误:

Database does not exist or principal is not authorized to create tables. (Database name: zzz-db, Table name: avroavro_all) (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: 78fc18e4-c383-11e9-a86f-736a16f57a42). For more information, see Setting up IAM Permissions in the Developer Guide (http://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html).
Run Code Online (Sandbox Code Playgroud)

我尝试在一个新的空白数据库中创建这个表(而不是现有的带有表的数据库),我尝试为名称添加前缀,尝试获取不同的模式,并尝试使用具有管理员访问权限的现有角色。我虽然后者可以工作,但我一直收到同样的错误,不知道为什么。

明确地说,我创建的服务角色有几个策略,我假设一个足以创建表的前提:

在此处输入图片说明

日志是香草:

?
19:52:52
[10cb3191-9785-49dc-8935-fb02dcbd69a3] BENCHMARK : Running Start Crawl for Crawler avro
19:53:22
[10cb3191-9785-49dc-8935-fb02dcbd69a3] BENCHMARK : Classification complete, writing …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-athena aws-glue

11
推荐指数
2
解决办法
8490
查看次数

AWS Athena 分区获取所有路径

最近,当分区数量非常多时,我遇到了 AWS Athena 问题。

旧版本的数据库和表只有 1 个分区级别,比如 id=x。我们拿一张桌子;例如,我们存储每个 id(产品)的支付参数,并且没有很多 ID。假设它在 1000-5000 左右。现在,在查询该表时,在 where 子句上传递 id 号,例如“.. where id = 10”。实际上,查询返回的速度非常快。假设我们每天更新数据两次。

最近,我们一直在考虑为一天添加另一个分区级别,例如“../id=x/dt=yyyy-mm-dd/..”。这意味着如果一个月过去了,分区数每天增长 xID 倍,如果我们有 3000 个 ID,我们每月大约会得到 3000x30=90000 个分区。因此,分区数量迅速增长。

假设 3 个月前的数据(约 27 万个分区),我们希望看到如下查询最多在 20 秒左右返回。

select count(*) from db.table where id = x and dt = 'yyyy-mm-dd'

这需要一分钟。

真实案例

事实证明,Athena 首先获取所有分区(元数据)和 s3 路径(无论使用 where 子句),然后过滤您希望在 where 条件下查看的那些 s3 路径。第一部分(按分区获取所有 s3 路径的持续时间与分区数量成正比)

您拥有的分区越多,执行查询的速度就越慢。

直觉上,我希望 Athena 只获取 where 子句中规定的 s3 路径,我的意思是这将是分区的一种神奇方式。也许它获取所有路径

  • 有没有人知道解决方法,或者我们是否以错误的方式使用 Athena?
  • Athena 是否应该仅用于少量分区?

编辑

为了澄清上述声明,我从支持邮件中添加了一段。

来自支持

... 你提到你的新系统有 360000,这是一个很大的数字。因此,当您执行此操作时select …

amazon-web-services nosql presto amazon-athena aws-glue

11
推荐指数
1
解决办法
776
查看次数