【问题标题】:Calculating unique URLs in a huge dataset (150+ billions)在庞大的数据集中计算唯一的 URL(150+ 十亿)
【发布时间】:2018-12-07 19:16:13
【问题描述】:

我的问题如下:

  • 我得到了一个包含大约 1500 亿个条目的 url 列表。
  • 每个月我都会收到一批新的约 1500 亿条条目。
  • 我应该删除重复项并存储其余部分。
  • 与任务相比,这应该在一台单独且相当小的机器上完成(大约 32-64 Gb 内存可用 + 大量磁盘空间)。
  • 我应该存储唯一的url(存储问题已经解决了)。
  • 我为此任务选择的语言是 Java。

这不是面试问题或类似问题。我需要为一个商业案例这样做。

是否有可用的算法让我实现这个目标(最好在不到一个月的时间内)?我的第一个想法是 Bloom/Cuckoo 过滤器,但我希望尽可能保留所有 URL。

【问题讨论】:

  • 你能定义唯一吗? http://stackoverflow.comhttp://stackoverflow.com/questions 是唯一的吗? https://stackoverflow.com呢?
  • @MyStackRunnethOver 这三个都被认为是独一无二的。不应对 URL 进行任何处理,它们已经过预处理/清理。
  • 一个非常有趣的问题,但我认为它对 SO 来说太宽泛了。可能在软件工程网站上,或者可能是计算机科学(要求算法 或适当的数据结构)。鉴于数据量巨大,我可能会考虑使用 A) 一些强大的全文搜索引擎 B) 和/或框架,如 kafka。因为,最后:我可能是 一台机器 根本行不通。你宁愿需要一组机器一起工作......

标签: java bigdata


【解决方案1】:

我将在合并步骤中实现合并排序并消除重复项。

您需要将 URL 流式传输到并创建可以在内存中排序的中等大小的批次。这些排序的块中的每一个都写入磁盘。

要合并这些已排序的块,请输入两个(或更多)文件。查看每个流中的下一个 URL,并从流中取出最小的 URL,跟踪最近输出的 URL。当获得下一个最小的 URL 时,将其与最近输出的 URL 进行比较——如果是重复的,则跳过它;否则输出它(并记住它作为最近的输出)。

如果您创建的排序块给您太多文件而无法一次打开,请继续合并文件组,直到您拥有一个文件。此结果将没有重复项。

您可能会使用Arrays.parallelSort() 对初始块进行内存排序。在输出已排序的数组元素时,您可能会从这些最初排序的块中删除重复项中受益。

一定要使用缓冲 I/O。

当合并多个文件时,我会创建一个优先队列,其中包含来自每个流的下一条记录以及它来自哪个流。您从优先级队列中获取下一项,从下一项来自的流中读取下一行,然后将新行放入队列中。您可以合并的流的数量将受到您可以打开的文件数量或来自所有流的缓冲 I/O 所需的内存的限制。

要实现这一点可能需要一页左右的代码 - 在一台机器上运行它非常简单。但是,如果它适合您的基础架构,那么这个问题非常适合 Hadoop 集群或类似的东西。如果您想在例如 AWS 上快速运行,您可能希望使用队列(例如 AWS 上的 SQS)来管理要排序/合并的块 - 它变得更加复杂,但运行速度会更快。

其他注意事项

  1. 容错:这个过程需要很长时间才能运行;如果它在中间失败,你想从头开始吗?您可能希望从一个步骤开始,该步骤仅通过源文件流式传输并将其分解为适当大小的未排序块。这一步本身需要一段时间,因为涉及到相当多的 I/O。例如,将这些块放入一个名为“未排序”的目录中。然后有第二个进程将重复查看“未排序”目录,选择一个块,读取它,对其进行排序,将其写入“排序”目录并将未排序的块从“未排序”移动到“存档”。然后有第三个进程将从“排序”中读取块并将它们合并(删除重复项)并写入“排序1”或“最终”(取决于它是否合并所有剩余文件)。我们的想法是对事物进行结构化,以便您始终取得进展,因此如果您的服务器死机,您可以从中断的地方继续。
  2. 并行性:此过程需要很长时间。您可以并行应用的服务器越多,运行速度就越快。您可以以与容错相同的方式实现这一点(如果您有可用的服务器) - 您可以在许多机器上并行执行排序和(中间)合并步骤(使用适当的文件锁定或其他一些方案,这样它们就不会尝试处理相同的块)。

【讨论】:

  • 这是一个天才的想法! :O 谢谢你提出来。很抱歉接受时间很慢,我想考虑一下并等待其他可能的解决方案。
  • 出于成本原因,我不想在 AWS 中运行它。 1500 亿个条目(甚至是批量)会产生巨大的 SQS 成本等(对于我的廉价预算)。我有一台 PC 坐在办公室里,有 2 个好的 Xeon CPU。我很确定它会很好地完成这项工作。 (它完成了解析部分,我很确定这要求更高)。
猜你喜欢
  • 2011-04-23
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多