- storm的基本介绍
storm是twitter公司开源捐献给apache的一个实时流式处理的框架 - storm的基本架构
storm是一个主从的架构
nimbus:storm的主节点,负责接收客户端提交的任务,以及分配任务给 supervisor执行
supervisor:storm的从节点,主要就是用于执行各种任务
worker:supervisor的任务需要执行,都是在进程worker当中执行
Execuotr:最后真正执行任务的,跑数据的,都是Executor,说白了就是线程
Topology:我们提交一个strom的任务,就是提交了一个topology - storm的集群的安装
第一步:解压strom安装包
tar -zxvf apache-storm-1.1.1.tar.gz -C …/servers/
第二步:修改配置文件(这里的配置文件是conf目录下的storm.yaml文件)
storm.zookeeper.servers:
- “node01” (这是linux的主机名称)
- “node02”
- “node03”
nimbus.seeds: [“node01”, “node02”, “node03”]
storm.local.dir: “/export/servers/apache-storm-1.1.1/stormdata”
ui.port: 8088
supervisor.slots.ports: - 6700
- 6701
- 6702
- 6703
第三步:安装包分发到其他机器上面去
scp -r apache-storm-1.1.1/ node02:$PWD
scp -r apache-storm-1.1.1/ node03:$PWD
第四步:storm集群的启动
第一台机器启动命令:
nohup bin/storm nimbus 2>&1 &
nohup bin/storm ui 2>&1 &
nohup bin/storm supervisor 2>&1 &
第二台启动命令:
nohup bin/storm nimbus 2>&1 &
nohup bin/storm supervisor 2>&1 &
第三台机器启动
nohup bin/storm nimbus 2>&1 &
nohup bin/storm supervisor 2>&1 &
4. storm任务的并行度
调整进程数量
config.setNumWorkers(3);
调整线程数量
topologyBuilder.setSpout(“randomSpout”,new RandomSpout(),3);
topologyBuilder.setBolt(“splitBolt”,new SplitBolt(),3).shuffleGrouping(“randomSpout”);
topologyBuilder.setBolt(“countBolt”,new CountBolt(),3).shuffleGrouping(“splitBolt”);
- storm当中数据的分发策略
Storm当中的分组策略,一共有八种:
所谓的grouping策略就是在Spout与Bolt、Bolt与Bolt之间传递Tuple的方式。总共有八种方式:
1)shuffleGrouping(随机分组)随机分组;将tuple随机分配到bolt中,能够保证各task中处理的数据均衡;
2)fieldsGrouping(按照字段分组,在这里即是同一个单词只能发送给一个Bolt)
按字段分组; 根据设定的字段相同值得tuple被分配到同一个bolt进行处理;
举例:builder.setBolt(“mybolt”, new MyStoreBolt(),5).fieldsGrouping(“checkBolt”,new Fields(“uid”));
说明:该bolt由5个任务task执行,相同uid的元组tuple被分配到同一个task进行处理;该task接收的元祖字段是mybolt发射出的字段信息,不受uid分组的影响。
该分组不仅方便统计而且还可以通过该方式保证相同uid的数据保存不重复(uid信息写入数据库中唯一);
3)allGrouping(广播发送,即每一个Tuple,每一个Bolt都会收到)广播发送:所有bolt都可以收到该tuple
4)globalGrouping(全局分组,将Tuple分配到task id值最低的task里面)全局分组:tuple被发送给bolt的同一个并且最小task_id的任务处理,实现事务性的topology
5)noneGrouping(随机分派)不分组:效果等同于shuffle Grouping.
6)directGrouping(直接分组,指定Tuple与Bolt的对应发送关系)
直接分组:由tuple的发射单元直接决定tuple将发射给那个bolt,一般情况下是由接收tuple的bolt决定接收哪个bolt发射的Tuple。这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)。
7)Local or shuffle Grouping本地或者随机分组,优先将数据发送到本机的处理器executor,如果本机没有对应的处理器,那么再发送给其他机器的executor,避免了网络资源的拷贝,减轻网络传输的压力
8)customGrouping (自定义的Grouping)