1.1什么是storm
storm是分布式实时计算框架。类似Hadoop MapReduce, 用户按照规定的编程规范实现一个任务,然后将这个任务递交给Storm框架,Storm将这个任务跑起来,并且按7 * 24小时运行起来。只计算,不存储。
开发语言:Clojure
原语:
Google的MapReduce:为我们提供了map,reduce原语;
Twitter的Storm:为实时计算提供了一些简单优美的spout,bolt原语,高级原语有面向事务的trident原语。
框架通信机制:0.8之前是zeroMQ(缺点无法限制其内存), 0.9后是netty(但仍兼容ZMQ)
1.2实时数据处理框架
1.3 storm编程模型
第一步:继承BaseRichSpout;
第二步:继承BaseBasicBolt;
第三步:组装拓扑
Spout组件继承BaseRichSpout:
publicclassRandomSpout extendsBaseRichSpout{ //获取消息并发送给下一个组件的方法,会被storm 不断地调用 publicvoidnextTuple() { collector.emit(newValues(..)); //封装到tuple中发送给下一个组件}
publicvoidopen(Map conf, TopologyContext context, SpoutOutputCollector collector) {this.collector=collector; }//进行初始化,只在开始时调用一次
//定义tuple的schema publicvoiddeclareOutputFields(OutputFieldsDeclarer declarer) {declarer.declare(newFields("src_word"));} } |
Bolt组件继承BaseBasicBolt:
public class UpperBolt extends BaseBasicBolt { //每来一个消息元组tuple,都会被执行一次该方法 public void execute(Tuple tuple,BasicOutputCollector collector) { String word=tuple.getString(0);//获取下标第一个消息 … collector.emit(new Values(upper)); //发送出去 }
public void declareOutputFields(OutputFieldsDeclarer declare) { declare.declare(new Fields("upper"));}//给消息申明一个字段名 } |
Main函数:
// 描述topology的结构,以及创建topology并提交给集群 public class TopoMain { public static void main(String[] args) throws..{ TopologyBuilder builder = new TopologyBuilder();
//设置消息源组件 4表示spout进程个数,并行度=4 builder.setSpout("randomSpout", new RandomSpout(),4);
//设置逻辑处理组件 //shuffleGrouping 是分组策略,指定接收哪个组件传过来的消息 builder.setBolt("upper", new UpperBolt(),4).shuffleGrouping("randomSpout"); builder.setBolt("result", new SuffixBolt(),4).shuffleGrouping("upper");
//创建一个topology StormTopology topology=builder.createTopology();
Config config=new Config(); config.setNumWorkers(4);//设置进程个数 config.setDebug(true); //设置调试状态 config.setNumAckers(0); //消息应答器,事务性不是很强,可设置为0
//提交topology到storm 定义一个名称,好在集群里去标识; //通过配置对象传递参数给集群,集群根据这些参数,任务调度进行调整 StormSubmitter.submitTopology("demotopo", config, topology); } } |
1.4 storm与spark streaming比较
| spark streaming | storm |
数据处理方式 | 基于数据的批处理方式,移动计算而非移动数据 利用时间批量窗口生成源RDDà生成jobà调度到spark框架执行 | 移动数据而非移动计算 在处理架构上数据流入到计算节点 |
生态体系 | 基于spark,可与其他spark组件结合 | 缺乏与现有的hadoop生态体系的融合 |
延迟 | 较高,>2s | 低,<100ms |
吞吐量 | 较高,批处理 | 低,流式处理 |
容错 | 通过lineage以及在内存维护两份数据进行备份,开销较小 | 通过ack组件跟踪,开销较大 |
事务性 | 保证数据在批处理层次只被处理一次,事务性较强 | ack保证消息不丢失,但可能会重复。若想消息恰好一次需要用户自己实现 |
喜欢我,请微信扫描下方二维码关注我!感谢支持!