《從0到1學(xué)習(xí)Flink》—— Apache Flink 介紹 轉(zhuǎn)自 微信公眾號:zhisheng

前言

Flink 是一種流式計算框架笔宿,為什么我會接觸到 Flink 呢?因為我目前在負(fù)責(zé)的是監(jiān)控平臺的告警部分棱诱,負(fù)責(zé)采集到的監(jiān)控數(shù)據(jù)會直接往 kafka 里塞泼橘,然后告警這邊需要從 kafka topic 里面實時讀取到監(jiān)控數(shù)據(jù),并將讀取到的監(jiān)控數(shù)據(jù)做一些 聚合/轉(zhuǎn)換/計算 等操作迈勋,然后將計算后的結(jié)果與告警規(guī)則的閾值進(jìn)行比較炬灭,然后做出相應(yīng)的告警措施(釘釘群、郵件靡菇、短信重归、電話等)。畫了個簡單的圖如下:

目前告警這塊的架構(gòu)是這樣的結(jié)構(gòu)厦凤,剛進(jìn)公司那會的時候鼻吮,架構(gòu)是所有的監(jiān)控數(shù)據(jù)直接存在 ElasticSearch 中,然后我們告警是去 ElasticSearch 中搜索我們監(jiān)控指標(biāo)需要的數(shù)據(jù)较鼓,幸好 ElasticSearch 的搜索能力夠強(qiáng)大椎木。但是你有沒有發(fā)現(xiàn)一個問題,就是所有的監(jiān)控數(shù)據(jù)從采集博烂、采集后的數(shù)據(jù)做一些 計算/轉(zhuǎn)換/聚合香椎、再通過 Kafka 消息隊列、再存進(jìn) ElasticSearch 中禽篱,再而去 ElasticSearch 中查找我們的監(jiān)控數(shù)據(jù)畜伐,然后做出告警策略。整個流程對監(jiān)控來說看起來很按照常理谆级,但是對于告警來說,如果中間某個環(huán)節(jié)出了問題讼积,比如 Kafka 消息隊列延遲肥照、監(jiān)控數(shù)據(jù)存到 ElasticSearch 中寫入時間較長、你的查詢姿勢寫的不對等原因勤众,這都將導(dǎo)致告警從 ElasticSearch 查到的數(shù)據(jù)是有延遲的舆绎。也許是 30 秒、一分鐘们颜、或者更長吕朵,這樣對于告警來說這無疑將導(dǎo)致告警的消息沒有任何的意義猎醇。

為什么這么說呢?為什么需要監(jiān)控告警平臺呢努溃?無非就是希望我們能夠盡早的發(fā)現(xiàn)問題硫嘶,把問題給告警出來,這樣開發(fā)和運維人員才能夠及時的處理解決好線上的問題梧税,以免給公司造成巨大的損失沦疾。

更何況現(xiàn)在還有更多的公司在做那種提前預(yù)警呢!這種又該如何做呢第队?需要用大數(shù)據(jù)和機(jī)器學(xué)習(xí)的技術(shù)去分析周期性的歷史數(shù)據(jù)哮塞,然后根據(jù)這些數(shù)據(jù)可以整理出來某些監(jiān)控指標(biāo)的一些周期性(一天/七天/一月/一季度/一年)走勢圖,這樣就大概可以繪圖出來凳谦。然后根據(jù)這個走勢圖忆畅,可以將當(dāng)前時間點的監(jiān)控指標(biāo)的數(shù)據(jù)使用量和走勢圖進(jìn)行對比,在快要達(dá)到我們告警規(guī)則的閾值時尸执,這時就可以提前告一個預(yù)警出來家凯,讓運維提前知道預(yù)警,然后提前查找問題剔交,這樣就能夠提早發(fā)現(xiàn)問題所在肆饶,避免損失,將損失降到最嗅!驯镊!當(dāng)然,這種也是我打算做的竭鞍,應(yīng)該可以學(xué)到不少東西的板惑。

