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

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

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

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

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

我是暴风雨的新手,我想知道最好的处理方法吗?
我可以将线程数减少到1或修改spout以便每个线程
读取不同的行 – 或者做(如何)我需要使用TopologyContext
参数?
我不确定我是否错过了一种“风暴”的方式来改变它?

最佳答案
西蒙,

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

以下是一些指示:

> Storm旨在处理实时接收的数据流.如果你已经完成了所有数据并将其存储在某个地方,那么Storm所施加的限制只会让你感到烦恼.面向批处理的解决方案,如Yarn map reduce或Spark更容易.
> Storm应该是分布式的,每个工作者(VM)有许多线程,每个从属节点有许多工作者,许多(很多)从属节点.在这种分布式架构中没有“本地文件系统上的单个文件”的概念.此外,出于可扩展性的原因,一个核心思想是让所有这些工作人员独立行动而不与每个订单进行通信.这就是为什么我们通常使用分布式解决方案将数据提供给Storm,如Kafka或0mq.
>我在分布式单词中可以想到的本地文件系统上最接近文件的是HDFS文件夹.模式是将所有数据生成器写入文件夹,每个文件夹都写入具有唯一生成名称的文件,使用文件夹的数据读取器将读取其中的所有文件,无论其名称如何.但是,我认为,如果你这样做,传统的地图减少或火花更容易.

我希望这有帮助:D

转载注明原文:apache-storm – Storm spout – 如何使用> 1个线程从文本文件中读取所有行一次? - 代码日志