大數(shù)據(jù)基礎(chǔ)知識學習-----Storm學習筆記

Storm學習筆記總結(jié)

Storm概述

離線計算是什么

離線計算:批量獲取數(shù)據(jù)勇劣、批量傳輸數(shù)據(jù)靖避、周期性批量計算數(shù)據(jù)、數(shù)據(jù)展示
代表技術(shù):Sqoop批量導入數(shù)據(jù)比默、HDFS批量存儲數(shù)據(jù)幻捏、MapReduce批量計算數(shù)據(jù)、Hive批量計算數(shù)據(jù)

流式計算是什么

流式計算:數(shù)據(jù)實時產(chǎn)生命咐、數(shù)據(jù)實時傳輸粘咖、數(shù)據(jù)實時計算、實時展示
代表技術(shù):Flume實時獲取數(shù)據(jù)侈百、Kafka實時數(shù)據(jù)存儲瓮下、Storm/JStorm實時數(shù)據(jù)計算翰铡、Redis實時結(jié)果緩存、持久化存儲(mysql)讽坏。
離線計算與實時計算最大的區(qū)別:實時收集锭魔、實時計算、實時展示

Storm是什么

Storm是一個分布式計算框架路呜,主要使用Clojure與Java語言編寫迷捧,最初是由Nathan Marz帶領(lǐng)Backtype公司團隊創(chuàng)建,在Backtype公司被Twitter公司收購后進行開源胀葱。最初的版本是在2011年9月17日發(fā)行漠秋,版本號0.5.0。
2013年9月抵屿,Apache基金會開始接管并孵化Storm項目庆锦。Apache Storm是在Eclipse Public License下進行開發(fā)的,它提供給大多數(shù)企業(yè)使用轧葛。經(jīng)過1年多時間搂抒,2014年9月,Storm項目成為Apache的頂級項目尿扯。目前求晶,Storm的最新版本1.1.0。
Storm是一個免費開源的分布式實時計算系統(tǒng)衷笋。Storm能輕松可靠地處理無界的數(shù)據(jù)流芳杏,就像Hadoop對數(shù)據(jù)進行批處理;

Storm與Hadoop的區(qū)別

  • Storm用于實時計算辟宗,Hadoop用于離線計算蚜锨。
  • Storm處理的數(shù)據(jù)保存在內(nèi)存中,源源不斷慢蜓;Hadoop處理的數(shù)據(jù)保存在文件系統(tǒng)中,一批一批處理郭膛。
  • Storm的數(shù)據(jù)通過網(wǎng)絡傳輸進來晨抡;Hadoop的數(shù)據(jù)保存在磁盤中。
  • Storm與Hadoop的編程模型相似
Storm hadoop
角色 Nimbus JobTracker
Supervisor TaskTracker
Worker Child
應用名稱 Topology Job
編程接口 Spout/Bolt Mapper/Reducer

hadoop的相關(guān)名稱

  • Job:任務名稱
  • JobTracker:項目經(jīng)理(JobTracker對應于NameNode则剃;JobTracker是一個master服務耘柱,軟件啟動之后JobTracker接收Job,負責調(diào)度Job的每一個子任務task運行于TaskTracker上棍现,并監(jiān)控它們调煎,如果發(fā)現(xiàn)有失敗的task就重新運行它。)
  • TaskTracker:開發(fā)組長(TaskTracker對應于DataNode己肮;TaskTracker是運行在多個節(jié)點上的slaver服務士袄。TaskTracker主動與JobTracker通信悲关,接收作業(yè),并負責直接執(zhí)行每一個任務娄柳。)
  • Child:負責開發(fā)的人員
  • Mapper/Reduce:開發(fā)人員中的兩種角色寓辱,一種是服務器開發(fā)、一種是客戶端開發(fā)

storm相關(guān)名稱

  • Topology:任務名稱
  • Nimbus:項目經(jīng)理
  • Supervisor:開組長
  • Worker:開人員
  • Spout/Bolt:開人員中的兩種角色赤拒,一種是服務器開發(fā)秫筏、一種是客戶端開發(fā)

