一、storm基础概念

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保证消息不丢失,但可能会重复。若想消息恰好一次需要用户自己实现

 

                                              喜欢我,请微信扫描下方二维码关注我!感谢支持!

                                                        

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值