AWS Athena + S3 限制

kzf*_*fid 6 amazon-s3 amazon-web-services amazon-athena

我目前正在将 AWS S3 + Athena 用于一个项目。但是,在使用了 1-2 个月后,我发现它有一些局限性。我不确定我是不知道如何使用它还是它真的是一个限制。但是请不要问我为什么在足够的研究之前选择使用它。我认为有2点:

  1. 这是项目需要的
  2. Athena S3 和 AWS 的资源不是很集中,其功能也在不断变化。在实际使用一段时间之前,我很难找到 Athena + S3 可以做什么或不能做什么。

太过分了,现在回到正题。>_<

目前,我面临一个问题。随着数据量的不断增加,数据扫描量和查询量急剧增加(有时甚至会出现异常,例如执行查询时打开的文件过多)。但是,AWS S3 + Athena 似乎只有分区但没有索引。因此,问题来了。

问题 1:
我可以在 AWS S3 + Athena 上做一些类似索引的事情吗?

问题2:
如果我使用分区,似乎只能指定一个组合键(S3文件夹中的一列或多列作为标签);否则,数据大小将翻倍。这是真的?

问题3:
即使我愿意增加数据量,也不可能有2个组合键的表。为了实现这一点,我必须有 2 个 Athena 表和 2 个相同的数据集,但在 S3 中有 2 种类型的分区。这是真的?

问题4:
对于“too many open files”的错误,经过一番研究,似乎是操作系统级别的问题,预定义了有限数量的文件描述符。我现在的情况是SQL大部分时间没有异常,但在某些时候,它很容易出现异常。我的理解是,亚马逊会有一组计算机(例如,32 个节点服务器)来服务一定数量的客户,包括我的公司和其他公司。每个服务器都有有限数量的可用文件描述符,并在所有客户之间共享。然后,在某些高峰期(其他公司正在执行大量查询),文件描述符的可用数量会下降,这也解释了为什么我的具有相同数据集的 SQL 有时会出现异常但并非总是如此。这是真的?

问题 5:
由于缺少索引功能,S3+Athena 不应该执行复杂的 SQL 查询。这意味着,复杂的连接逻辑只能在加载到 S3 之前在转换层的某处完成。这是真的?

问题 6:
这个问题是在上一个问题 5 之后的问题。让我用一个简单的例子来说明:开发了一个报告系统来显示订单和交易。关系是订单执行后,会产生一笔交易。Order_ID 是链接一笔交易及其相关订单活动的关键。分区设置为日期。
现在,以下数据来了:
在此处输入图片说明
要求是:
1。第1天的报告,只订单记录O001-下订单显示
2.报告第2天,只有订单记录O002-订单更改订单显示
3.报告第3天,所有记录,其中包括4个订单记录和1条交易记录,显示4.第4天的报告,只订单记录O004-备注更改显示
为,2天1和4,很容易正如我刚才显示的数据是什么来在同一天。
但是,对于第 3 天,我需要显示所有数据,有些是过去的,有些是将来的(O001-备注更改)。
为了避免复杂的SQL,我只能在Transformation层做join逻辑。
但是,在第3天进行转换时,如果第1天和第2天党没有将数据发送给我,则只能找到历史文件,这并不好,因为您永远不知道需要回查多少天。
即使我们在 Athena 进行搜索,由于 Order_ID 不在分区中,因此需要进行全表扫描。
以上还不是最坏的,最坏的情况是在第3天的转换中,第4天的O001-备注更改是未来数据,不应该在第3天知道。
有没有更好的方法来做到这一点?或者 AWS S3 + Athena 不适合这种复杂的情况(以上情况只是我目前情况的简化版本)?

我知道我的问题太多太多了。但所有这些都是我真正想澄清的,我找不到明确的答案。任何帮助都受到高度赞赏,非常感谢。

Joh*_*ein 9

索引

不,Amazon Athena(以及它所基于的 Presto)不支持索引。这是因为 Athena/Presto(甚至 Redshift)是为大数据设计的,所以即使是大数据上的索引也是大数据,因此维护一个巨大的索引效率不高。

虽然传统数据库使用索引变得更快,但这不适用于大数据系统。相反,使用索引、压缩和列数据格式来提高性能。

分区

分区是分层的(例如Year -> Month -> Day)。分区的目标是“跳过”不需要读取的文件。因此,如果WHERE子句使用分区层次结构,它们只会提供好处。

例如, usingSELECT ... WHERE year=2018将使用分区并跳过所有其他年份。

如果您的查询未将这些分区字段之一放在WHERE子句中,则需要扫描所有目录和文件,因此没有任何好处。

你说“数据大小会翻倍”,但事实并非如此。所有数据只存储一次。分区不会修改数据大小。

打开的文件太多

如果这是 Amazon Athena 生成的错误,则您应该向 AWS Support 提出该错误。

复杂查询

Athena 当然可以进行复杂的查询,但它不是理想的平台。如果您经常进行复杂的 SQL 查询,请考虑使用 Amazon Redshift。

问题 6:表/查询

我无法按照您的要求进行流程。如果您正在寻求 SQL 帮助,请创建一个单独的问题,显示表中的数据示例和您正在寻求的输出示例。