flink--架構(gòu)覆享、運(yùn)行佳遂、調(diào)度原理

[TOC]

flink是什么

Flink主頁(yè)在其頂部展示了該項(xiàng)目的理念:“Apache Flink是為分布式、高性能撒顿、隨時(shí)可用以及準(zhǔn)確的流處理應(yīng)用程序打造的開(kāi)源流處理框架”丑罪。Apache Flink是一個(gè)框架和分布式處理引擎,用于對(duì)***和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計(jì)算凤壁。Flink被設(shè)計(jì)在所有常見(jiàn)的集群環(huán)境中運(yùn)行吩屹,以?xún)?nèi)存執(zhí)行速度和任意規(guī)模來(lái)執(zhí)行計(jì)算。

flink基本框架

批處理的特點(diǎn)是有界拧抖、持久煤搜、大量,批處理非常適合需要訪(fǎng)問(wèn)全套記錄才能完成的計(jì)算工作唧席,一般用于離線(xiàn)統(tǒng)計(jì)擦盾。流處理的特點(diǎn)是***嘲驾、實(shí)時(shí),流處理方式無(wú)需針對(duì)整個(gè)數(shù)據(jù)集執(zhí)行操作厌衙,而是對(duì)通過(guò)系統(tǒng)傳輸?shù)拿總€(gè)數(shù)據(jù)項(xiàng)執(zhí)行操作距淫,一般用于實(shí)時(shí)統(tǒng)計(jì)绞绒。

在Spark生態(tài)體系中婶希,對(duì)于批處理和流處理采用了不同的技術(shù)框架,批處理由SparkSQL實(shí)現(xiàn)蓬衡,流處理由Spark Streaming實(shí)現(xiàn)喻杈,這也是大部分框架采用的策略,使用獨(dú)立的處理器實(shí)現(xiàn)批處理和流處理狰晚,而Flink可以同時(shí)實(shí)現(xiàn)批處理和流處理筒饰。

Flink是如何同時(shí)實(shí)現(xiàn)批處理與流處理的呢?答案是壁晒,F(xiàn)link將批處理(即處理有限的靜態(tài)數(shù)據(jù))視作一種特殊的流處理瓷们。

Flink的核心計(jì)算架構(gòu)是下圖中的Flink Runtime執(zhí)行引擎,它是一個(gè)分布式系統(tǒng)秒咐,能夠接受數(shù)據(jù)流程序并在一臺(tái)或多臺(tái)機(jī)器上以容錯(cuò)方式執(zhí)行谬晕。

Flink Runtime執(zhí)行引擎可以作為YARN(Yet Another Resource Negotiator)的應(yīng)用程序在集群上運(yùn)行,也可以在Mesos集群上運(yùn)行携取,還可以在單機(jī)上運(yùn)行(這對(duì)于調(diào)試Flink應(yīng)用程序來(lái)說(shuō)非常有用)攒钳。

image.png

上圖為Flink技術(shù)棧的核心組成部分,值得一提的是雷滋,F(xiàn)link分別提供了面向流式處理的接口(DataStream API)和面向批處理的接口(DataSet API)不撑。因此,F(xiàn)link既可以完成流處理晤斩,也可以完成批處理焕檬。Flink支持的拓展庫(kù)涉及機(jī)器學(xué)習(xí)(FlinkML)、復(fù)雜事件處理(CEP)澳泵、以及圖計(jì)算(Gelly)揩页,還有分別針對(duì)流處理和批處理的Table API。

能被Flink Runtime執(zhí)行引擎接受的程序很強(qiáng)大烹俗,但是這樣的程序有著冗長(zhǎng)的代碼爆侣,編寫(xiě)起來(lái)也很費(fèi)力,基于這個(gè)原因幢妄,F(xiàn)link提供了封裝在Runtime執(zhí)行引擎之上的API兔仰,以幫助用戶(hù)方便地生成流式計(jì)算程序。Flink 提供了用于流處理的DataStream API和用于批處理的DataSet API蕉鸳。值得注意的是乎赴,盡管Flink Runtime執(zhí)行引擎是基于流處理的忍法,但是DataSet API先于DataStream API被開(kāi)發(fā)出來(lái),這是因?yàn)楣I(yè)界對(duì)無(wú)限流處理的需求在Flink誕生之初并不大榕吼。

