【问题标题】:Best way to deduplicate from firehose从 firehose 中删除重复数据的最佳方法
【发布时间】:2018-11-01 09:58:14
【问题描述】:

对从 firehose 写入 s3 的事件进行重复数据删除的最佳且最节省成本的方法是什么?

我的场景:我有多个源,它们将它们的事件作为 JSON 写入 kinesis firehose 流。流将事件写入 s3 存储桶。应该用 athena 分析事件。

所以,因为 firehose 不能保证没有重复,我必须以某种方式对数据进行重复数据删除。而且我还必须以某种方式将它们划分为雅典娜。

到目前为止我想出的方法是:

  • 使用 EMR 集群(例如每天)执行去重和分区。但这是成本密集型的​​,而且不宜多于一天运行,以节省成本
  • 使用计划的 lambda 函数,该函数对流动的时间窗口进行重复数据删除。还有另一个 lambda,它对数据进行分区。成本:我不知道,因为以前从未使用过 lambda。

有没有更好、更优雅、更省钱的方法?

【问题讨论】:

    标签: amazon-athena amazon-kinesis-firehose


    【解决方案1】:

    首先,我认为您应该考虑清除重复数据的价值,以及 Firehose 实际交付重复数据的频率。我认为由于 Firehose 本身而导致出现重复的情况非常罕见,但如果您的制作人也可能最终将重复发送到您的 Firehose,那么您当然仍然可能需要处理它。

    您应该使用的方法取决于您的用例,如果您提供了更多详细信息,可能会更容易给您更明确的答案。

    如果您没有大量数据,您可以在读取方面付出代价,而不是处理例如重写数据。 SELECT DISTINCT * FROM table 应该删除重复的行。如果您的查询包含聚合,您可以使用 SELECT column, COUNT(*) FROM (SELECT DISTINCT * FROM table) - 或 SELECT foo, MIN(bar), MIN(baz) GROUP BY 1 的某些变体,如果您有一个应该是唯一的列。由于 Athena 对扫描数据而非计算资源收费,因此不会产生额外费用,但当然会更慢。

    如果您有大量数据,我不会推荐该解决方案,在这种情况下,我认为您无论如何都需要在管道中增加一个步骤,因为您也不应该将 Firehose 生成的数据查询为-是。您需要创建一个分区表并将每小时、每天或每月添加为自己的分区(具体取决于我们正在谈论的数据量)。您可以在不移动数据的情况下执行此操作,但由于无论如何您都必须有一个额外的步骤,您也可以将重复数据删除也固定在那里 - 如果您确实考虑使用 Glue ETL,它对您的开销可能比 EMR 少。

    【讨论】:

    • 我的场景会有很多数据。感谢您对 Glue ETL 的提示,我会尝试一下。
    • 在底层,Glue ETL 使用 spark,它不能扩展用于具有大量数据的重复数据删除任务。 Spark 总是尝试在一台机器上执行此操作,并遇到内存不足错误。强制 spark 使用更多的分区,或者使用更多的 mor DPU 并没有改变任何东西。所以我最终在 Hive 中使用了更广泛的 EMR。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2015-08-25
    • 2016-10-24
    • 2016-05-22
    • 2016-11-17
    • 2017-11-07
    相关资源
    最近更新 更多