
背景
在大數(shù)據(jù)領(lǐng)域我們都知道,開(kāi)發(fā)是最簡(jiǎn)單,任務(wù)的合理調(diào)優(yōu)、問(wèn)題排查才是最重要的。
我們?cè)谥暗奈恼?a target="_blank">《Flink面試通關(guān)手冊(cè)》中也講解過(guò),作者結(jié)合線上出現(xiàn)的一些問(wèn)題,總結(jié)了一些任務(wù)調(diào)優(yōu)需要注意的點(diǎn)。
一些簡(jiǎn)單的原則
我們?cè)谥暗奈恼隆禙link面試通關(guān)手冊(cè)》中提到過(guò)一個(gè)問(wèn)題,F(xiàn)link任務(wù)延遲高,想解決這個(gè)問(wèn)題,你會(huì)如何入手?
當(dāng)時(shí)我們給出的答案是:
在Flink的后臺(tái)任務(wù)管理中,我們可以看到Flink的哪個(gè)算子和task出現(xiàn)了反壓。最主要的手段是資源調(diào)優(yōu)和算子調(diào)優(yōu)。資源調(diào)優(yōu)即是對(duì)作業(yè)中的Operator的并發(fā)數(shù)(parallelism)、CPU(core)、堆內(nèi)存(heap_memory)等參數(shù)進(jìn)行調(diào)優(yōu)。作業(yè)參數(shù)調(diào)優(yōu)包括:并行度的設(shè)置,State的設(shè)置,checkpoint的設(shè)置。
事實(shí)上,延遲最終的結(jié)果都是任務(wù)的最終失敗,我們?cè)谡{(diào)優(yōu)線上問(wèn)題時(shí),有一個(gè)最簡(jiǎn)單的原則:
先看指標(biāo),定位問(wèn)題?在看資源,是否足夠?三看吞吐,是否反壓?四看JVM,是否OOM?
輪著來(lái),學(xué)不會(huì)轉(zhuǎn)產(chǎn)品吧
先看指標(biāo),定位問(wèn)題
Flink 提供的 Metrics 可以在 Flink 內(nèi)部收集一些指標(biāo),通過(guò)這些指標(biāo)讓開(kāi)發(fā)人員更好地理解作業(yè)或集群的狀態(tài)。由于集群運(yùn)行后很難發(fā)現(xiàn)內(nèi)部的實(shí)際狀況,跑得慢或快,是否異常等,開(kāi)發(fā)人員無(wú)法實(shí)時(shí)查看所有的 Task 日志,比如作業(yè)很大或者有很多作業(yè)的情況下,該如何處理?此時(shí) Metrics 可以很好的幫助開(kāi)發(fā)人員了解作業(yè)的當(dāng)前狀況。
再看資源,是否足夠
我們通過(guò)上述的指標(biāo)定位問(wèn)題時(shí),基本可以通過(guò)延遲與吞吐指標(biāo)可以對(duì)任務(wù)的性能進(jìn)行精準(zhǔn)的判斷,精確的找到問(wèn)題發(fā)生的代碼位置。
一般這些位置會(huì)出現(xiàn)以下錯(cuò)誤:
- Operator的并發(fā)數(shù)(parallelism)不合理
- CPU(core)不合理
- 堆內(nèi)存(heap_memory)等參數(shù)設(shè)置不合理
- 并行度的設(shè)置不合理
- State的設(shè)置不合理
- checkpoint的設(shè)置不合理
我們?cè)谠O(shè)置這些參數(shù)時(shí)要注意:
- 并行度(parallelism):保證足夠的并行度,并行度也不是越大越好,太多會(huì)加重?cái)?shù)據(jù)在多個(gè)solt/task manager之間數(shù)據(jù)傳輸壓力,包括序列化和反序列化帶來(lái)的壓力。
- CPU:CPU資源是task manager上的solt共享的,注意監(jiān)控CPU的使用。
- 內(nèi)存:內(nèi)存是分solt隔離使用的,注意存儲(chǔ)大state的時(shí)候,內(nèi)存要足夠。
- 網(wǎng)絡(luò):大數(shù)據(jù)處理,flink節(jié)點(diǎn)之間數(shù)據(jù)傳輸會(huì)很多,服務(wù)器網(wǎng)卡盡量使用萬(wàn)兆網(wǎng)卡。
三看吞吐,是否反壓
關(guān)于 Flink 的反壓?jiǎn)栴},我們之前介紹的已經(jīng)夠多了。參考《Flink網(wǎng)絡(luò)傳輸優(yōu)化》
Flink 內(nèi)部是基于 producer-consumer 模型來(lái)進(jìn)行消息傳遞的,F(xiàn)link的反壓設(shè)計(jì)也是基于這個(gè)模型。Flink 使用了高效有界的分布式阻塞隊(duì)列,就像 Java 通用的阻塞隊(duì)列(BlockingQueue)一樣。下游消費(fèi)者消費(fèi)變慢,上游就會(huì)受到阻塞。
在實(shí)踐中,很多情況下的反壓是由于數(shù)據(jù)傾斜造成的,這點(diǎn)我們可以通過(guò) Web UI 各個(gè) SubTask 的 Records Sent 和 Record Received 來(lái)確認(rèn),另外 Checkpoint detail 里不同 SubTask 的 State size 也是一個(gè)分析數(shù)據(jù)傾斜的有用指標(biāo)。
Flink 1.11 版本中對(duì)于 Flink 反壓?jiǎn)栴}本身做了一些優(yōu)化,例如使用Unaligned Checkpoint + rocksdb生成Checkpoint,使用rocksdb緩存checkpoint, 并且從原來(lái)的全量生成改為增量生成的方式, 速度更快。
另外還需要注意的是,用戶(hù)代碼的執(zhí)行效率問(wèn)題(頻繁被阻塞或者性能問(wèn)題)和TaskManager 的內(nèi)存以及 GC 問(wèn)題。
四看JVM,是否OOM?
官網(wǎng)給出的參數(shù)如下:



