storm解析及wordcount简单实例

本文介绍了Storm分布式实时流计算框架,包括单机和集群模式、核心概念如Nimbus、Supervisor和Zookeeper的角色。详细阐述了Spout和Bolt的工作原理,并通过WordCount实例展示了数据处理流程。Storm以其强大的实时处理能力,提供了灵活的拓扑结构,适用于持续的数据流处理。
摘要由CSDN通过智能技术生成

storm:分布式实时流计算框架
storm分为单机模式集群模式
在集群模式下:
Storm由一个主节点和多个工作节点组成。主节点运行了一个名为“Nimbus”的守护进程,用于分配代码、布置任务及故障检测。每个工作节点都运行了一个名为“Supervisor”的守护进程,用于监听工作,开始并终止工作进程。Nimbus和Supervisor都能快速失败,而且是无状态的,这样一来它们就变得十分健壮,两者的协调工作是由Apache ZooKeeper来完成的。如图:

这里写图片描述
这也就意味着你可以用kill -9来杀死nimbus和supervisor进程, 然后再重启它们, 它们可以继续工作
更重要的是, nimbus和supervisor的fail或restart不会影响worker的工作, 不象Hadoop, Job tracker的fail会导致job失败

Storm是以Stream流为核心的,可定义为无限的tuple序列。
什么是tuple?
命名的value序列, 可以理解成Key/value序列, 每个value可以是任何类型, 动态类型不需要事先声明。
Tuple在传输中需要序列化和反序列化, storm集成了普通类型的序列化模块, 用户可以自定义特殊类型的序列化逻辑 。

Spouts, 流的源头 : 在一个topology中产生源数据流的组件。
Spout是Storm里面特有的名词, Stream的源头. 通常是从外部数据源读取tuples, 并emit到topology.
—-Spout可以同时emit多个tuple stream, 通过OutputFieldsDeclarer中的declareStream method来定义
—-Spout需要实现IRichSpout接口, 其中最重要的方法是nextTuple, 通常情况下,spout会从外部数据源中读取数据,然后转换为topology内部的源数据。Spout是一个主动的角色,其接口中有个nextTuple()函数,storm框架会不停地调用此函数,用户只要在其中生成源数据即可。
例:

    @Override   //接收外部数据转换为topology内部的源数据处理
    public void nextTuple() {
        String[] sentests = new String[]{
  "jahdkj djhdk dsjdl",
                "jdkasjfl jfhk dhaku","dbhajdh frhy3ui hfkhf",
                "hekdh ekfhak dkuhwk","ruyw flk ejr"};
        int randIndex = (int) (Math.random() * sentests.length);
        String sentence = sentests[randIndex];
        collector.emit(new Values(sentence));  //写出去的数据
    }

Bolts, 流的处理节点 :在一个topology中接受数据然后执行处理的组件。
对于Bolt, 用户可以定义任意的处理逻辑, 最重要的方法是execute, 输入为tuple, 输出为emit 0或多个tuples到OutputCollector.
Bolt支持多个输入流和emit多个输出流, 输出流和spout一样, 通过OutputFieldsDeclarer中的declareStream method来定义; 对于输入流, 如果想subscribe上层节点的多个输出streaming, 需要显式的通过stream_id去订阅, 如果不明确指定stream_id, 默认会订阅default stream.
也就是说Bolt可执行过滤、函数操作、合并、写数据库等操作。Bolt是一个被动的角色其接口中有一个execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。例:

public class WordCountBolt extends BaseRichBolt {
   
    private static final long serialVersionUID = -3262356130322390839L;
    private OutputCollector collector;

    @SuppressWarnings("rawtypes")
    @Override
    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
        this.collector = collector;
    }

    @Override
    public void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值