1

我目前正在努力了解如何创建我们的数据湖的数据目录(=Source)。

背景:

我们有一个事件驱动的架构,并开始将我们的应用程序产生的所有事件存储到数据湖(S3 Bucket)中。在存储事件之前,我们对其进行清理(删除敏感信息)并在每个事件周围添加一个包含一些通用数据的信封:

  • 事件来源(哪个应用程序生成了事件)
  • 事件类型(产生了什么样的事件)
  • 时间戳(事件何时生成)
  • ...

使用 Kinesis Streams 和 Firehose,我们将这些事件批处理在一起,并将它们作为 JSON 文件存储在 S3 存储桶中。存储桶的结构如下://///

在那里,我们将带有信封的批处理事件存储为 JSON 文件。这意味着一个 JSON 文件包含多个事件:

{
  "origin": "hummingbird",
  "type": "AuthenticationFailed",
  "timestamp": "2019-06-30T18:24:13.868Z",
  "correlation_id": "2ff0c077-542d-4307-a58b-d6afe34ba748",
  "data": {
    ...
  }
}
{
  "origin": "hummingbird",
  "type": "PostingCreated",
  "timestamp": "2019-06-30T18:24:13.868Z",
  "correlation_id": "xxxx",
  "data": {
    ...
  }
}

数据对象包含事件的特定数据。

现在我想我可以使用 AWS Glue 挂钩原始数据并使用 ETL 作业来聚合事件数据。据我了解,我需要为我的源数据建立一个数据目录,这就是我正在努力解决的问题,因为 JSON 总是包含不同的事件,这些事件是一起批处理的。标准的“爬虫”无法处理这个问题。它确实可以,但它会根据每个 JSON 文件创建无意义的模式。

我想要达到的目标:

  • 解析数据湖以过滤出我感兴趣的事件
  • 使用我感兴趣的事件并对其进行一些转换/聚合/计算
  • 将结果存储到我们当前的 Analytics RDS 或任何地方(足以满足我们现在的目的)
  • 每天解析新事件并将其插入/附加/更新到我们的分析 rds

我的问题:

  • 在我们的数据湖中使用胶水的最佳方式是什么?
  • 是否有可能将爬虫与自定义分类器和某种过滤器与我们的数据湖一起使用?
  • 我是否需要在之前转换数据,才能真正使用 AWS 胶水?
4

1 回答 1

1

让我试一试。

  1. 解析数据湖以过滤出我感兴趣的事件
  2. 使用我感兴趣的事件并对其进行一些转换/聚合/计算

--> 您可以将每个事件的 json 展平,然后将其导出到不同的 S3 存储桶中。在此处参考一些python代码https://aws.amazon.com/blogs/big-data/simplify-querying-nested-json-with-the-aws-glue-relationalize-transform/

--> 使用 Glue 抓取您的新存储桶并生成新的表模式,然后在 Athena 中您应该能够看到它并在表顶部执行过滤/查询/聚合。对转换后的数据感到满意后,您可以进一步将其导入 Redshift 或 RDS。

  1. 将结果存储到我们当前的 Analytics RDS 或任何地方(足以满足我们现在的目的)

--> 从上面的 Glue 目录中,添加 Redshift/RDS 连接,然后使用 Python Spark(需要一些使用数据帧的基本知识)将数据加载到 Redshift 或 RDS。 https://www.mssqltips.com/sqlservertip/5952/read-enrich-and-transform-data-with-aws-glue-service/

  1. 每天解析新事件并将其插入/附加/更新到我们的分析 rds

--> 您可以安排您的 Glue 爬虫从新存储桶中发现新数据。或者,Lambda 也是一个不错的选择。可以使用 S3 对象创建(带有扁平化 json 的新存储桶)触发 Lambda 到、预处理、ETL,然后插入到 Redshift/RDS(使用 JDBC 驱动程序)

于 2019-07-03T10:26:04.300 回答