- 離線計(jì)算
批量獲取數(shù)據(jù)晴弃、批量傳輸數(shù)據(jù)掩幢、周期性批量計(jì)算數(shù)據(jù)、數(shù)據(jù)展示(報(bào)表)
代表技術(shù):sqoop批量導(dǎo)入數(shù)據(jù)上鞠、hdfs批量存儲(chǔ)數(shù)據(jù)际邻、mapreduce批量計(jì)算數(shù)據(jù)、hive批量計(jì)算數(shù)據(jù)旗国、任務(wù)調(diào)度
在生產(chǎn)環(huán)境中安裝sqoop客戶端導(dǎo)入數(shù)據(jù)有生產(chǎn)風(fēng)險(xiǎn)枯怖。需要使用更安全的方式,比如用ftp采集能曾,內(nèi)天到ftp拿數(shù)據(jù)度硝。在一個(gè)公司內(nèi)部,對(duì)一份數(shù)據(jù)感興趣的部門很多寿冕,可以flume采集后蕊程,用kafka緩存,不同的部門根據(jù)需要拿數(shù)據(jù)驼唱。直接消費(fèi)或者存入hdfs - 流式計(jì)算
數(shù)據(jù)實(shí)時(shí)產(chǎn)生藻茂、實(shí)時(shí)傳輸、實(shí)時(shí)計(jì)算玫恳、實(shí)時(shí)展示
代表技術(shù):flume實(shí)時(shí)采集辨赐、kafka/metaq實(shí)時(shí)存儲(chǔ)數(shù)據(jù)、storm/jstorm實(shí)時(shí)計(jì)算數(shù)據(jù)京办、redis實(shí)時(shí)結(jié)果緩存掀序、mysql持久化存儲(chǔ)
Storm
用來實(shí)時(shí)計(jì)算源源不斷產(chǎn)生的數(shù)據(jù),如同流水線生產(chǎn)惭婿。
流式計(jì)算的一般架構(gòu):(如網(wǎng)站系統(tǒng))flume實(shí)時(shí)數(shù)據(jù)采集不恭、kafka臨時(shí)緩存數(shù)據(jù)叶雹、storm計(jì)算數(shù)據(jù)、redis結(jié)果存儲(chǔ)
Storm核心組件
nimbus:資源分配换吧、任務(wù)調(diào)度
supervisor:接收任務(wù)折晦,啟動(dòng)和通知屬于自己管理的worker進(jìn)程。worker的數(shù)量根據(jù)端口號(hào)來沾瓦。一個(gè)worker里面不會(huì)運(yùn)行屬于不同的topology的執(zhí)行任務(wù)满着。
worker:執(zhí)行任務(wù)的具體組件(其實(shí)就是一個(gè)jvm)”┲簦可以執(zhí)行spout任務(wù)或者bolt任務(wù)漓滔。
zookeeper:保存分配任務(wù)信息、心跳信息乖篷、元數(shù)據(jù)信息
executor:可以理解為一個(gè)worker進(jìn)程中的工作線程响驴。一個(gè)executor中只能運(yùn)行隸屬于一個(gè)component(spout/bolt)的task。一個(gè)worker進(jìn)程中可以有一個(gè)或者多個(gè)executor線程撕蔼。
task:默認(rèn)情況下豁鲤,一個(gè)executor運(yùn)行一個(gè)task,非默認(rèn)情況可以有多個(gè)task鲸沮。每個(gè)component(spout/bolt)的并發(fā)度就是其對(duì)應(yīng)的task數(shù)量琳骡。(task也是各個(gè)節(jié)點(diǎn)之間進(jìn)行g(shù)rouping(partition)的單位)
Storm編程模型
Topology:Storm中運(yùn)行的一個(gè)實(shí)時(shí)應(yīng)用程序
Datasource:外部數(shù)據(jù)源
Spout:在一個(gè)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è)務(wù)邏輯進(jìn)行處理怒坯。發(fā)送給下一個(gè)bolt或者存儲(chǔ)到某種介質(zhì)上(redis炫狱,mysql)。
Tuple:Storm內(nèi)部數(shù)據(jù)傳輸?shù)幕締卧拊常锩娣庋b了一個(gè)List對(duì)象视译,用來保存數(shù)據(jù)。
StreamGrouping:數(shù)據(jù)分組策略
---- 7種:ShuffleGrouping(Random函數(shù)
random.nextInt(2)
)归敬、NonGrouping(Random函數(shù))酷含、FieldGrouping(Hash取模hashcode%num
)、Local or ShuffleGrouping(本地或隨機(jī)汪茧,優(yōu)先本地)
-
并發(fā)度
topology在storm cluster中運(yùn)行時(shí)椅亚,并發(fā)主要和3個(gè)邏輯實(shí)體有關(guān):worker,executor舱污,task
worker是一個(gè)進(jìn)程什往,executor是worker進(jìn)程中的工作線程。一個(gè)Executor中只能運(yùn)行隸屬于同一個(gè)component(spout/bolt)的task慌闭。一個(gè)Worker進(jìn)程中可以有一個(gè)或多個(gè)Executor線程别威。在默認(rèn)情況下,一個(gè)Executor運(yùn)行一個(gè)task驴剔。每個(gè)component(spout/bolt)的并發(fā)度就是這個(gè)component對(duì)應(yīng)的task數(shù)量省古。
例:
圖中是一個(gè)包含有兩個(gè) worker 進(jìn)程的拓?fù)洹F渲猩ナВ{(lán)色的 BlueSpout 有兩個(gè) executor豺妓,每個(gè) executor 中有一個(gè) task,并行度為 2布讹;綠色的 GreenBolt 有兩個(gè) executor琳拭,每個(gè) executor 有兩個(gè) task,并行度也為2描验;而黃色的YellowBolt 有 6 個(gè) executor白嘁,每個(gè) executor 中有一個(gè) task,并行度為 6膘流,因此絮缅,這個(gè)拓?fù)涞目偛⑿卸染褪?2 + 2 + 6 = 10。具體分配到每個(gè) worker 就有 10 / 2 = 5 個(gè) executor呼股。
一個(gè)worker只屬于一個(gè)topology,每個(gè)worker中運(yùn)行的task只能屬于這個(gè)topology耕魄。 反之,一個(gè)topology包含多個(gè)worker彭谁,其實(shí)就是這個(gè)topology運(yùn)行在多個(gè)worker上吸奴。一個(gè)topology要求的worker數(shù)量如果不被滿足,集群在任務(wù)分配時(shí)缠局,根據(jù)現(xiàn)有的worker先運(yùn)行topology则奥。如果當(dāng)前集群中worker數(shù)量為0,那么最新提交的topology將只會(huì)被標(biāo)識(shí)active甩鳄,不會(huì)運(yùn)行逞度,只有當(dāng)集群有了空閑資源之后,才會(huì)被運(yùn)行妙啃。