DataStream API可以流暢地分析無(wú)限數(shù)據(jù)流饿序,并且可以用Java或者Scala來(lái)實(shí)現(xiàn)。開(kāi)發(fā)人員需要基于一個(gè)叫DataStream的數(shù)據(jù)結(jié)構(gòu)來(lái)開(kāi)發(fā)羹蚣,這個(gè)數(shù)據(jù)結(jié)構(gòu)用于表示永不停止的分布式數(shù)據(jù)流原探。

Flink的分布式特點(diǎn)體現(xiàn)在它能夠在成百上千臺(tái)機(jī)器上運(yùn)行,它將大型的計(jì)算任務(wù)分成許多小的部分顽素,每個(gè)機(jī)器執(zhí)行一部分咽弦。Flink能夠自動(dòng)地確保發(fā)生機(jī)器故障或者其他錯(cuò)誤時(shí)計(jì)算能夠持續(xù)進(jìn)行,或者在修復(fù)bug或進(jìn)行版本升級(jí)后有計(jì)劃地再執(zhí)行一次胁出。這種能力使得開(kāi)發(fā)人員不需要擔(dān)心運(yùn)行失敗型型。Flink本質(zhì)上使用容錯(cuò)性數(shù)據(jù)流,這使得開(kāi)發(fā)人員可以分析持續(xù)生成且永遠(yuǎn)不結(jié)束的數(shù)據(jù)(即流處理)全蝶。

1.4 無(wú)窮數(shù)據(jù)流和有限數(shù)據(jù)流

無(wú)窮數(shù)據(jù)集:無(wú)窮的持續(xù)集合的數(shù)據(jù)集合
有限數(shù)據(jù)集:有限不會(huì)改變的數(shù)據(jù)集合

常見(jiàn)的無(wú)窮數(shù)據(jù)集合有:
用戶(hù)與客戶(hù)端的實(shí)時(shí)交互數(shù)據(jù)
應(yīng)用實(shí)時(shí)產(chǎn)生的日志
金融市場(chǎng)的實(shí)時(shí)交易記錄

1.6 flink特性

1闹蒜、高吞吐和低延遲性

2、支持 Event Time 和亂序事件
Flink 支持了流處理和 Event Time 語(yǔ)義的窗口機(jī)制抑淫。
Event time 使得計(jì)算亂序到達(dá)的事件或可能延遲到達(dá)的事件更加簡(jiǎn)單绷落。

3、狀態(tài)計(jì)算的 exactly-once 語(yǔ)義
故障狀態(tài)下丈冬,需要重啟計(jì)算任務(wù)嘱函,這時(shí)候需要避免已經(jīng)處理過(guò)的數(shù)據(jù)的重復(fù)處理。
流程序可以在計(jì)算過(guò)程中維護(hù)自定義狀態(tài)埂蕊。
Flink 的 checkpointing 機(jī)制保證了即時(shí)在故障發(fā)生下也能保障狀態(tài)的 exactly once 語(yǔ)義往弓。

4、高度靈活的流式窗口
Flink 支持在時(shí)間窗口蓄氧,統(tǒng)計(jì)窗口函似,session 窗口,以及數(shù)據(jù)驅(qū)動(dòng)的窗口
窗口可以通過(guò)靈活的觸發(fā)條件來(lái)定制喉童,以支持復(fù)雜的流計(jì)算模式撇寞。

