1、基础概念
元组:消息传递的基本单元,支持所有的基本类型、字符串和字节数组作为字段值。
流:流由元组组成,spout是流的源头从外部数据源读取元组并emit到拓扑中,bolt接收任何数量的输入流执行处理后可能提交新的流。
Spout:spout是拓扑的流的来源,是一个拓扑中产生源数据流的组件。spout的主要方法是nextTuple(),它会发出一个新的Tuple到拓扑,如果没有新的元组发出,则简单的返回。spout的其他主要方法是ack()和fail(),当storm检测到一个元组从spout发出时,ack()和fail()会被调用,要么成功完成通过拓扑,要么未能完成。ack()和fail()仅被可靠的spout调用。IRichSpout是Spout必须实现的接口。
Bolt:在拓扑中的所有处理都在Bolt中完成,Bolt是流的处理节点,从一个拓扑接收数据,然后执行进行处理的组件。Bolt的主要方法是execute(),该方法将一个新的元组作为输入。IRichBolt是Bolt的通用接口。
Topology:拓扑是Storm中运行的一个实时应用程序,因为各个组件间的消息流动而形成逻辑上的拓扑结构。
主控节点与工作节点:Storm集群中有两类节点:主控节点和工作节点,主控节点只有一个工作节点可以有很多个。
Nimbus进程与Supervisor进程:主控节点运行一个称为Nimbus的守护进程,Nimbus负责在集群中分发代码,对节点分配任务,并监视主机故障。每一个工作节点运行一个称为Supervisor的守护进程,Supervisor监听其主机上已经分配的主机作业,启动和停止Nimbus已经分配的工作进程。
流分组:拓扑定义的一部分,为每个Bolt指定应该接收哪个流作为输入,storm内置了8中流分组方式。
工作进程:worker是spout/bolt中运行具体处理逻辑的进程。
任务:worker中每一个spout/bolt的线程称为一个任务。
执行器:在storm0.8以后,task不再与物理线程对应,同一个spout/bolt的task可能会共享一个物理线程,该线程称为执行器。
可靠性:storm保证每一个spout元组将被拓扑完全可靠地处理,它跟踪每个spout元组的元组树,检测树中的元组什么时候可以成功完成。每个拓扑都有“消息超时时间”,如果storm在超时之前未能检测到spout已经完成,那么会设元组为失败并在之后重新发射它。
2、本地及生产环境运行拓扑
本地运行拓扑:
Config conf = new Config();
conf.setDebug(true);//每一个组件发射消息都让storm记录到日志中
conf.setNumWorkers(2);//设置进程数执行拓扑
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test",conf,builder.createTopology());
Utils.sleep(10000);
cluster.killTopology("test");
cluster.shutdown();
生产集群运行拓扑:
Config conf = new Config();
conf.setNumWorkers(20);//设置进程数执行拓扑
conf.setMaxSpoutPending(5000);//设置一个spout task上面最多有多少个没有处理的tuple
StormSubmitter.submitTopology("test",conf,topology);