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

我了解,在我向 Athena 提交查询后,它会根据整体服务负载和传入请求的数量分配资源来处理查询。但是我尝试在不同的日期和时间运行它们,仍然会同时执行大约 5 个查询。
所以我的问题是它应该如何?如果是这样,那么如果其中大约 15 个查询处于空闲状态并等待可用插槽,那么能够提交多达 20 个查询又有什么意义呢?
刚刚在 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,这正是在我的情况下实际执行(平均)并发查询的数量。
Athena 团队最近为 Athena 部署了许多新功能。虽然 …
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的日志消息!
我正在尝试创建一个工作流程,其中 AWS Glue ETL 作业将从外部 REST API(而不是 S3 或任何其他 AWS 内部源)提取 JSON 数据。这可能吗?有人做吗?请帮忙!
在下图中,就如何写入 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)
为什么效率如此低下?
我在 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)
我想了解错误的含义,以及除了重新处理整个原始数据集并重新对其进行爬网之外,是否还有其他解决方法。
我只是按如下方式完成一项非常简单的工作
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) 在AWS上新的ETL工具中使用诸如numpy和pandas之类的软件包的最简单方法是什么?我在Python中有一个完整的脚本我想在AWS Glue中运行,它使用numpy和pandas.
目标: 我们希望使用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之前执行第一级解析.
到目前为止我们尝试/引用的内容:
问题: 我们如何使用Glue(或其他方法)来解析这些记录的第一级 - 同时忽略顶层元素下面的不同模式 - 以便我们可以从Spectrum访问它或加载它身体进入Redshift?
我是Glue的新手.我花了很多时间在Glue文档中并在论坛上查看(有些稀疏)信息.我可能会遗漏一些明显的东西 - 或者这可能是目前形式的胶水限制.欢迎任何建议.
谢谢!
amazon-redshift amazon-dynamodb-streams amazon-redshift-spectrum 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) 最近,当分区数量非常多时,我遇到了 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 路径,我的意思是这将是分区的一种神奇方式。也许它获取所有路径
编辑
为了澄清上述声明,我从支持邮件中添加了一段。
来自支持
... 你提到你的新系统有 360000,这是一个很大的数字。因此,当您执行此操作时
select …
aws-glue ×10
presto ×2
amazon-emr ×1
amazon-s3 ×1
apache-spark ×1
aws-lambda ×1
concurrency ×1
limit ×1
nosql ×1
pandas ×1
pyspark ×1
python ×1