Spark是否适合分析(不重新分发)来自多台计算机的日志?

时间:2015-03-13 22:11:00

标签: apache-spark aggregate analytics bigdata

我有很多日志分布在很多机器上,我想收集/汇总一些有关它们的信息。也许首先我想计算包含字符串“Message”的行数,然后我将在所有这些行的第五列中添加数字。

理想情况下,我希望让每台机器在其自己的日志集上执行我告诉它的任何操作,然后将结果返回到集中进行聚合的地方。我(摇摇欲坠地)认为这类似于MapReduce范例的Reduce操作。

我的问题似乎与Map有关。我的直觉告诉我,Hadoop不适合,因为为了分配工作,每个工作节点需要所有底层数据的共同视图 - HDFS实现的功能。我不想仅汇总所有现有数据,以便我可以在其中分配操作;我希望每台特定的机器分析它(并且只有它)的数据。

我无法判断Apache Spark是否允许我这样做。我从快速入门指南得到的印象是,我可以让一个主节点推出一个编译的任意JAR,并且每个工作者都会运行它,在这种情况下只运行该JAR中逻辑所识别的数据,并返回它们结果给主节点让我做我喜欢的事情。但是他们的常见问题解答让我犹豫不决:

  

我是否需要Hadoop来运行Spark?

     

不,但如果您在群集上运行,则需要某种形式的共享文件系统(例如,NFS安装在每个节点上的相同路径上)。如果您有这种类型的文件系统,则可以在独立模式下部署Spark。

所以我的问题是:Apache Spark是否适合让现有的一组机器分析他们已有的数据并汇总结果?

如果是的话,请您高度重申Spark如何处理和汇总预先分发的独立数据集?

如果没有,是否有任何类似的框架允许人们分析现有的分布式数据集?

1 个答案:

答案 0 :(得分:2)

简短回答:

您正在使用工作人员仅在本地计算机上工作。没有错。而不是使用

sc.textFile()

从hdfs中读取数据

java.io.File 

电话 - 在本地阅读。

现在还需要一个额外的步骤: 创建自定义RDD 。为什么?您需要覆盖getPreferredLocations()以为拆分设置正确的计算机名称。

override def getPreferredLocations(split: Partition): Seq[String] =

然后你的分裂需要包括:

  • 机器名称(由getPreferredLocations()方法使用
  • 该计算机的文件列表。注意:该列表可能通过rdbms调用获得 - 以避免在文本文件中进行硬编码。

因此,最终您拥有一个分布式处理系统 - 您可以使用RDD中可用的所有强大转换来读取从本地计算机读取的数据 - 但现在您可以在整个群集上分发/操作该数据。 (即使数据最初是从单个机器上读取的)