于是乎,我現(xiàn)在就在接觸流式計算框架 Flink偎快,類似的還有常用的 Spark 等冯乘。

自己也接觸了 Flink 一段時間了,這塊中文資料目前書籍是只有一本很薄的晒夹,英文書籍也是三本不超過裆馒。

我自己整理了些 Flink 的學(xué)習(xí)資料,目前已經(jīng)全部放到微信公眾號了丐怯。你可以關(guān)注我的公眾號:zhisheng喷好,然后回復(fù)關(guān)鍵字:Flink?即可無條件獲取到。

另外這里也推薦一些博客可以看看:

1读跷、官網(wǎng):https://flink.apache.org/

2梗搅、GitHub:?https://github.com/apache/flink

3、https://blog.csdn.net/column/details/apacheflink.html

4、https://blog.csdn.net/lmalds/article/category/6263085

5无切、http://wuchong.me/

6荡短、https://blog.csdn.net/liguohuabigdata/article/category/7279020

下面的介紹可能也有不少參考以上所有的資料,感謝他們哆键!在介紹 Flink 前掘托,我們先看看?數(shù)據(jù)集類型?和?數(shù)據(jù)運算模型?的種類。

數(shù)據(jù)集類型有哪些呢:

無窮數(shù)據(jù)集:無窮的持續(xù)集成的數(shù)據(jù)集合

有界數(shù)據(jù)集:有限不會改變的數(shù)據(jù)集合

那么那些常見的無窮數(shù)據(jù)集有哪些呢洼哎?

用戶與客戶端的實時交互數(shù)據(jù)

應(yīng)用實時產(chǎn)生的日志

金融市場的實時交易記錄

數(shù)據(jù)運算模型有哪些呢:

流式:只要數(shù)據(jù)一直在產(chǎn)生烫映,計算就持續(xù)地進(jìn)行

批處理:在預(yù)先定義的時間內(nèi)運行計算,當(dāng)完成時釋放計算機(jī)資源

Flink 它可以處理有界的數(shù)據(jù)集噩峦、也可以處理無界的數(shù)據(jù)集锭沟、它可以流式的處理數(shù)據(jù)、也可以批量的處理數(shù)據(jù)识补。

Flink 是什么 族淮?

上面三張圖轉(zhuǎn)自 云邪 成都站 《Flink 技術(shù)介紹與未來展望》,侵刪凭涂。

從下至上祝辣,F(xiàn)link 整體結(jié)構(gòu)

從下至上:

1、部署:Flink 支持本地運行切油、能在獨立集群或者在被 YARN 或 Mesos 管理的集群上運行蝙斜, 也能部署在云上。

2澎胡、運行:Flink 的核心是分布式流式數(shù)據(jù)引擎孕荠,意味著數(shù)據(jù)以一次一個事件的形式被處理。

3攻谁、API:DataStream稚伍、DataSet、Table戚宦、SQL API个曙。

4、擴(kuò)展庫:Flink 還包括用于復(fù)雜事件處理受楼,機(jī)器學(xué)習(xí)垦搬,圖形處理和 Apache Storm 兼容性的專用代碼庫。

Flink 數(shù)據(jù)流編程模型

抽象級別

Flink 提供了不同的抽象級別以開發(fā)流式或批處理應(yīng)用艳汽。

最底層提供了有狀態(tài)流猴贰。它將通過 過程函數(shù)(Process Function)嵌入到 DataStream API 中。它允許用戶可以自由地處理來自一個或多個流數(shù)據(jù)的事件骚灸,并使用一致糟趾、容錯的狀態(tài)慌植。除此之外甚牲,用戶可以注冊事件時間和處理事件回調(diào)义郑,從而使程序可以實現(xiàn)復(fù)雜的計算。

