写在前面:
本篇博客主要介绍 storm 基本概念和一个简单实例,storm版本1.0.2
storm基本概念
storm的集群架构
storm 是一个主从架构,一个主节点,n个从节点,主节点和从节点之间通过zk集群来进行交互,
(这张图是盗的......)
简述一下集群搭建:
1,解压并且修改 storm.yaml,并且scp到其他节点机器上
2,在主节点启动 nimbus服务,ui界面服务和logviewer日志服务
3, 在从节点启动 supervisor服务和logviewer日志服务
主要进程介绍
nimbus : nimbus 是storm集群的主控制节点
zookeeper :集群协调中心
supervisor: 负责接收任务 管理 worker的进程,work进程处理具体逻辑
logviewer:日志服务进程
ui: web ui 管理界面进程
编程模型:DAG有向无环图
正如 Hadoop的编程模型是 map-reduce,storm也有自己的编程模型,这种模型直白的表述就是有向无环图,这里面引用官网的图例
storm 是做流数据处理,所有选择了一种像"水流"一样的编程模型,更准确的说是一种"水槽",数据就像水流一样,在这条"水槽"中"流淌"(被处理)
storm 编程有如下几个基本概念
spout:相当于"水流"(数据流)的源头
bolt:相当于"水槽的处理站",对流经的数据进行处理
Topology: 整个这个 有向无环图 , 这个 topology 将作为一个任务 提交给 storm集群处理
tuple:元组相当于 每一个水滴 每一条数据
编写一个storm程序就是编写若干个spout接入数据发射(emit)数据给bolt,编写若干个bolt处理数据并且e发射(emit)数据给其他的bolt,在这个过程中每一个bolt都有能力把数据持久化,如果没有任何一个bolt持久化数据,数据将被丢弃,最后由一个 topology将这些节点连接起来,提交给集群执行任务或者在本地模拟集群进行任务执行.
一个简单的实例 wordcount
实例流程: 随机读取文本行, 统计整个文本的每个单词的个数
SpoutWordline类:产生数据的源头
package leap.storm.simple;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
import java.util.Map;
import java.util.Random;
/**
* Created by FromX on 2017/3/15.
*/
public class SpoutWordline extends BaseRichSpout {
SpoutOutputCollector _collector;
Random _r