5、帶反壓的連續(xù)流模型
數(shù)據(jù)流應(yīng)用執(zhí)行的是不間斷的(常駐)operators堂氯。
Flink streaming 在運(yùn)行時(shí)有著天然的流控:慢的數(shù)據(jù) sink 節(jié)點(diǎn)會(huì)反壓(backpressure)快的數(shù)據(jù)源(sources)蔑担。

6、容錯(cuò)性
Flink 的容錯(cuò)機(jī)制是基于 Chandy-Lamport distributed snapshots 來(lái)實(shí)現(xiàn)的咽白。
這種機(jī)制是非常輕量級(jí)的啤握,允許系統(tǒng)擁有高吞吐率的同時(shí)還能提供強(qiáng)一致性的保障。

7晶框、Batch 和 Streaming 一個(gè)系統(tǒng)流處理和批處理共用一個(gè)引擎
Flink 為流處理和批處理應(yīng)用公用一個(gè)通用的引擎排抬。批處理應(yīng)用可以以一種特殊的流處理應(yīng)用高效地運(yùn)行懂从。

8、內(nèi)存管理
Flink 在 JVM 中實(shí)現(xiàn)了自己的內(nèi)存管理蹲蒲。
應(yīng)用可以超出主內(nèi)存的大小限制番甩,并且承受更少的垃圾收集的開(kāi)銷(xiāo)。

二届搁、Flink基本架構(gòu)

2.1 flink中的角色

Flink運(yùn)行時(shí)包含了兩種類(lèi)型的處理器:

JobManager處理器:也稱(chēng)之為Master缘薛,用于協(xié)調(diào)分布式執(zhí)行,它們用來(lái)調(diào)度task咖祭,協(xié)調(diào)檢查點(diǎn)掩宜,協(xié)調(diào)失敗時(shí)恢復(fù)等蔫骂。Flink運(yùn)行時(shí)至少存在一個(gè)master處理器么翰,如果配置高可用模式則會(huì)存在多個(gè)master處理器,它們其中有一個(gè)是leader辽旋,而其他的都是standby浩嫌。

TaskManager處理器:也稱(chēng)之為Worker,用于執(zhí)行一個(gè)dataflow的task(或者特殊的subtask)补胚、數(shù)據(jù)緩沖和data stream的交換码耐,F(xiàn)link運(yùn)行時(shí)至少會(huì)存在一個(gè)worker處理器。

image.png

Master和Worker處理器可以直接在物理機(jī)上啟動(dòng)溶其,或者通過(guò)像YARN這樣的資源調(diào)度框架骚腥。Worker連接到Master,告知自身的可用性進(jìn)而獲得任務(wù)分配瓶逃。

2.2 ***數(shù)據(jù)流與有界數(shù)據(jù)流

數(shù)據(jù)流:
數(shù)據(jù)流有一個(gè)開(kāi)始但是沒(méi)有結(jié)束束铭,它們不會(huì)在生成時(shí)終止并提供數(shù)據(jù),必須連續(xù)處理流厢绝,也就是說(shuō)必須在獲取后立即處理event契沫。對(duì)于
數(shù)據(jù)流我們無(wú)法等待所有數(shù)據(jù)都到達(dá),因?yàn)檩斎胧?strong>的昔汉,并且在任何時(shí)間點(diǎn)都不會(huì)完成懈万。處理數(shù)據(jù)通常要求以特定順序(例如事件發(fā)生的順序)獲取event,以便能夠推斷結(jié)果完整性靶病。

有界數(shù)據(jù)流:
有界數(shù)據(jù)流有明確定義的開(kāi)始和結(jié)束会通,可以在執(zhí)行任何計(jì)算之前通過(guò)獲取所有數(shù)據(jù)來(lái)處理有界流,處理有界流不需要有序獲取娄周,因?yàn)榭梢允冀K對(duì)有界數(shù)據(jù)集進(jìn)行排序涕侈,有界流的處理也稱(chēng)為批處理。