DataStream / DataSet API 是 Flink 提供的核心 API 丈钙,DataSet 處理有界的數(shù)據(jù)集非驮,DataStream 處理有界或者無界的數(shù)據(jù)流。用戶可以通過各種方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)將數(shù)據(jù)進(jìn)行轉(zhuǎn)換 / 計算雏赦。

Table API?是以??為中心的聲明式 DSL劫笙,其中表可能會動態(tài)變化(在表達(dá)流數(shù)據(jù)時)。Table API 提供了例如 select星岗、project填大、join、group-by俏橘、aggregate 等操作允华,使用起來卻更加簡潔(代碼量更少)。

你可以在表與?DataStream/DataSet?之間無縫切換寥掐,也允許程序?qū)?Table API?與?DataStream?以及?DataSet?混合使用靴寂。

Flink 提供的最高層級的抽象是?SQL?。這一層抽象在語法與表達(dá)能力上與?Table API?類似召耘,但是是以 SQL查詢表達(dá)式的形式表現(xiàn)程序百炬。SQL 抽象與 Table API 交互密切,同時 SQL 查詢可以直接在 Table API 定義的表上執(zhí)行污它。

Flink 程序與數(shù)據(jù)流結(jié)構(gòu)

Flink 應(yīng)用程序結(jié)構(gòu)就是如上圖所示:

1剖踊、Source: 數(shù)據(jù)源,F(xiàn)link 在流處理和批處理上的 source 大概有 4 類:基于本地集合的 source轨蛤、基于文件的 source蜜宪、基于網(wǎng)絡(luò)套接字的 source、自定義的 source祥山。自定義的 source 常見的有 Apache kafka圃验、Amazon Kinesis Streams、RabbitMQ缝呕、Twitter Streaming API澳窑、Apache NiFi 等,當(dāng)然你也可以定義自己的 source供常。

2摊聋、Transformation:數(shù)據(jù)轉(zhuǎn)換的各種操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等栈暇,操作很多麻裁,可以將數(shù)據(jù)轉(zhuǎn)換計算成你想要的數(shù)據(jù)。

3、Sink:接收器煎源,F(xiàn)link 將轉(zhuǎn)換計算后的數(shù)據(jù)發(fā)送的地點 色迂,你可能需要存儲下來,F(xiàn)link 常見的 Sink 大概有如下幾類:寫入文件手销、打印出來歇僧、寫入 socket 、自定義的 sink 锋拖。自定義的 sink 常見的有 Apache kafka诈悍、RabbitMQ、MySQL兽埃、ElasticSearch侥钳、Apache Cassandra、Hadoop FileSystem 等柄错,同理你也可以定義自己的 sink慕趴。

為什么選擇 Flink?

Flink 是一個開源的分布式流式處理框架:

①提供準(zhǔn)確的結(jié)果鄙陡,甚至在出現(xiàn)無序或者延遲加載的數(shù)據(jù)的情況下冕房。

②它是狀態(tài)化的容錯的,同時在維護(hù)一次完整的的應(yīng)用狀態(tài)時趁矾,能無縫修復(fù)錯誤耙册。

③大規(guī)模運行,在上千個節(jié)點運行時有很好的吞吐量和低延遲毫捣。

更早的時候详拙,我們討論了數(shù)據(jù)集類型(有界 vs 無窮)和運算模型(批處理 vs 流式)的匹配。Flink 的流式計算模型啟用了很多功能特性蔓同,如狀態(tài)管理饶辙,處理無序數(shù)據(jù),靈活的視窗斑粱,這些功能對于得出無窮數(shù)據(jù)集的精確結(jié)果是很重要的弃揽。

Flink 保證狀態(tài)化計算強(qiáng)一致性≡虮保”狀態(tài)化“意味著應(yīng)用可以維護(hù)隨著時間推移已經(jīng)產(chǎn)生的數(shù)據(jù)聚合或者矿微,并且 Filnk 的檢查點機(jī)制在一次失敗的事件中一個應(yīng)用狀態(tài)的強(qiáng)一致性。

