Storm数据流分组
Tuple在Bolt组件之间的传输规则

随机分组:Tuple随机分发到每Bolt组件,并保证每个Bolt组件分发的Tuple数量一致
字段分组:相同Key被分配到同一个Bolt组件,统计单词频次采用这种分组策略
全复制分组:每一个Tuple都会被分配到所有的Bolt组件
全局分组:所有的Tuple分配到一个Bolt组件
不分组:
Storm并发机制

一台Node机器节点:一个工作节点服务,运行一个Supervisor程序
一个worker进程:一个工作节点可以运行1个或多个worker进程
一个Executor执行线程:一个worker进程中运行在JVM上的一个或多个线程
一个Task实例:一个spout对象实例或bolt对象实例,一般Executor执行线程运行一个Task实例
Storm的并发机制,可以从增加worker进程数或executor线程数来考虑‘。
public class WordCountTopology {
public static void main(String[] args) throws Exception {
Config conf=new Config();
//--设置当前拓扑的worker进程并发度,默认是1个
conf.setNumWorkers(2);
WordCountSpout spout=new WordCountSpout();
SplitBolt splitBolt=new SplitBolt();
WordCountBolt wordCountBolt=new WordCountBolt();
PrintBolt printBolt=new PrintBolt();
TopologyBuilder builder=new TopologyBuilder();
//--设置组件的线程并发度和Task并发度,如果线程的并发度=Task的并发度
//--则setNumTasks()可以省略,因为这种情况:一个线程运行一个Task
builder.setSpout("wordcountSpout", spout);
//--随机数据流分组,并设置2个线程去执行splitBolt任务,每个线程执行2个任务
builder.setBolt("splitBolt", splitBolt,2).setNumTasks(4).shuffleGrouping("wordcountSpout");
//--字段数据流分组,确保代码中指定的key字段对应的值,
//--相同的值落到同一个Bolt里
builder.setBolt("wordcountBolt", wordCountBolt,2).setNumTasks(2).fieldsGrouping("splitBolt",new Fields("word"));
//--全局分组,会将所有数据汇聚到一个Bolt上
builder.setBolt("printBolt", printBolt).globalGrouping("wordcountBolt");
StormTopology topology=builder.createTopology();
//--集群模式的提交
StormSubmitter cluster=new StormSubmitter();
cluster.submitTopology("wordCountTopology",conf, topology);
}
}
集群运作模式
提交jar包到集群
%STORM_HOME%/bin storm jar /* /*.xxx.jar 驱动类
主节点收到jar包后,分发jar包到工作节点
工作节点收到jar包
主节点指派Task任务到工作节点,并指示工作节点生成进程和线程来执行Task任务
工作节点和zookeeper之间通过心跳机制,在zk上记录工作节点的工作状态和任务执行情况。主节点和zk之间也建立心跳机制,如果主节点发现某个工作节点没有上报心跳,则主节点认为工作节点服务停止,会把分配给该工作节点的Task,重新分配给一个工作节点来执行
1402

被折叠的 条评论
为什么被折叠?