Storm應用場景

Storm用來實時計算源源不斷產(chǎn)生的數(shù)據(jù),如同流水線生產(chǎn)挎挖,Storm能用到很多場景中这敬,包括:實時分析、在線機器學習蕉朵、連續(xù)計算等崔涂。

  • 推薦系統(tǒng):實時推薦,根據(jù)下單或加入購物車推薦相關(guān)商品
  • 金融系統(tǒng):實時分析股票信息數(shù)據(jù)
  • 預警系統(tǒng):根據(jù)實時采集數(shù)據(jù)墓造,判斷是否到了預警閾值堪伍。
  • 網(wǎng)站統(tǒng)計:實時銷量、流量統(tǒng)計觅闽,如淘寶雙11效果圖

Sotrm特點

  • 適用場景廣泛:Storm可以適用實時處理消息帝雇、更新數(shù)據(jù)庫、持續(xù)計算等場景蛉拙。
  • 可伸縮性高:Storm的可伸縮性可以讓Storm每秒處理的消息量達到很高尸闸。擴展一個實時計算任務,你所需要做的就是加機器并且提高這個計算任務的并行度孕锄。Storm使用Zookeeper來協(xié)調(diào)機器內(nèi)的各種配置使得Storm的集群可以很容易的擴展吮廉。
  • 保證無數(shù)據(jù)丟失:Storm保證所有的數(shù)據(jù)都被處理。
  • 異常健壯:Storm集群非常容易管理畸肆,輪流重啟節(jié)點不影響應用宦芦。
  • 容錯性好:在消息處理過程中出現(xiàn)異常,Storm會進行重試轴脐。

Storm基礎(chǔ)理論

Storm編程模型

storm01.png

元組(Tuple)

元組(Tuple)调卑,是消息傳遞的基本單元,是一個命名的值列表大咱,元組中的字段可以是任何類型的對象恬涧。Storm使用元組作為其數(shù)據(jù)模型,元組支持所有的基本類型碴巾、字符串和字節(jié)數(shù)組作為字段值溯捆,只要實現(xiàn)類型的序列化接口就可以使用該類型的對象。元組本來應該是一個key-value的Map厦瓢,但是由于各個組件間傳遞的元組的字段名稱已經(jīng)事先定義好提揍,所以只要按序把元組填入各個value即可啤月,所以元組是一個value的List。

流(Stream)

流是Storm的核心抽象碳锈,是一個無界的元組系列顽冶,源源不斷傳遞的元組就組成了流,在分布式環(huán)境中并行地進行創(chuàng)建和處理

水龍頭(Spout)

Spout是拓撲的流的來源售碳,是一個拓撲中產(chǎn)生源數(shù)據(jù)流的組件强重。通常情況下,Spout會從外部數(shù)據(jù)源中讀取數(shù)據(jù)贸人,然后轉(zhuǎn)換為拓撲內(nèi)部的源數(shù)據(jù)间景。

  • Spout可以是可靠的,也可以是不可靠的艺智。如果Storm處理元組失敗倘要,可靠的Spout能夠重新發(fā)射,而不可靠的Spout就盡快忘記發(fā)出的元組十拣。
  • Spout可以發(fā)出超過一個流封拧。
  • Spout的主要方法是nextTuple()。NextTuple()會發(fā)出一個新的Tuple到拓撲夭问,如果沒有新的元組發(fā)出泽西,則簡單返回。
  • Spout的其他方法是ack()和fail()缰趋。當Storm檢測到一個元組從Spout發(fā)出時捧杉,ack()和fail()會被調(diào)用,要么成功完成通過拓撲秘血,要么未能完成味抖。Ack()和fail()僅被可靠的Spout調(diào)用。IRichSpout是Spout必須實現(xiàn)的接口灰粮。

轉(zhuǎn)接頭(Bolt)