Flink 支持流式計算和帶有事件時間語義的視窗尚揣。事件時間機(jī)制使得那些事件無序到達(dá)甚至延遲到達(dá)的數(shù)據(jù)流能夠計算出精確的結(jié)果涌矢。

除了提供數(shù)據(jù)驅(qū)動的視窗外,F(xiàn)link 還支持基于時間快骗,計數(shù)娜庇,session 等的靈活視窗塔次。視窗能夠用靈活的觸發(fā)條件定制化從而達(dá)到對復(fù)雜的流傳輸模式的支持。Flink 的視窗使得模擬真實的創(chuàng)建數(shù)據(jù)的環(huán)境成為可能名秀。

Flink 的容錯能力是輕量級的俺叭,允許系統(tǒng)保持高并發(fā),同時在相同時間內(nèi)提供強(qiáng)一致性保證泰偿。Flink 以零數(shù)據(jù)丟失的方式從故障中恢復(fù),但沒有考慮可靠性和延遲之間的折衷蜈垮。

Flink 能滿足高并發(fā)和低延遲(計算大量數(shù)據(jù)很快)耗跛。下圖顯示了 Apache Flink 與 Apache Storm 在完成流數(shù)據(jù)清洗的分布式任務(wù)的性能對比。

Flink 保存點提供了一個狀態(tài)化的版本機(jī)制攒发,使得能以無丟失狀態(tài)和最短停機(jī)時間的方式更新應(yīng)用或者回退歷史數(shù)據(jù)调塌。

Flink 被設(shè)計成能用上千個點在大規(guī)模集群上運行。除了支持獨立集群部署外惠猿,F(xiàn)link 還支持 YARN 和Mesos 方式部署羔砾。

Flink 的程序內(nèi)在是并行和分布式的,數(shù)據(jù)流可以被分區(qū)成?stream partitions偶妖,operators 被劃分為operator subtasks; 這些 subtasks 在不同的機(jī)器或容器中分不同的線程獨立運行姜凄;operator subtasks 的數(shù)量在具體的 operator 就是并行計算數(shù),程序不同的 operator 階段可能有不同的并行數(shù)趾访;如下圖所示态秧,source operator 的并行數(shù)為 2,但最后的 sink operator 為1扼鞋;

自己的內(nèi)存管理

Flink 在 JVM 中提供了自己的內(nèi)存管理申鱼,使其獨立于 Java 的默認(rèn)垃圾收集器。 它通過使用散列云头,索引捐友,緩存和排序有效地進(jìn)行內(nèi)存管理。

豐富的庫

Flink 擁有豐富的庫來進(jìn)行機(jī)器學(xué)習(xí)溃槐,圖形處理匣砖,關(guān)系數(shù)據(jù)處理等。 由于其架構(gòu)昏滴,很容易執(zhí)行復(fù)雜的事件處理和警報脆粥。

分布式運行

flink 作業(yè)提交架構(gòu)流程可見下圖:

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

2影涉、Job Client:Job Client 不是 Flink 程序執(zhí)行的內(nèi)部部分变隔,但它是任務(wù)執(zhí)行的起點。 Job Client 負(fù)責(zé)接受用戶的程序代碼蟹倾,然后創(chuàng)建數(shù)據(jù)流匣缘,將數(shù)據(jù)流提交給 Job Manager 以便進(jìn)一步執(zhí)行猖闪。 執(zhí)行完成后,Job Client 將結(jié)果返回給用戶

