Spark 是否适合分析(无需重新分发)来自多台机器的日志?

Is Spark Appropriate for Analyzing (Without Redistributing) Logs from Many Machines?

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

理想情况下,我希望每台机器都在自己的日志集上执行我告诉它的任何操作,然后 return 将结果集中在某个地方进行聚合。我(颤抖地)认为这类似于 MapReduce 范例的 Reduce 操作。

我的问题似乎与地图有关。我的直觉告诉我 Hadoop 不太合适,因为为了分配工作,每个工作节点都需要所有底层数据的通用视图——HDFS 实现的功能。我不想聚合所有现有数据,这样我就可以在其中分配操作;我希望每台特定的机器都能分析它(并且只有它)拥有的数据。

我不知道 Apache Spark 是否允许我这样做。我从快速入门指南中得到的印象是,我可以让一个主节点推出一个已编译的任意 JAR,并且每个 worker 都会 运行 它,在这种情况下,只是通过该 JAR 中的逻辑识别的数据, return 将他们的结果传给主节点,让我随心所欲。但是他们的常见问题解答让我犹豫不决:

Do I need Hadoop to run Spark?

No, but if you run on a cluster, you will need some form of shared file system (for example, NFS mounted at the same path on each node). If you have this type of filesystem, you can just deploy Spark in standalone mode.

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

如果是,能否请您在较高层次上重申一下 Spark 将如何处理和聚合预分配的独立数据集?

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

简短回答:

您正在使用 worker 仅在本地机器上工作。没有错。而不是使用

sc.textFile()

要从 hdfs 读取数据,您可以将

java.io.File 

通话 - 在本地阅读。

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

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

那么您的拆分需要包括:

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

所以最后你有了一个分布式处理系统——你可以在从本地机器读取的数据上使用 RDD 中可用的所有强大转换——但现在你可以在整个数据上分布/操作该数据簇。 (即使数据最初是从个别机器读取的)