這里面最重要的幾個(gè):
taskmanager.memory.process.size: 512m
taskmanager.memory.framework.heap.size: 64m
taskmanager.memory.framework.off-heap.size: 64m
taskmanager.memory.jvm-metaspace.size: 64m
taskmanager.memory.jvm-overhead.fraction: 0.2
taskmanager.memory.jvm-overhead.min: 16m
taskmanager.memory.jvm-overhead.max: 64m
taskmanager.memory.network.fraction: 0.1
taskmanager.memory.network.min: 1mb
taskmanager.memory.network.max: 256mb
他們各自的意思,需要大家去查詢(xún)以下官方文檔。
JVM本身配置的主要參數(shù)無(wú)非以下這些:
堆設(shè)置
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :設(shè)置年輕代大小
-XX:NewRatio=n: 設(shè)置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個(gè)年輕代年老代和的1/4
-XX:SurvivorRatio=n :年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。注意Survivor區(qū)有兩個(gè)。如:3,表示Eden:Survivor=3:2,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/5
-XX:MaxPermSize=n :設(shè)置持久代大小
收集器設(shè)置
-XX:+UseSerialGC :設(shè)置串行收集器
-XX:+UseParallelGC :設(shè)置并行收集器
-XX:+UseParalledlOldGC :設(shè)置并行年老代收集器
-XX:+UseConcMarkSweepGC :設(shè)置并發(fā)收集器
垃圾回收統(tǒng)計(jì)信息
-XX:+PrintHeapAtGC GC的heap詳情
-XX:+PrintGCDetails GC詳情
-XX:+PrintGCTimeStamps 打印GC時(shí)間信息
-XX:+PrintTenuringDistribution 打印年齡信息等
-XX:+HandlePromotionFailure 老年代分配擔(dān)保(true or false)
并行收集器設(shè)置
-XX:ParallelGCThreads=n :設(shè)置并行收集器收集時(shí)使用的CPU數(shù)。并行收集線程數(shù)。
-XX:MaxGCPauseMillis=n :設(shè)置并行收集最大暫停時(shí)間
-XX:GCTimeRatio=n :設(shè)置垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比。公式為1/(1+n)
并發(fā)收集器設(shè)置
-XX:+CMSIncrementalMode :設(shè)置為增量模式。適用于單CPU情況。
-XX:ParallelGCThreads=n :設(shè)置并發(fā)收集器年輕代收集方式為并行收集時(shí),使用的CPU數(shù)。并行收集線程數(shù)
我們可以利用一些簡(jiǎn)單的JVM日志分析工具看出JVM設(shè)置的參數(shù)問(wèn)題出在哪里。
總結(jié)
整體來(lái)看,F(xiàn)link 的調(diào)優(yōu)基本是以上的大原則,具體需要根據(jù)實(shí)際問(wèn)題進(jìn)行調(diào)節(jié)。另外小編不建議大家使用Scala,問(wèn)題難排查,維護(hù)成本高。不要圖方便。
歡迎關(guān)注,《大數(shù)據(jù)成神之路》系列文章
歡迎關(guān)注,《大數(shù)據(jù)成神之路》系列文章
歡迎關(guān)注,《大數(shù)據(jù)成神之路》系列文章