3肌厨、Job Manager:主進(jìn)程(也稱為作業(yè)管理器)協(xié)調(diào)和管理程序的執(zhí)行培慌。 它的主要職責(zé)包括安排任務(wù),管理checkpoint 柑爸,故障恢復(fù)等吵护。機(jī)器集群中至少要有一個 master,master 負(fù)責(zé)調(diào)度 task表鳍,協(xié)調(diào) checkpoints 和容災(zāi)馅而,高可用設(shè)置的話可以有多個 master,但要保證一個是 leader, 其他是 standby; Job Manager 包含 Actor system譬圣、Scheduler瓮恭、Check pointing 三個重要的組件

4、Task Manager:從 Job Manager 處接收需要部署的 Task厘熟。Task Manager 是在 JVM 中的一個或多個線程中執(zhí)行任務(wù)的工作節(jié)點屯蹦。 任務(wù)執(zhí)行的并行性由每個 Task Manager 上可用的任務(wù)槽決定。 每個任務(wù)代表分配給任務(wù)槽的一組資源绳姨。 例如登澜,如果 Task Manager 有四個插槽,那么它將為每個插槽分配 25% 的內(nèi)存飘庄。 可以在任務(wù)槽中運行一個或多個線程帖渠。 同一插槽中的線程共享相同的 JVM。 同一 JVM 中的任務(wù)共享 TCP 連接和心跳消息竭宰。Task Manager 的一個 Slot 代表一個可用線程空郊,該線程具有固定的內(nèi)存,注意 Slot 只對內(nèi)存隔離切揭,沒有對 CPU 隔離狞甚。默認(rèn)情況下,F(xiàn)link 允許子任務(wù)共享 Slot廓旬,即使它們是不同 task 的 subtask哼审,只要它們來自相同的 job。這種共享可以有更好的資源利用率孕豹。

最后

本文主要講了我接觸到 Flink 的緣由涩盾,然后從數(shù)據(jù)集類型和數(shù)據(jù)運算模型開始講起,接著介紹了下 Flink 是什么励背、Flink 的整體架構(gòu)春霍、提供的 API、Flink 的優(yōu)點所在以及 Flink 的分布式作業(yè)運行的方式叶眉。水文一篇址儒,希望你能夠?qū)?Flink 稍微有一點概念了芹枷。

關(guān)注我

轉(zhuǎn)載請務(wù)必注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/10/13/flink-introduction/

微信公眾號:zhisheng

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莲趣,隨后出現(xiàn)的幾起案子鸳慈,更是在濱河造成了極大的恐慌,老刑警劉巖喧伞,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件走芋,死亡現(xiàn)場離奇詭異,居然都是意外死亡潘鲫,警方通過查閱死者的電腦和手機(jī)翁逞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來次舌,“玉大人,你說我怎么就攤上這事兽愤”四睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵浅萧,是天一觀的道長逐沙。 經(jīng)常有香客問我,道長洼畅,這世上最難降的妖魔是什么吩案? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮帝簇,結(jié)果婚禮上徘郭,老公的妹妹穿的比我還像新娘。我一直安慰自己丧肴,他們只是感情好残揉,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芋浮,像睡著了一般抱环。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纸巷,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天镇草,我揣著相機(jī)與錄音,去河邊找鬼瘤旨。 笑死梯啤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的存哲。 我是一名探鬼主播条辟,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼黔夭,長吁一口氣:“原來是場噩夢啊……” “哼过牙!你這毒婦竟也來了亚亲?” 一聲冷哼從身側(cè)響起愉适,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤敛滋,失蹤者是張志新(化名)和其女友劉穎朦乏,沒想到半個月后客年,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡谐,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡筷登,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年魂爪,在試婚紗的時候發(fā)現(xiàn)自己被綠了先舷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡滓侍,死狀恐怖蒋川,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撩笆,我是刑警寧澤捺球,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站夕冲,受9級特大地震影響氮兵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歹鱼,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一泣栈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弥姻,春花似錦南片、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至螺捐,卻和暖如春颠悬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背定血。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工赔癌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澜沟。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓灾票,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茫虽。 傳聞我的和親對象是個殘疾皇子刊苍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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