可以在Storm中完成以下设计吗?
让我们看看下面的wordcount示例 https://github.com/nathanmarz/storm-starter/blob/master/src/jvm/storm/starter/WordCountTopology.java 我正在将文字生成器喷口更改为文件读取器喷口
此字数统计拓扑的设计是 1.喷嘴读取文件并逐行创建句子 2.将句子分成单词 3. Bolt添加唯一单词并给出一个单词及其相应的计数
因此拓扑在某种程度上描述了文件需要采用的流来计算它所具有的唯一单词。
如果我有两个文件文件1和文件2,则应该能够调用相同的拓扑并创建此拓扑的两个实例来运行相同的字数。
为了跟踪单词计数是否确实已完成,单词计数拓扑的实例应在文件处理完毕后处于已完成状态。
在Storm的当前设计中,我发现拓扑是实际的实例,所以它就像一个任务。
需要使用不同的拓扑名称进行两次不同的调用,例如
表示文件1
StormSubmitter.submitTopology("WordCountTopology1", conf,builder.createTopology());
表示文件2
StormSubmitter.submitTopology("WordCountTopology2", conf,builder.createTopology());
更不用说使用Storm客户端上传jar了
storm jar stormwordcount-1.0.0-jar-with-dependencies.jar com.company.WordCount1Main.App "server" "filepath1"
storm jar stormwordcount-1.0.0-jar-with-dependencies.jar com.company.WordCount2Main.App "server" "filepath2"
另一个问题是文件处理后拓扑无法完成。在我们在拓扑上发出kill之前,它们一直处于活动状态
storm kill "WordCountTopology"
据我所知,在流媒体世界中,消息来自像Kafka这样的消息队列,但消息没有结束,但在文件世界中,实体/消息的修复方式是如何相关的。
是否有API执行以下操作?
//创建拓扑,使用风暴上传相应的jar一次完成
StormSubmitter.submitTopology("WordCountTopology", conf,builder.createTopology());
上传后,应用程序代码只使用agruments实例化拓扑
//创建拓扑的实例并提供状态跟踪器
JobTracker tracker = StormSubmitter.runTopology("WordCountTopology", conf, args);
//如果当前作业完成,可以查询Storm
JobStatus status = StormSubmitter.getTopologyStatus(conf, tracker);
答案 0 :(得分:0)
为了重复使用相同的拓扑两次,您有两种可能性:
1)为文件spout使用构造函数参数,并使用两次不同参数实例化相同的拓扑:
private StormTopology createMyTopology(String filename) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("File Spout", new FileSpout(filename));
// add further spouts and bolts etc.
return builder.createTopology();
}
public static void main(String[] args) {
String file1 = "/path/to/file1";
String file2 = "/path/to/file2";
Config c = new Config();
if(useFile1) {
StormSubmitter.submitTopology("T1", c, createMyTopology(file1));
} else {
StormSubmitter.submitTopology("T1", c, createMyTopology(file2));
}
}
2)作为替代方案,您可以使用open()
方法配置文件spout。
public class FileSpout extends IRichSpout {
@Override
public void open(Map conf, ...) {
String filenmae = (String)conf.get("FILENAME");
// ...
}
// other methods omitted
}
public static void main(String[] args) {
String file1 = "/path/to/file1";
String file2 = "/path/to/file2";
Config c = new Config();
if(useFile1) {
c.put("FILENAME", file1);
} else {
c.put("FILENAME", file2);
}
// assembly topology...
StormSubmitter.submitTopology("T", c, builder.createTopology());
}
对于您的第二个问题:Storm中没有API可以自动终止拓扑。您可以使用TopologyInfo
并监视喷口的发射元组数。如果它在一段时间内没有改变,你可以假设整个文件被读取然后终止拓扑。
Config cfg = new Config();
// set NIMBUS_HOST and NIMBUS_THRIFT_PORT in cfg
Client client = NimbusClient.getConfiguredClient(cfg).getClient();
TopologyInfo info = client.getTopologyInfo("topologyName");
// get emitted tuples...
client.killTopology("topologyName");
答案 1 :(得分:0)
帖子中提到的字数拓扑并不能说明Storm的威力和力量。由于Storm是Stream处理器,它需要一个流;期。根据定义,文件是静态的文件。我同情Storm开发者关于如何通过如何展示拓扑概念和非流技术(如文件)的简单问候世界。那么对于当时正在学习Storm的新手来说,使用这个例子很难理解如何开发。这个例子只是一种展示Storm概念如何工作的方式,而不是一个关于如何处理或需要处理文件的真实单词应用程序。
所以这里是解决方案之一的问题。
由于拓扑一直在运行,因此只要人们想要i,e在一个文件中或在所有文件中的任何时间段,它们都可以计算字数。
为了允许不同的文件进入,我们需要一个流式喷口。所以很自然地,你需要一个Kafka Message Broker或者类似的来接收流中的文件。根据文件的大小和消息代理的限制,即Kafka有1 MB的文件限制,我们可以选择将文件本身作为有效负载或文件的引用发送,在这种情况下,您需要一个分布式文件用于存储文件的系统,即Hadoop DFS或NAS。
然后我们使用Kafka Spout而不是FileSpout读取这些文件。
我们现在有以下问题 1.跨文件的字数 2.每个文件的字数 3.在字数上运行状态,直到处理完毕 4.我们什么时候知道文件是处理还是完整
使用提供的示例,这是示例目标的用例,因此如果我们继续流式传输文件,并且在每个文件中我们读取行,拆分单词并发送到其他螺栓,螺栓将计算单词独立于它来自哪个文件。
File1一只快速的棕色狐狸跳了...... File2从前有一只狐狸......
现场分组 快 棕色 狐狸 ... 一旦 上 狐狸(文件1中不需要) ...
因此,对单词进行分组的字段将是(取消噪音字)
File1_quick File1_brown File1_fox
File2_once File2_upon File2_fox
在字数上运行状态,直到处理完毕 由于所有这些计数都在螺栓的记忆中,并且我们不知道EoF,除非有人进入螺栓或我们定期将计数发送到我们可以查询它的另一个数据存储,否则无法获得状态。这正是我们需要做的事情,我们需要定期将内存中的螺栓计数保存到数据存储,如hbase,elastic,mongo db等。
我们何时知道文件是处理还是完整 也许这是在流媒体世界中最难回答的问题,基本上流处理器不知道蒸汽已完成,因为从它的角度来看,流是文件进来的,它需要将每个文件分成单词并计入相应的螺栓。所以他们不知道在到达每个演员之前或之后发生了什么。 整个过程需要由app开发人员完成。 一种方法是在读取每个文件时,我们计算总字数并发送消息 文件1:总字数:1000 文件2:总词数:2000
现在,当我们进行单词计数并在每个文件File1_ *中找到不同的单词时,在我们说文件完成之前,单个单词的数量和总单词应该匹配。所有这些都是我们在完成之前需要编写的自定义逻辑。
因此,在必要的Storm中提供了以各种方式进行流处理的框架。应用程序开发人员的工作是根据用户的设计进行开发,并根据用例实现自己的逻辑。它不提供开箱即用的应用程序用例或者我认为我们需要构建的良好参考实现,因为它不是商业产品,而是依赖于社区来支持。