storm分布式实时计算二
storm并发控制
storm计算支持在多台机器上水平扩容,通过将计算切分未多个多里的task再集群上并发执行来实现。
在storm中,一个task可以简单的理解为在集群某个节点上运行的一个spout或者bolt实例。
Node:storm集群下的多个服务器。
workers:一个node下的多个JVM(worker),一个topology会分配到多个worker上运行。
executor:一个worker下运行的多个线程,多个task可以指派给一个executor,默认情况下,每个executor分配一个task。
task:是spout或者bolt的实例,它们的nextTuple和execute方法会被executors线程调用执行。
给topology增加woker
Config config = new Config();
config.setNumWorkders(2);
配置executor和task
topologyBuilder.setSpout("spoutTest", new SentenceSpout(), 2);
topologyBuilder.setBolt("boltTest", new WordBolt()).setNumTasks(4);
数据流分组
数据流分组定义了一个数据流中tuple如何分发给topology中不同的bolt的task。
shuffle grouping:随机分组,每个bolt实例接收相同数量的tuple。
fileds grouping:根据指定字段的值进行分组。
all grouping:将所有的tuple复制后分发给所有bolt task。
global grouping:将所有的tuple路由到唯一一个task上。
none grouping:与shuffle一样。
direct grouping:数据源会调用emitDirect方法来判断一个tuple应该路由到哪个storm组件来接收。
local or shuffle grouping:和随机分组类似。
有保障机制的数据处理
storm保证spout每个发送出去的tuple都能够完整的执行处理。
spout可靠性
spout需要记录它发送的tuple,当下游bolt处理失败时spout可以重新发送。
ISpout接口支持ack与fail方法,用于确认或者失败后的处理。
需要注意的是collector.emit发送的tuple需要标记唯一的id。
bolt可靠性
当发送衍生的tuple时,需要锚定读取的tuple。
当处理消息成功或者失败时分别确认应答或者报错。
重新发送到指定bolt:collector.emit("制定的tuple",new Values(xxx))
确认应答:collector.ack(tuple)
失败:collector.fail(tuple)