storm读书笔记

8-15 2,939 views

什么是storm

  • 分布式实时计算系统;
  • 与hadoop为批处理提供map和reduce这两种操作原语类似,storm为实时处理也提供了spout和bolt这两种操作原语;
  • storm的特点:
    1. 可扩展性,通过增加集群机器、调整计算并行度,即可以扩展计算性能;
    2. 保证数据不丢失,每条消息至少能被执行一次;
    3. 健壮性,集群状态保存在zookeeper中,节点不保存状态,节点故障不影响系统运行;
    4. 容错性,计算任务错误时,能够及时重新分配、运行计算任务,保证计算任务永远运行;
    5. 支持多种开发语言,java、python等。

storm的计算模型

  • tuple,元组,strom中的数据模型,tuple由多个key-value组成;
  • stream,流,多个tuple组成的序列,storm的计算过程就是输入流,对流进行转换、计算的过程;
  • spout,输入流的操作;
  • bolt,转换流的操作;
  • topology,拓扑,由多个spout和bolt操作组成,实现某个具体计算任务。

1

以word count为例,其spout生成sentence流,bolt 1接收sentence流,进行分词操作,生成word流,bolt 2接收word流,计算每个词出现的次数

storm的部署2

  • 一个nimbus节点,多个supervisor节点,所有的节点都是fail-fast和无状态,状态保存在zookeeper和本地磁盘;
  • nimbus,类似于hadoop中的JobTracker,负责在集群中分发代码,分配计算任务,监控失败等;
  • supervisor,类似于hadoop中的的TaskTracker,负责在集群中按照nimbus的分配,启动和停止 计算任务。

3

通过storm提供的ui模块可以查看集群信息,从上述图中可以看出集群包含4个supervisor节点。

stormapi

  • ISpout:

  • IBolt:

  • TopologyBuilder:

  • StormSubmitter:

  • LocalCluster:

storm的数据可靠性

  • 什么是storm的数据可靠性(数据完全被处理)?

仍以word count为例,spout从外部队列取消息生成sentence tuple,bolt 1生成word tuple,bolt2 生成word count tuple,这些tuple组成tuple树,sentence tuple是树的根节点。

当tuple树的所有叶子节点都被确认成功处理时,根节点才会被确认成功处理,这时可以向外部队列发送消息确认,否则会重新从外部队列获取消息再次处理。

4

  • 代码中如何保证数据可靠性?

其中_collector.ack(tuple)用于确认输入tuple是否被正常处理。

  • _collector.emit(oldTuple, newTuple)与_collector.emit(newTuple)的区别

前者会执行anchor操作,即在tuple树中构建oldTuple和newTuple的父子关系,newTuple及其后续tuple需要被确认成功处理,tuple树根节点才会被确认成功处理。

后者不会执行anchor操作,即在tuple树中只要oldTuple及其前续tuple被确认成功处理,tuple树根节点就会被确认成功处理,而不用监控后续tuple。

  • 数据可靠性的实现原理

topology在负责spout和bolt的进程外,还有一个负责ack的进程,用于在emit和ack操作时,更新tuple树,ack进程确认tuple被成功处理是采用异或来实现的。

tuple1 xor tuple1 xor tuple2 xor tuple2 = 0

异或结果为0说明所有的tuple都被正常处理。

storm的并行计算

  • 三类实体:
    1. worker:集群中的每台机器运行多个worker进程(默认值4);
    2. executor:每个worker processe进程运行多个executor线程;
    3. task:每个executor运行多个task(即spout和bolt)。
  • 并行计算实例:

5

该topology由1个spout、2个bolt组成,需要设置blue-spout并行度为2,green-bolt并行度为2,yellow-bolt并行度为6,以下是在并行度配置代码:

运行的进程、线程状态如图所示,共分配2个worker进程,10个executor线程,12个task,每个 进程各运行5个线程。

6

storm的分组策略

  • shuffle grouping:随机分组;
  • fields grouping:按字段分组;
  • all grouping:广播分组,发送到bolt的所有task中;
  • global grouping发送到bolt的同一个task(task id最小)
  • none grouping:同shuffle grouping
  • direct grouping:制定发送给某个task。
标签:

Kylin查询源码分析

什么是Kylin Apache Kylin是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 ...

阅读全文

Kylin构建源码分析

1 摘要 Kylin作为MOLAP的代表之一,其核心思想是设计cube模型,指定维度和量度,通过在维度上进行量度的预先上卷计算,保存上卷结果,以空间换时间,加速维度...

阅读全文

使用Hive存储数据实践

数据存储需求是:每天会生成大量文章数据,每条文章数据包含标题、内容、URL、发表时间等多个字段,数据后续不会更新,因此考虑使用Hive作为数据仓库存储这些...

阅读全文