有很多文件需要用两台计算机实时处理,我想把它们分发到这两台计算机上,这些任务需要尽快完成(意味着实时处理),我正在考虑以下计划:
(1) 像Gearman 的分布式队列
(2) 分布式计算平台,如hadoop/spark/storm/s4等
我有两个问题
(1) (1)和(2)之间的优点和缺点是什么?
(2) 如何在(2)中进行选择,hadoop?火花暴风雨s4?还是其他?
谢谢!
也许我没有清楚地描述这个问题。在大多数情况下,有1000-3000个文件具有相同的格式,这些文件是独立的,你不需要关心它们的顺序,一个文件的大小可能是几十到几百KB,在未来,文件的数量和单个文件的大小都会增加。我写了一个程序,它可以处理文件并提取数据,然后将数据存储在mongodb中。现在只有两台计算机,我只想要一个解决方案,可以快速(尽快)用程序处理这些文件,并且易于扩展和维护
分布式队列在我的情况下很容易使用,但可能很难扩展和维护,hadoop/spark在两台计算机中都很"大",但很容易扩展和维护。
这在很大程度上取决于"处理"的性质。这里适用的一些维度是:
- 记录是相互独立的,还是需要某种形式的聚合?即:你需要一些数据来组合吗?例如,来自单个用户帐户的所有交易
- 您正在处理CPU限制吗?记忆受限?文件系统绑定
- 什么将被坚持?你将如何坚持下去
- 每当您看到新数据时,是否需要重新计算任何旧数据
- 你能丢弃数据吗
- 数据是否有序
- 预期负载是多少
一个好的解决方案将取决于这些问题的答案(可能还有我忘记的其他问题)。例如:
- 如果计算很简单,但存储和检索是主要关注的问题,那么您可能应该研究分布式数据库,而不是您的任何一种选择
- 最好的方法是将事情记录到像HDFS这样的分布式文件系统中,然后使用Spark运行批处理计算(通常应该比普通的hadoop更好)
- 也许不是,您可以使用Spark Streaming在接收数据时进行处理
- 如果顺序和一致性很重要,那么发布/订阅体系结构可能会为您提供更好的服务,特别是如果您的负载可能超过两台服务器所能处理的负载,但在高峰和慢速时段,您的员工可以赶上
等等。因此,"如何选择?"的答案是"仔细查看特定问题的约束条件,估计系统的负载需求,并选择更匹配这些约束条件的解决方案"。所有这些解决方案和框架都主宰着其他解决方案和架构,这就是为什么它们都充满活力。选择全在你愿意/能够做出的权衡中。
希望能有所帮助。
首先,dannyhow是正确的——这不是实时处理的意义所在。有一本很棒的书http://www.manning.com/marz/这说明了很多关于lambda架构的东西。
你提到的两种方式有着完全不同的目的,并且与"任务"一词的定义有关。例如,Spark会把你为他得到的一整份工作分成"任务",但一项任务的结果对你来说是无用的,你仍然需要等待整份工作完成。您可以在同一数据集上创建小作业,并使用spark的缓存来加快速度。但是,你不会从分发中获得太多优势(如果它们必须一个接一个地运行)。
文件大吗?它们之间有某种联系吗?如果是的话,我会选择Spark。如果没有,则为分布式队列。