- 離線計算
批量獲取數(shù)據(jù)、批量傳輸數(shù)據(jù)、周期性批量計算數(shù)據(jù)、數(shù)據(jù)展示(報表)
代表技術(shù):sqoop批量導入數(shù)據(jù)、hdfs批量存儲數(shù)據(jù)、mapreduce批量計算數(shù)據(jù)、hive批量計算數(shù)據(jù)、任務調(diào)度
在生產(chǎn)環(huán)境中安裝sqoop客戶端導入數(shù)據(jù)有生產(chǎn)風險。需要使用更安全的方式,比如用ftp采集,內(nèi)天到ftp拿數(shù)據(jù)。在一個公司內(nèi)部,對一份數(shù)據(jù)感興趣的部門很多,可以flume采集后,用kafka緩存,不同的部門根據(jù)需要拿數(shù)據(jù)。直接消費或者存入hdfs - 流式計算
數(shù)據(jù)實時產(chǎn)生、實時傳輸、實時計算、實時展示
代表技術(shù):flume實時采集、kafka/metaq實時存儲數(shù)據(jù)、storm/jstorm實時計算數(shù)據(jù)、redis實時結(jié)果緩存、mysql持久化存儲
Storm
用來實時計算源源不斷產(chǎn)生的數(shù)據(jù),如同流水線生產(chǎn)。
流式計算的一般架構(gòu):(如網(wǎng)站系統(tǒng))flume實時數(shù)據(jù)采集、kafka臨時緩存數(shù)據(jù)、storm計算數(shù)據(jù)、redis結(jié)果存儲
Storm核心組件
nimbus:資源分配、任務調(diào)度
supervisor:接收任務,啟動和通知屬于自己管理的worker進程。worker的數(shù)量根據(jù)端口號來。一個worker里面不會運行屬于不同的topology的執(zhí)行任務。
worker:執(zhí)行任務的具體組件(其實就是一個jvm)。可以執(zhí)行spout任務或者bolt任務。
zookeeper:保存分配任務信息、心跳信息、元數(shù)據(jù)信息
executor:可以理解為一個worker進程中的工作線程。一個executor中只能運行隸屬于一個component(spout/bolt)的task。一個worker進程中可以有一個或者多個executor線程。
task:默認情況下,一個executor運行一個task,非默認情況可以有多個task。每個component(spout/bolt)的并發(fā)度就是其對應的task數(shù)量。(task也是各個節(jié)點之間進行g(shù)rouping(partition)的單位)
Storm編程模型
Topology:Storm中運行的一個實時應用程序
Datasource:外部數(shù)據(jù)源
Spout:在一個Topology中獲取源數(shù)據(jù)流的組件。將外部數(shù)據(jù)轉(zhuǎn)化為Storm內(nèi)部的數(shù)據(jù),以Tuple為基本的傳輸單元下發(fā)給Bolt:接收Spout發(fā)送的數(shù)據(jù),或上游的bolt發(fā)送的數(shù)據(jù)。根據(jù)業(yè)務邏輯進行處理。發(fā)送給下一個bolt或者存儲到某種介質(zhì)上(redis,mysql)。
Tuple:Storm內(nèi)部數(shù)據(jù)傳輸?shù)幕締卧锩娣庋b了一個List對象,用來保存數(shù)據(jù)。
StreamGrouping:數(shù)據(jù)分組策略
---- 7種:ShuffleGrouping(Random函數(shù)
random.nextInt(2)
)、NonGrouping(Random函數(shù))、FieldGrouping(Hash取模hashcode%num
)、Local or ShuffleGrouping(本地或隨機,優(yōu)先本地)
-
并發(fā)度
topology在storm cluster中運行時,并發(fā)主要和3個邏輯實體有關(guān):worker,executor,task
worker是一個進程,executor是worker進程中的工作線程。一個Executor中只能運行隸屬于同一個component(spout/bolt)的task。一個Worker進程中可以有一個或多個Executor線程。在默認情況下,一個Executor運行一個task。每個component(spout/bolt)的并發(fā)度就是這個component對應的task數(shù)量。
例:
圖中是一個包含有兩個 worker 進程的拓撲。其中,藍色的 BlueSpout 有兩個 executor,每個 executor 中有一個 task,并行度為 2;綠色的 GreenBolt 有兩個 executor,每個 executor 有兩個 task,并行度也為2;而黃色的YellowBolt 有 6 個 executor,每個 executor 中有一個 task,并行度為 6,因此,這個拓撲的總并行度就是 2 + 2 + 6 = 10。具體分配到每個 worker 就有 10 / 2 = 5 個 executor。
一個worker只屬于一個topology,每個worker中運行的task只能屬于這個topology。 反之,一個topology包含多個worker,其實就是這個topology運行在多個worker上。一個topology要求的worker數(shù)量如果不被滿足,集群在任務分配時,根據(jù)現(xiàn)有的worker先運行topology。如果當前集群中worker數(shù)量為0,那么最新提交的topology將只會被標識active,不會運行,只有當集群有了空閑資源之后,才會被運行。