在拓撲中所有處理都在Bolt中完成仔涩,Bolt是流的處理節(jié)點,從一個拓撲接收數(shù)據(jù)粘舟,然后執(zhí)行進行處理的組件熔脂。Bolt可以完成過濾、業(yè)務處理蓖乘、連接運算、連接與訪問數(shù)據(jù)庫等任何操作韧骗。

  • Bolt是一個被動的角色嘉抒,七接口中有一個execute()方法,在接收到消息后會調(diào)用此方法袍暴,用戶可以在其中執(zhí)行自己希望的操作些侍。
  • Bolt可以完成簡單的流的轉(zhuǎn)換隶症,而完成復雜的流的轉(zhuǎn)換通常需要多個步驟,因此需要多個Bolt岗宣。
  • Bolt可以發(fā)出超過一個的流蚂会。

拓撲(Topology)

拓撲(Topology)是Storm中運行的一個實時應用程序,因為各個組件間的消息流動而形成邏輯上的拓撲結(jié)構(gòu)耗式。
把實時應用程序的運行邏輯打成jar包后提交到Storm的拓撲(Topology)胁住。Storm的拓撲類似于MapReduce的作業(yè)(Job)。其主要的區(qū)別是刊咳,MapReduce的作業(yè)最終會完成彪见,而一個拓撲永遠都在運行直到它被殺死。一個拓撲是一個圖的Spout和Bolt的連接流分組娱挨。

Storm核心組件

nimbus是整個集群的控管核心余指,負責topology的提交、運行狀態(tài)監(jiān)控跷坝、任務重新分配等工作酵镜。
zk就是一個管理者,監(jiān)控者柴钻。

總體描述:nimbus下命令(分配任務)淮韭,zk監(jiān)督執(zhí)行(心跳監(jiān)控,worker顿颅、supurvisor的心跳都歸它管)缸濒,supervisor領(lǐng)旨(下載代碼),招募人馬(創(chuàng)建worker和線程等)粱腻,worker庇配、executor就給我干活!task就是具體要干的活绍些。

主控節(jié)點與工作節(jié)點

Storm集群中有兩類節(jié)點:主控節(jié)點(Master Node)和工作節(jié)點(Worker Node)捞慌。其中,主控節(jié)點只有一個柬批,而工作節(jié)點可以有多個啸澡。

Nimbus進程與Supervisor進程

主控節(jié)點運行一個稱為Nimbus的守護進程類似于Hadoop的JobTracker。Nimbus負責在集群中分發(fā)代碼氮帐,對節(jié)點分配任務嗅虏,并監(jiān)視主機故障。
每個工作節(jié)點運行一個稱為Supervisor的守護進程上沐。Supervisor監(jiān)聽其主機上已經(jīng)分配的主機的作業(yè)皮服,啟動和停止Nimbus已經(jīng)分配的工作進程。

流分組(Stream grouping)

流分組,是拓撲定義中的一部分龄广,為每個Bolt指定應該接收哪個流作為輸入硫眯。流分組定義了流/元組如何在Bolt的任務之間進行分發(fā)。Storm內(nèi)置了8種流分組方式择同。

工作進程(Worker)

Worker是Spout/Bolt中運行具體處理邏輯的進程两入。一個worker就是一個進程,進程里面包含一個或多個線程敲才。

執(zhí)行器(Executor)

一個線程就是一個executor裹纳,一個線程會處理一個或多個任務。

任務(Task)

一個任務就是一個task归斤。

實時計算常用架構(gòu)圖

后臺系統(tǒng) -->Flume集群-->Kafka集群-->Storm集群-->Redis集群

  • Flume獲取數(shù)據(jù)痊夭。
  • Kafka臨時保存數(shù)據(jù)。
  • Strom計算數(shù)據(jù)脏里。
  • Redis是個內(nèi)存數(shù)據(jù)庫她我,用來保存數(shù)據(jù)。

Storm集群搭建

環(huán)境準備

jar包下載

安裝集群步驟:http://storm.apache.org/releases/1.1.2/Setting-up-a-Storm-cluster.html

虛擬機準備

  • 準備3臺虛擬機
  • 配置ip地址