Apache Flink是一個(gè)面向分布式數(shù)據(jù)流處理和批量數(shù)據(jù)處理的開(kāi)源計(jì)算平臺(tái)昆咽,它能夠基于同一個(gè)Flink運(yùn)行時(shí)(Flink Runtime)驾凶,提供支持流處理和批處理兩種類(lèi)型應(yīng)用的功能⊙栏Γ現(xiàn)有的開(kāi)源計(jì)算方案,會(huì)把流處理和批處理作為兩種不同的應(yīng)用類(lèi)型调违,因?yàn)樗鼈円獙?shí)現(xiàn)的目標(biāo)是完全不相同的:流處理一般需要支持低延遲窟哺、Exactly-once保證,而批處理需要支持高吞吐技肩、高效處理且轨,所以在實(shí)現(xiàn)的時(shí)候通常是分別給出兩套實(shí)現(xiàn)方法,或者通過(guò)一個(gè)獨(dú)立的開(kāi)源框架來(lái)實(shí)現(xiàn)其中每一種處理方案虚婿。例如旋奢,實(shí)現(xiàn)批處理的開(kāi)源方案有MapReduce、Tez然痊、Crunch至朗、Spark,實(shí)現(xiàn)流處理的開(kāi)源方案有Samza剧浸、Storm锹引。

Flink在實(shí)現(xiàn)流處理和批處理時(shí),與傳統(tǒng)的一些方案完全不同唆香,它從另一個(gè)視角看待流處理和批處理嫌变,將二者統(tǒng)一起來(lái):Flink是完全支持流處理,也就是說(shuō)作為流處理看待時(shí)輸入數(shù)據(jù)流是***的躬它;批處理被作為一種特殊的流處理腾啥,只是它的輸入數(shù)據(jù)流被定義為有界的》胂牛基于同一個(gè)Flink運(yùn)行時(shí)(Flink Runtime)倘待,分別提供了流處理和批處理API,而這兩種API也是實(shí)現(xiàn)上層面向流處理桑谍、批處理類(lèi)型應(yīng)用框架的基礎(chǔ)延柠。

2.3 flink數(shù)據(jù)流編程接口抽象

Flink提供了不同級(jí)別的抽象,以開(kāi)發(fā)流或批處理作業(yè)锣披,如下圖所示:


image.png

最底層級(jí)的抽象僅僅提供了有狀態(tài)流贞间,它將通過(guò)過(guò)程函數(shù)(Process Function)被嵌入到DataStream API中。底層過(guò)程函數(shù)(Process Function) 與 DataStream API 相集成雹仿,使其可以對(duì)某些特定的操作進(jìn)行底層的抽象增热,它允許用戶(hù)可以自由地處理來(lái)自一個(gè)或多個(gè)數(shù)據(jù)流的事件,并使用一致的容錯(cuò)的狀態(tài)胧辽。除此之外峻仇,用戶(hù)可以注冊(cè)事件時(shí)間并處理時(shí)間回調(diào),從而使程序可以處理復(fù)雜的計(jì)算邑商。

實(shí)際上摄咆,大多數(shù)應(yīng)用并不需要上述的底層抽象凡蚜,而是針對(duì)核心API(Core APIs) 進(jìn)行編程,比如DataStream API(有界或***流數(shù)據(jù))以及DataSet API(有界數(shù)據(jù)集)吭从。這些API為數(shù)據(jù)處理提供了通用的構(gòu)建模塊朝蜘,比如由用戶(hù)定義的多種形式的轉(zhuǎn)換(transformations),連接(joins)涩金,聚合(aggregations)谱醇,窗口操作(windows)等等。DataSet API 為有界數(shù)據(jù)集提供了額外的支持步做,例如循環(huán)與迭代副渴。這些API處理的數(shù)據(jù)類(lèi)型以類(lèi)(classes)的形式由各自的編程語(yǔ)言所表示。

