一、storm基础概念

来源:互联网 发布:个人域名申请 编辑:程序博客网 时间:2024/05/16 14:38

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




原创粉丝点击