1.在終端命令窗口中輸入
[root@hadoop101 /]#vim /etc/udev/rules.d/70-persistent-net.rules
刪除eth0該行迫横;將eth1修改為eth0番舆,同時復制物理ip地址
2.修改IP地址
[root@hadoop101 /]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
需要修改的內(nèi)容有5項:
IPADDR=192.168.1.101
GATEWAY=192.168.1.2
ONBOOT=yes
BOOTPROTO=static
DNS1=192.168.1.2
:wq  保存退出
3.執(zhí)行service network restart
4.如果報錯,reboot矾踱,重啟虛擬機
  • 配置主機名稱
  • 3臺主機分別關(guān)閉防火墻
[root@hadoop102 luo]# chkconfig iptables off
[root@hadoop103 luo]# chkconfig iptables off
[root@hadoop104 luo]# chkconfig iptables off

安裝Jdk

卸載現(xiàn)有jdk

  • 查詢是否安裝java軟件:rpm -qa|grep java
  • 如果安裝的版本低于1.7恨狈,卸載該jdk:rpm -e 軟件包

用filezilla工具將jdk、Hadoop-2.7.2.tar.gz導入到opt目錄下面的software文件夾下面

在linux系統(tǒng)下的opt目錄中查看軟件包是否導入成功

[root@hadoop101opt]# cd software/
[root@hadoop101software]# ls
jdk-7u79-linux-x64.gz  hadoop-2.7.2.tar.gz   

解壓jdk到/opt/module目錄下

tar -zxf jdk-7u79-linux-x64.gz -C /opt/module/

配置jdk環(huán)境變量

1.先獲取jdk路徑:
[root@hadoop101 jdk1.7.0_79]# pwd /opt/module/jdk1.7.0_79     
2.打開/etc/profile文件:
[root@hadoop101 jdk1.7.0_79]# vi /etc/profile
在profie文件末尾添加jdk路徑:
##JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
3.保存后退出:
:wq
4.讓修改后的文件生效:
[root@hadoop101 jdk1.7.0_79]# source  /etc/profile
5.重啟(如果java –version可以用就不用重啟):  
[root@hadoop101 jdk1.7.0_79]# sync
[root@hadoop101 jdk1.7.0_79]# reboot
6.測試jdk安裝成功
[root@hadoop101 jdk1.7.0_79]# java -version
java version "1.7.0_79"

安裝Zookeeper

集群規(guī)劃

在hadoop102呛讲、hadoop103和hadoop104三個節(jié)點上部署Zookeeper

解壓安裝

解壓zookeeper安裝包到/opt/module/目錄下l

