Storm spout - 如何使用> 1个线程从文本文件中读取所有行一次?

时间:2014-05-28 01:16:05

标签: apache-storm

风暴拓扑包含使用> 1个线程运行的Spout组件。 e.g。

 builder.setSpout("lines", new TestLineSpout(), 2);

Spout(打开功能)打开并读取文本文件的所有行 nextTuple将每一行发射到一个螺栓。

当运行2个线程时,对于spout,文件的每一行都被读取两次。

我是暴风雨的新手,我想知道处理这个问题的最佳方法吗? 我可以将线程数减少到1或修改spout以便每个线程 读取不同的行 - 或者做(如何)我需要使用TopologyContext 参数? 我不确定我是否错过了#34;风暴"这种方式很难理解?

2 个答案:

答案 0 :(得分:14)

西蒙,

Storm无法并行读取存储在本地文件系统上的文件。你可以编写一个这样做的鲸鱼喷水,但除了小的测试和实验目的,这会与Storm的架构发生冲突。

以下是一些指示:

  • Storm旨在处理实时收到的数据流。如果你已经完成了所有数据并将其存储在某个地方,那么Storm所施加的限制只会让你感到烦恼。面向批处理的解决方案,如Yarn map reduce或Spark更容易。

  • Storm的意思是分布式,每个工作者(VM)有许多线程,每个从属节点有许多工作者,许多(很多)从属节点。 本地文件系统"上没有"单个文件的概念。在这种分布式架构中。此外,出于可扩展性的原因,一个核心思想是让所有这些工作人员独立行动而不与每个订单进行通信。这就是为什么我们通常使用分布式解决方案将数据提供给Storm,如Kafka或0mq。

  • 我在分布式单词中可以想到的本地文件系统上最接近文件的是HDFS 文件夹。模式是将所有数据生成器写入文件夹,每个文件夹都写入具有唯一生成名称的文件,使用文件夹的数据读取器将读取其中的所有文件,无论其名称如何。但是,我认为,如果你这样做,传统的地图减少或火花更容易。

我希望这有帮助:D

答案 1 :(得分:0)

这是我们的解决方案:

使用简单的java程序逐行读取本地系统上的文件到mq或kafka,这里每行都充当流。然后,您可以使用storm以并行方式处理这些流。