Table API 是以表為中心的聲明式編程全度,其中表可能會(huì)動(dòng)態(tài)變化(在表達(dá)流數(shù)據(jù)時(shí))煮剧。Table API遵循(擴(kuò)展的)關(guān)系模型:表有二維數(shù)據(jù)結(jié)構(gòu)(schema)(類(lèi)似于關(guān)系數(shù)據(jù)庫(kù)中的表),同時(shí)API提供可比較的操作讼载,例如select轿秧、project中跌、join咨堤、group-by、aggregate等漩符。Table API程序聲明式地定義了什么邏輯操作應(yīng)該執(zhí)行一喘,而不是準(zhǔn)確地確定這些操作代碼的看上去如何 。 盡管Table API可以通過(guò)多種類(lèi)型的用戶(hù)自定義函數(shù)(UDF)進(jìn)行擴(kuò)展嗜暴,其仍不如核心API更具表達(dá)能力凸克,但是使用起來(lái)卻更加簡(jiǎn)潔(代碼量更少)。除此之外闷沥,Table API程序在執(zhí)行之前會(huì)經(jīng)過(guò)內(nèi)置優(yōu)化器進(jìn)行優(yōu)化萎战。

你可以在表與 DataStream/DataSet 之間無(wú)縫切換,以允許程序?qū)?Table API 與 DataStream 以及 DataSet 混合使用舆逃。

Flink提供的最高層級(jí)的抽象是 SQL 蚂维。這一層抽象在語(yǔ)法與表達(dá)能力上與 Table API 類(lèi)似,但是是以SQL查詢(xún)表達(dá)式的形式表現(xiàn)程序路狮。SQL抽象與Table API交互密切虫啥,同時(shí)SQL查詢(xún)可以直接在Table API定義的表上執(zhí)行。

三奄妨、flink運(yùn)行架構(gòu)

3.1 提交任務(wù)到y(tǒng)arn的流程

flink在生產(chǎn)中涂籽,一般是使用yarn作為資源調(diào)度平臺(tái),比較少使用standalone的方式進(jìn)行資源調(diào)度砸抛。所以這里以yarn為例评雌,說(shuō)明flink提交任務(wù)到y(tǒng)arn的流程树枫。

image.png

Flink任務(wù)提交后,Client向HDFS上傳Flink的Jar包和配置景东,之后向Yarn ResourceManager提交任務(wù)团赏,ResourceManager分配Container資源并通知對(duì)應(yīng)的NodeManager啟動(dòng)ApplicationMaster,ApplicationMaster啟動(dòng)后加載Flink的Jar包和配置構(gòu)建環(huán)境耐薯,然后啟動(dòng)JobManager舔清,之后ApplicationMaster向ResourceManager申請(qǐng)資源啟動(dòng)TaskManager,ResourceManager分配Container資源后曲初,由ApplicationMaster通知資源所在節(jié)點(diǎn)的NodeManager啟動(dòng)TaskManager体谒,NodeManager加載Flink的Jar包和配置構(gòu)建環(huán)境并啟動(dòng)TaskManager,TaskManager啟動(dòng)后向JobManager發(fā)送心跳包臼婆,并等待JobManager向其分配任務(wù)抒痒。

3.2 任務(wù)調(diào)度組件

image.png

1、 Program Code:我們編寫(xiě)的 Flink 應(yīng)用程序代碼

2颁褂、 Job Client:Job Client 不是 Flink 程序執(zhí)行的內(nèi)部部分故响,但它是任務(wù)執(zhí)行的起點(diǎn)。 Job Client 負(fù)責(zé)接受用戶(hù)的程序代碼颁独,然后創(chuàng)建數(shù)據(jù)流彩届,將數(shù)據(jù)流提交給 Job Manager 以便進(jìn)一步執(zhí)行。 執(zhí)行完成后誓酒,Job Client 將結(jié)果返回給用戶(hù)

  1. 3樟蠕、 JobManager:主進(jìn)程(也稱(chēng)為作業(yè)管理器)協(xié)調(diào)和管理程序的執(zhí)行。 它的主要職責(zé)包括安排任務(wù)靠柑,管理checkpoint 寨辩,故障恢復(fù)等。機(jī)器集群中至少要有一個(gè) master歼冰,master 負(fù)責(zé)調(diào)度 task靡狞,協(xié)調(diào) checkpoints 和容災(zāi),高可用設(shè)置的話(huà)可以有多個(gè) master隔嫡,但要保證一個(gè)是active, 其他是 standby; Job Manager 包含 Actor system(通信系統(tǒng))甸怕、Scheduler(調(diào)度)、Check pointing 三個(gè)重要的組件