[luo@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

在/opt/module/zookeeper-3.4.10/這個目錄下創(chuàng)建zkDatae

mkdir -p zkData

重命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg為zoo.cfg

mv zoo_sample.cfg zoo.cfg

配置zoo.cfg文件

具體配置

dataDir=/opt/module/zookeeper-3.4.10/zkData

增加如下配置

#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888

配置參數(shù)說明

Server.A=B:C:D
A是一個數(shù)字禾怠,表示這個是第幾號服務器;
B是這個服務器的ip地址贝搁;
C是這個服務器與集群中的Leader服務器交換信息的端口吗氏;
D是萬一集群中的Leader服務器掛了,需要一個端口來重新進行選舉雷逆,
    選出一個新的Leader弦讽,而這個端口就是用來執(zhí)行選舉時服務器相互通信的端口

集群模式下配置一個文件myid,這個文件在dataDir目錄下膀哲,這個文件里面有一個數(shù)據(jù)就是A的值往产,Zookeeper啟動時讀取此文件,拿到里面的數(shù)據(jù)與zoo.cfg里面的配置信息比較從而判斷到底是哪個server某宪。

集群操作

在/opt/module/zookeeper-3.4.10/zkData目錄下創(chuàng)建一個myid的文件

touch myid

添加myid文件仿村,注意一定要在linux里面創(chuàng)建,在notepad++里面很可能亂碼

編輯myid文件

vi myid
在文件中添加與server對應的編號:如2

拷貝配置好的zookeeper到其他機器上

scp -r zookeeper-3.4.10/ root@hadoop103.luo.com:/opt/app/
scp -r zookeeper-3.4.10/ root@hadoop104.luo.com:/opt/app/
并分別修改myid文件中內(nèi)容為3兴喂、4

分別啟動zookeeper

[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop104 zookeeper-3.4.10]# bin/zkServer.sh start

查看狀態(tài)

[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[root@hadoop104 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

Storm集群部署

配置集群

  • 拷貝jar包到hadoop102的/opt/software目錄下
  • 解壓jar包到/opt/module目錄下:[luo@hadoop102 software]$ tar -zxvf apache-storm-1.1.0.tar.gz -C /opt/module/
  • 修改解壓后的apache-storm-1.1.0.tar.gz文件名稱為storm:[luo@hadoop102 module]$ mv apache-storm-1.1.0/ storm
  • 在/opt/module/storm/目錄下創(chuàng)建data文件夾:[luo@hadoop102 storm]$ mkdir data
  • 修改配置文件
[luo@hadoop102 conf]$ pwd /opt/module/storm/conf
[luo@hadoop102 conf]$ vi storm.yaml
# 設置Zookeeper的主機名稱
storm.zookeeper.servers:
     - "hadoop102"
     - "hadoop103"
     - "hadoop104"
# 設置主節(jié)點的主機名稱
nimbus.seeds: ["hadoop102"]
# 設置Storm的數(shù)據(jù)存儲路徑
storm.local.dir: "/opt/module/storm/data"
# 設置Worker的端口號
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
  • 配置環(huán)境變量
[root@hadoop102 storm]# vi /etc/profile #STORM_HOME
export STORM_HOME=/opt/module/storm
export PATH=$PATH:$STORM_HOME/bin
[root@hadoop102 storm]# source /etc/profile
  • 分發(fā)配置好的Storm安裝包:[luo@hadoop102 storm]$ xsync storm/

  • 啟動集群

    • 后臺啟動nimbus
    [luo@hadoop102 storm]$ bin/storm nimbus &
    [luo@hadoop103 storm]$ bin/storm nimbus &
    [luo@hadoop104 storm]$ bin/storm nimbus &
    
    • 后臺啟動supervisor
    [luo@hadoop102 storm]$ bin/storm supervisor &
    [luo@hadoop103 storm]$ bin/storm supervisor &
    [luo@hadoop104 storm]$ bin/storm supervisor &
    
    • 啟動Storm ui
    [luo@hadoop102 storm]$ bin/storm ui
    

通過瀏覽器查看集群狀態(tài):http://hadoop102:8080/index.html

Storm日志信息查看

查看nimbus的日志信息

在nimbus的服務器上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/nimbus.log

查看ui運行日志信息

在ui的服務器上蔼囊,一般和nimbus一個服務器
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/ui.log

查看supervisor運行日志信息

在supervisor服務上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/supervisor.log

查看supervisor上worker運行日志信息

在supervisor服務上
cd /opt/module/storm/logs
tail -100f /opt/module/storm/logs/worker-6702.log

logviewer包颁,可以在web頁面點擊相應的端口號即可查看日志

分別在supervisor節(jié)點上執(zhí)行:
[luo@hadoop102 storm]$ bin/storm logviewer &
[luo@hadoop103 storm]$ bin/storm logviewer &
[luo@hadoop104 storm]$ bin/storm logviewer &

Storm命令行操作

  • nimbus:啟動nimbus守護進程:storm nimbus
  • supervisor:啟動supervisor守護進程:storm supervisor
  • ui:啟動UI守護進程:storm ui
  • list:列出正在運行的拓撲及其狀態(tài):storm list
  • logviewer:Logviewer提供一個web接口查看Storm日志文件:storm logviewer
  • jar:storm jar 【jar路徑】 【拓撲包名.拓撲類名】 【拓撲名稱】
  • kill:殺死名為Topology-name的拓撲:storm kill topology-name [-w wait-time-secs]-w:等待多久后殺死拓撲
  • active:激活指定的拓撲spout:storm activate topology-name
  • deactivate:禁用指定的拓撲Spout:storm deactivate topology-name
  • help:打印一條幫助消息或者可用命令的列表:storm helpstorm help <command>

常用API

API簡介

Component組件

基本接口

  • IComponent接口
  • ISpout接口
  • IRichSpout接口
  • IStateSpout接口
  • IRichStateSpout接口
  • IBolt接口
  • IRichBolt接口
  • IBasicBolt接口

基本抽象類

  • BaseComponent抽象類
  • BaseRichSpout抽象類
  • BaseRichBolt抽象類
  • BaseTransactionalBolt抽象類
  • BaseBasicBolt抽象類

spout水龍頭

Spout的最頂層抽象是ISpout接口

  • Open():初始化方法
  • close():該spout關(guān)閉前執(zhí)行,但是并不能得到保證其一定被執(zhí)行压真,kill -9時不執(zhí)行,Storm kill {topoName} 時執(zhí)行
  • activate():當Spout已經(jīng)從失效模式中激活時被調(diào)用蘑险。該Spout的nextTuple()方法很快就會被調(diào)用
  • deactivate:當Spout已經(jīng)失效時被調(diào)用滴肿。在Spout失效期間,nextTuple不會被調(diào)用佃迄。Spout將來可能會也可能不會被重新激活
  • nextTuple():當調(diào)用nextTuple()方法時泼差,Storm要求Spout發(fā)射元組到輸出收集器(OutputCollecctor)。NextTuple方法應該是非阻塞的呵俏,所以堆缘,如果Spout沒有元組可以發(fā)射,該方法應該返回普碎。nextTuple()吼肥、ack()和fail()方法都在Spout任務的單一線程內(nèi)緊密循環(huán)被調(diào)用。當沒有元組可以發(fā)射時麻车,可以讓nextTuple去sleep很短的時間缀皱,例如1毫秒,這樣就不會浪費太多的CPU資源
  • ask():成功處理tuple回調(diào)方法
  • fail():處理失敗tuole回調(diào)方法

bolt轉(zhuǎn)接頭

bolt的最頂層抽象是IBolt接口

prepare():prepare ()方法在集群的工作進程內(nèi)被初始化時被調(diào)用动猬,提供了Bolt執(zhí)行所需要的環(huán)境啤斗。

execute():接受一個tuple進行處理,也可emit數(shù)據(jù)到下一級組件赁咙。

cleanup():Cleanup方法當一個IBolt即將關(guān)閉時被調(diào)用钮莲。不能保證cleanup()方法一定會被調(diào)用,因為Supervisor可以對集群的工作進程使用kill -9命令強制殺死進程命令彼水。

如果在本地模式下運行Storm崔拥,當拓撲被殺死的時候,可以保證cleanup()方法一定會被調(diào)用猿涨。

實現(xiàn)一個Bolt握童,可以實現(xiàn)IRichBolt接口或繼承BaseRichBolt,如果不想自己處理結(jié)果反饋叛赚,可以實現(xiàn) IBasicBolt接口或繼承BaseBasicBolt澡绩,它實際上相當于自動做了prepare方法和collector.emit.ack(inputTuple)。

spout的tail特性

Storm可以實時監(jiān)測文件數(shù)據(jù)俺附,當文件數(shù)據(jù)變化時肥卡,Storm自動讀取。

分組策略和并發(fā)度

讀取文件路徑和方法

  • spout數(shù)據(jù)源:數(shù)據(jù)庫事镣、文件步鉴、MQ(比如:Kafka)
  • 數(shù)據(jù)源是數(shù)據(jù)庫:只適合讀取數(shù)據(jù)庫的配置文件
  • 數(shù)據(jù)源是文件:只適合測試、講課用(因為集群是分布式集群)
  • 企業(yè)產(chǎn)生的log文件處理步驟:(1)讀出內(nèi)容寫入MQ(2)Storm再處理

分組策略(Stream Grouping)

stream grouping用來定義一個stream應該如何分配給Bolts上面的多個Executors(多線程多并發(fā))氛琢。

Storm里面有7種類型的stream grouping

  • Shuffle Grouping: 隨機分組喊递,輪詢,平均分配阳似。隨機派發(fā)stream里面的tuple骚勘,保證每個bolt接收到的tuple數(shù)目大致相同。
  • Fields Grouping:按字段分組撮奏,比如按userid來分組俏讹,具有同樣userid的tuple會被分到相同的Bolts里的一個task,而不同的userid則會被分配到不同的bolts里的task畜吊。
  • All Grouping:廣播發(fā)送泽疆,對于每一個tuple旨别,所有的bolts都會收到舀射。
  • Global Grouping:全局分組车柠,這個tuple被分配到storm中的一個bolt的其中一個task描沟。再具體一點就是分配給id值最低的那個task镜雨。
  • Non Grouping:不分組攘轩,這stream grouping個分組的意思是說stream不關(guān)心到底誰會收到它的tuple狂巢。目前這種分組和Shuffle grouping是一樣的效果躏仇。在多線程情況下不平均分配延窜。
  • Direct Grouping:直接分組恋腕,這是一種比較特別的分組方法,用這種分組意味著消息的發(fā)送者指定由消息接收者的哪個task處理這個消息逆瑞。只有被聲明為Direct Stream的消息流可以聲明這種分組方法荠藤。而且這種消息tuple必須使用emitDirect方法來發(fā)射。消息處理者可以通過TopologyContext來獲取處理它的消息的task的id (OutputCollector.emit方法也會返回task的id)获高。
  • Local or shuffle grouping:如果目標bolt有一個或者多個task在同一個工作進程中哈肖,tuple將會被隨機發(fā)送給這些tasks。否則念秧,和普通的Shuffle Grouping行為一致淤井。

并發(fā)度

并發(fā)度場景

  • 單線程下:加減乘除、全局匯總
  • 多線程下:局部加減乘除摊趾、持久化DB等

并發(fā)度

并發(fā)度:用戶指定一個任務币狠,可以被多個線程執(zhí)行,并發(fā)度的數(shù)量等于線程executor的數(shù)量砾层。

Task就是具體的處理邏輯對象漩绵,一個executor線程可以執(zhí)行一個或多個tasks,但一般默認每個executor只執(zhí)行一個task肛炮,所以我們往往認為task就是執(zhí)行線程止吐,其實不是宝踪。

Task代表最大并發(fā)度,一個component的task數(shù)是不會改變的碍扔,但是一個componet的executer數(shù)目是會發(fā)生變化的(storm rebalance命令)瘩燥,task數(shù)>=executor數(shù),executor數(shù)代表實際并發(fā)數(shù)不同。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颤芬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子套鹅,更是在濱河造成了極大的恐慌,老刑警劉巖汰具,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卓鹿,死亡現(xiàn)場離奇詭異,居然都是意外死亡留荔,警方通過查閱死者的電腦和手機吟孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聚蝶,“玉大人杰妓,你說我怎么就攤上這事〉饷悖” “怎么了巷挥?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長验靡。 經(jīng)常有香客問我倍宾,道長,這世上最難降的妖魔是什么胜嗓? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任高职,我火速辦了婚禮,結(jié)果婚禮上辞州,老公的妹妹穿的比我還像新娘怔锌。我一直安慰自己,他們只是感情好变过,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布埃元。 她就那樣靜靜地躺著,像睡著了一般媚狰。 火紅的嫁衣襯著肌膚如雪亚情。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天哈雏,我揣著相機與錄音楞件,去河邊找鬼衫生。 笑死,一個胖子當著我的面吹牛土浸,可吹牛的內(nèi)容都是我干的罪针。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黄伊,長吁一口氣:“原來是場噩夢啊……” “哼泪酱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起还最,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墓阀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拓轻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斯撮,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年扶叉,在試婚紗的時候發(fā)現(xiàn)自己被綠了勿锅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡枣氧,死狀恐怖溢十,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情达吞,我是刑警寧澤张弛,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站酪劫,受9級特大地震影響乌庶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜契耿,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一瞒大、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搪桂,春花似錦透敌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至内列,卻和暖如春撵术,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背话瞧。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工嫩与, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寝姿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓划滋,卻偏偏與公主長得像饵筑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子处坪,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容