大数据之Storm介绍及原理

本文详细介绍了大数据处理框架Storm的组件结构,包括Spout、Bolt的使用,通过一个入门案例展示了如何创建一个单词计数的流程。同时,文章探讨了Storm的并发机制、数据流分组策略,并简述了Storm集群中的关键概念,如Nimbus和Supervisor,为读者提供了一个全面了解Storm的视角。
摘要由CSDN通过智能技术生成

一、概述

Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。

Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。

Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。

Storm的部署和运维都很便捷,而且更为重要的是可以使用任意编程语言来开发应用。

二、组件

1、结构

storm结构称为topology(拓扑),由stream(数据流)、spout(数据流的生成者)、bolt(数据流运算者)组成。

下图为官网提供的模型:

不同于Hadoop中的job,Storm中的topology会一直运行下去,除非进程被杀死或取消部署。

2、Stream

Storm的核心数据结构是tuple(元组),本质上是包含了一个或多个键值对的列表。Stream是由无限个的tuple组成的序列。

3、spout

spout连接数据源,将数据转化为tuple,并将tuple作为数据流进行发射。开发一个spout的主要工作就是利用API编写代码从数据源消费数据流。

spout的数据源可以有很多种来源:

web或者移动程序的点击流、社交网络的信息、传感器收集到的数据、应用程序产生的日志信息。

spout通常只负责转换数据、发射数据,不会用于处理业务逻辑,防止与业务产生耦合,从而可以很方便的实现spout的复用。

4、bolt

bolt主要负责数据的运算。将接收到的数据实施运算后,选择性的输出一个或多个数据流。

一个bolt可以接收多个由spout或其他bolt发射的数据流,从而可以组建出复杂的数据转换和处理的网络拓扑结构。

bolt常见的典型功能:

过滤、连接、聚合、计算和数据库的读写。

三、入门案例

1、案例结构

案例:Word Count案例

语句Spout-->语句分隔Bolt-->单词计数Bolt-->上报Bolt。

2、代码实现

1.语句生成Spout

SentenceSpout

作为入门案例,可以直接从一个数组中不断读取语句,作为数据来源。

SentenceSpout不断读取语句将其作为数据来源,组装成单值tuple(键名sentence,键值为字符串格式的语句)向后发射。

{“sentence”:“i am so shuai!”}
代码:

/**

  • BaseRichSpout类是ISpout接口和IComponent接口的一个简便的实现。采用了适配器模式,对用不到的方法提供了默认实现。
    */
    public class SentenceSpout extends BaseRichSpout {

    private SpoutOutputCollector collector = null;
    private String[] sentencer = {
    “i am so shuai”,
    “do you look me”,
    “you can see me”,
    “i am so shuai”,
    “do you bilive”
    };
    private int index = 0;

    /**

    • ISpout接口中定义的方法 所有Spout组件在初始化时都会调用这个方法。 map 包含了Storm配置信息 context
    • 提供了topology中的组件信息 collector 提供了发射tuple的方法
      */
      @Override
      public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
      this.collector = collector;
      }

    /**

    • 覆盖自BaseRichSpout中的方法 核心方法 Storm通过调用此方法向发射tuple
      */
      @Override
      public void nextTuple() {
      this.collector.emit(new Values(sentencer[index]));
      index = (index + 1 >= sentencer.length ? 0 : index + 1);
      Utils.sleep(1000);
      }

    /**

    • IComponent接口中定义的方法 所有的Storm组件(spout、bolt)都要实现此接口。
    • 此方法告诉Storm当前组件会发射哪些数据流,每个数据流中的tuple中包含哪些字段。
      */
      @Override
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值