4畔勤、 Task Manager:從 Job Manager 處接收需要部署的 Task蕾各。Task Manager 是在 JVM 中的一個(gè)或多個(gè)線(xiàn)程中執(zhí)行任務(wù)的工作節(jié)點(diǎn)。 任務(wù)執(zhí)行的并行性由每個(gè) Task Manager 上可用的任務(wù)槽(task slot)決定庆揪。 每個(gè)任務(wù)代表分配給任務(wù)槽的一組資源式曲。 例如,如果 Task Manager 有四個(gè)插槽,那么它將為每個(gè)插槽分配 25% 的內(nèi)存吝羞。 可以在任務(wù)槽中運(yùn)行一個(gè)或多個(gè)線(xiàn)程兰伤。 同一插槽中的線(xiàn)程共享相同的 JVM。 同一 JVM 中的任務(wù)共享 TCP 連接和心跳消息钧排。Task Manager 的一個(gè) Slot 代表一個(gè)可用線(xiàn)程敦腔,該線(xiàn)程具有固定的內(nèi)存,注意 Slot 只對(duì)內(nèi)存隔離恨溜,沒(méi)有對(duì) CPU 隔離符衔。默認(rèn)情況下,F(xiàn)link 允許子任務(wù)共享 Slot糟袁,即使它們是不同 task 的 subtask判族,只要它們來(lái)自相同的 job。這種共享可以有更好的資源利用率项戴。

3.3 TaskManager和slots原理

每一個(gè)worker(TaskManager)是一個(gè)JVM進(jìn)程形帮,它可能會(huì)在獨(dú)立的線(xiàn)程上執(zhí)行一個(gè)或多個(gè)subtask。為了控制一個(gè)worker能接收多少個(gè)task周叮,worker通過(guò)task slot來(lái)進(jìn)行控制(一個(gè)worker至少有一個(gè)task slot)辩撑。

每個(gè)task slot表示TaskManager擁有資源的一個(gè)固定大小的子集。假如一個(gè)TaskManager有三個(gè)slot仿耽,那么它會(huì)將其管理的內(nèi)存平均分成三份給各個(gè)slot合冀。資源slot化意味著一個(gè)subtask將不需要跟來(lái)自其他job的subtask競(jìng)爭(zhēng)被管理的內(nèi)存,取而代之的是它將擁有一定數(shù)量的內(nèi)存儲(chǔ)備氓仲。需要注意的是水慨,這里不會(huì)涉及到CPU的隔離,slot目前僅僅用來(lái)隔離task的受管理的內(nèi)存敬扛。

通過(guò)調(diào)整task slot的數(shù)量,允許用戶(hù)定義subtask之間如何互相隔離朝抖。如果一個(gè)TaskManager一個(gè)slot啥箭,那將意味著每個(gè)task group運(yùn)行在獨(dú)立的JVM中(該JVM可能是通過(guò)一個(gè)特定的容器啟動(dòng)的),而一個(gè)TaskManager多個(gè)slot意味著更多的subtask可以共享同一個(gè)JVM治宣。而在同一個(gè)JVM進(jìn)程中的task將共享TCP連接(基于多路復(fù)用)和心跳消息急侥。它們也可能共享數(shù)據(jù)集和數(shù)據(jù)結(jié)構(gòu),因此這減少了每個(gè)task的負(fù)載侮邀。

image.png

