我有很多日志分布在很多机器上,我想收集/汇总一些有关它们的信息。也许首先我想计算包含字符串“Message”的行数,然后我将在所有这些行的第五列中添加数字。
理想情况下,我希望让每台机器在其自己的日志集上执行我告诉它的任何操作,然后将结果返回到集中进行聚合的地方。我(摇摇欲坠地)认为这类似于MapReduce范例的Reduce操作。
我的问题似乎与Map有关。我的直觉告诉我,Hadoop不适合,因为为了分配工作,每个工作节点需要所有底层数据的共同视图 - HDFS实现的功能。我不想仅汇总所有现有数据,以便我可以在其中分配操作;我希望每台特定的机器分析它(并且只有它)的数据。
我无法判断Apache Spark是否允许我这样做。我从快速入门指南得到的印象是,我可以让一个主节点推出一个编译的任意JAR,并且每个工作者都会运行它,在这种情况下只运行该JAR中逻辑所识别的数据,并返回它们结果给主节点让我做我喜欢的事情。但是他们的常见问题解答让我犹豫不决:
我是否需要Hadoop来运行Spark?
不,但如果您在群集上运行,则需要某种形式的共享文件系统(例如,NFS安装在每个节点上的相同路径上)。如果您有这种类型的文件系统,则可以在独立模式下部署Spark。
所以我的问题是:Apache Spark是否适合让现有的一组机器分析他们已有的数据并汇总结果?
如果是的话,请您高度重申Spark如何处理和汇总预先分发的独立数据集?
如果没有,是否有任何类似的框架允许人们分析现有的分布式数据集?
答案 0 :(得分:2)
简短回答:是。
您正在使用工作人员仅在本地计算机上工作。没有错。而不是使用
sc.textFile()
从hdfs中读取数据
java.io.File
电话 - 在本地阅读。
现在还需要一个额外的步骤: 创建自定义RDD 。为什么?您需要覆盖getPreferredLocations()以为拆分设置正确的计算机名称。
override def getPreferredLocations(split: Partition): Seq[String] =
然后你的分裂需要包括:
因此,最终您拥有一个分布式处理系统 - 您可以使用RDD中可用的所有强大转换来读取从本地计算机读取的数据 - 但现在您可以在整个群集上分发/操作该数据。 (即使数据最初是从单个机器上读取的)