Task Slot是靜態(tài)的概念坏怪,是指TaskManager具有的并發(fā)執(zhí)行能力,可以通過(guò)參數(shù)taskmanager.numberOfTaskSlots進(jìn)行配置绊茧,而并行度parallelism是動(dòng)態(tài)概念铝宵,即TaskManager運(yùn)行程序時(shí)實(shí)際使用的并發(fā)能力,可以通過(guò)參數(shù)parallelism.default進(jìn)行配置。

也就是說(shuō)鹏秋,假設(shè)一共有3個(gè)TaskManager尊蚁,每一個(gè)TaskManager中的分配3個(gè)TaskSlot,也就是每個(gè)TaskManager可以接收3個(gè)task侣夷,一共9個(gè)TaskSlot横朋,如果我們?cè)O(shè)置parallelism.default=1,即運(yùn)行程序默認(rèn)的并行度為1百拓,9個(gè)TaskSlot只用了1個(gè)琴锭,有8個(gè)空閑,因此衙传,設(shè)置合適的并行度才能提高效率祠够。實(shí)際上slots限制的限制了該taskmanager在整個(gè)集群中能夠并行運(yùn)行task的數(shù)目,而parallelism.default則是限制單個(gè)job能夠使用slot的數(shù)量粪牲,但是允許多個(gè)job同時(shí)運(yùn)行古瓤,所以實(shí)際上是對(duì)單個(gè)job的并發(fā)限制。

3.4 程序與數(shù)據(jù)流

Flink程序的基礎(chǔ)構(gòu)建模塊是 流(streams) 與 轉(zhuǎn)換(transformations)(需要注意的是腺阳,F(xiàn)link的DataSet API所使用的DataSets其內(nèi)部也是stream)落君。一個(gè)stream可以看成一個(gè)中間結(jié)果,而一個(gè)transformations是以一個(gè)或多個(gè)stream作為輸入的某種operation亭引,該operation利用這些stream進(jìn)行計(jì)算從而產(chǎn)生一個(gè)或多個(gè)result stream绎速。

在運(yùn)行時(shí),F(xiàn)link上運(yùn)行的程序會(huì)被映射成streaming dataflows焙蚓,它包含了streams和transformations operators宿崭。每一個(gè)dataflow以一個(gè)或多個(gè)sources開(kāi)始以一個(gè)或多個(gè)sinks結(jié)束露久。dataflow類(lèi)似于任意的有向無(wú)環(huán)圖(DAG),當(dāng)然特定形式的環(huán)可以通過(guò)iteration構(gòu)建。在大部分情況下疑务,程序中的transformations跟dataflow中的operator是一一對(duì)應(yīng)的關(guān)系,但有時(shí)候昆雀,一個(gè)transformation可能對(duì)應(yīng)多個(gè)operator廓俭。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市比庄,隨后出現(xiàn)的幾起案子求妹,更是在濱河造成了極大的恐慌,老刑警劉巖佳窑,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件制恍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡神凑,警方通過(guò)查閱死者的電腦和手機(jī)净神,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人强挫,你說(shuō)我怎么就攤上這事岔霸。” “怎么了俯渤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵呆细,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我八匠,道長(zhǎng)絮爷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任梨树,我火速辦了婚禮坑夯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抡四。我一直安慰自己柜蜈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布指巡。 她就那樣靜靜地躺著淑履,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藻雪。 梳的紋絲不亂的頭發(fā)上秘噪,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音勉耀,去河邊找鬼指煎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛便斥,可吹牛的內(nèi)容都是我干的至壤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椭住,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崇渗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起京郑,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葫掉,沒(méi)想到半個(gè)月后些举,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭厚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年户魏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叼丑,死狀恐怖关翎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸠信,我是刑警寧澤纵寝,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站星立,受9級(jí)特大地震影響爽茴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绰垂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一室奏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劲装,春花似錦胧沫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纺酸,卻和暖如春窖逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背餐蔬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工碎紊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人樊诺。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓仗考,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親词爬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秃嗜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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