1 配置內(nèi)存
操作場(chǎng)景
Flink是依賴(lài)內(nèi)存計(jì)算弄跌,計(jì)算過(guò)程中內(nèi)存不夠?qū)link的執(zhí)行效率影響很大宛乃∠崞疲可以通過(guò)監(jiān)控GC(Garbage Collection),評(píng)估內(nèi)存使用及剩余情況來(lái)判斷內(nèi)存是否變成性能瓶頸扫皱,并根據(jù)情況優(yōu)化足绅。
監(jiān)控節(jié)點(diǎn)進(jìn)程的YARN的Container GC日志,如果頻繁出現(xiàn)Full GC韩脑,需要優(yōu)化GC编检。
GC的配置:在客戶(hù)端的“conf/flink-conf.yaml”配置文件中,在“env.java.opts”配置項(xiàng)中添加參數(shù):“
-Xloggc:<LOG_DIR>/gc.log
-XX:+PrintGCDetails
-XX:-OmitStackTraceInFastThrow
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=20
-XX:GCLogFileSize=20M
此處默認(rèn)已經(jīng)添加GC日志扰才。
操作步驟
-
優(yōu)化GC允懂。
調(diào)整老年代和新生代的比值。在客戶(hù)端的“conf/flink-conf.yaml”配置文件中衩匣,在“env.java.opts”配置項(xiàng)中添加參數(shù):“-XX:NewRatio”蕾总。如“ -XX:NewRatio=2”,則表示老年代與新生代的比值為2:1琅捏,新生代占整個(gè)堆空間的1/3生百,老年代占2/3。
-
開(kāi)發(fā)Flink應(yīng)用程序時(shí)柄延,優(yōu)化DataStream的數(shù)據(jù)分區(qū)或分組操作蚀浆。
- 當(dāng)分區(qū)導(dǎo)致數(shù)據(jù)傾斜時(shí),需要考慮優(yōu)化分區(qū)搜吧。
- 避免非并行度操作市俊,有些對(duì)DataStream的操作會(huì)導(dǎo)致無(wú)法并行,例如WindowAll滤奈。
- keyBy盡量不要使用String摆昧。
補(bǔ)充:
-Xloggc:<LOG_DIR>/gc.log
#GC詳情
-XX:+PrintGCDetails
-XX:-OmitStackTraceInFastThrow
#打印GC時(shí)間信息
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=20
-XX:GCLogFileSize=20M。
#表示老年代與新生代的比值為2:1蜒程,新生代占整個(gè)堆空間的1/3绅你,老年代占2/3伺帘。
#設(shè)置年輕代和年老代的比值。如:為3忌锯,表示年輕代與年老代比值為1:3伪嫁,年輕代占整個(gè)年輕代年老代和的1/4
-XX:NewRatio=2
======================================================================================================
堆設(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ù)
2 設(shè)置并行度
操作場(chǎng)景
- 并行度控制任務(wù)的數(shù)量,影響操作后數(shù)據(jù)被切分成的塊數(shù)盖溺。調(diào)整并行度讓任務(wù)的數(shù)量和每個(gè)任務(wù)處理的數(shù)據(jù)與機(jī)器的處理能力達(dá)到最優(yōu)漓糙。
- 查看CPU使用情況和內(nèi)存占用情況,當(dāng)任務(wù)和數(shù)據(jù)不是平均分布在各節(jié)點(diǎn)烘嘱,而是集中在個(gè)別節(jié)點(diǎn)時(shí)昆禽,可以增大并行度使任務(wù)和數(shù)據(jù)更均勻的分布在各個(gè)節(jié)點(diǎn)。增加任務(wù)的并行度蝇庭,充分利用集群機(jī)器的計(jì)算能力醉鳖,一般并行度設(shè)置為集群CPU核數(shù)總和的2-3倍。
操作步驟
任務(wù)的并行度可以通過(guò)以下四種層次(按優(yōu)先級(jí)從高到低排列)指定哮内,用戶(hù)可以根據(jù)實(shí)際的內(nèi)存盗棵、CPU、數(shù)據(jù)以及應(yīng)用程序邏輯的情況調(diào)整并行度參數(shù)北发。
- 算子層次
一個(gè)算子纹因、數(shù)據(jù)源和sink的并行度可以通過(guò)調(diào)用setParallelism()方法來(lái)指定,例如
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1).setParallelism(5);
wordCounts.print();
env.execute("Word Count Example");
- 執(zhí)行環(huán)境層次
Flink程序運(yùn)行在執(zhí)行環(huán)境中琳拨。執(zhí)行環(huán)境為所有執(zhí)行的算子辐怕、數(shù)據(jù)源、data sink定義了一個(gè)默認(rèn)的并行度从绘。
執(zhí)行環(huán)境的默認(rèn)并行度可以通過(guò)調(diào)用setParallelism()方法指定寄疏。例如:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(3);
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = [...]
wordCounts.print();
env.execute("Word Count Example");
- 客戶(hù)端層次
并行度可以在客戶(hù)端將job提交到Flink時(shí)設(shè)定是牢。對(duì)于CLI客戶(hù)端,可以通過(guò)“-p”參數(shù)指定并行度陕截。例如:
./bin/flink run -p 10 ../examples/*WordCount-java*.jar
- 系統(tǒng)層次
在系統(tǒng)級(jí)可以通過(guò)修改Flink客戶(hù)端conf目錄下的“flink-conf.yaml”文件中的“parallelism.default”配置選項(xiàng)來(lái)指定所有執(zhí)行環(huán)境的默認(rèn)并行度驳棱。
3.配置進(jìn)程參數(shù)
操作場(chǎng)景
Flink on YARN模式下,有JobManager和TaskManager兩種進(jìn)程农曲。在任務(wù)調(diào)度和運(yùn)行的過(guò)程中社搅,JobManager和TaskManager承擔(dān)了很大的責(zé)任。
因而JobManager和TaskManager的參數(shù)配置對(duì)Flink應(yīng)用的執(zhí)行有著很大的影響意義乳规。用戶(hù)可通過(guò)如下操作對(duì)Flink集群性能做優(yōu)化形葬。
操作步驟
1.配置JobManager內(nèi)存。
- JobManager負(fù)責(zé)任務(wù)的調(diào)度暮的,以及TaskManager笙以、RM之間的消息通信。當(dāng)任務(wù)數(shù)變多冻辩,任務(wù)平行度增大時(shí)猖腕,JobManager內(nèi)存都需要相應(yīng)增大。
您可以根據(jù)實(shí)際任務(wù)數(shù)量的多少恨闪,為JobManager設(shè)置一個(gè)合適的內(nèi)存倘感。
?在使用yarn-session命令時(shí),添加“-jm MEM”參數(shù)設(shè)置內(nèi)存咙咽。
?在使用yarn-cluster命令時(shí)老玛,添加“-yjm MEM”參數(shù)設(shè)置內(nèi)存。
2.配置TaskManager個(gè)數(shù)钧敞。
每個(gè)TaskManager每個(gè)核同時(shí)能跑一個(gè)task逻炊,所以增加了TaskManager的個(gè)數(shù)相當(dāng)于增大了任務(wù)的并發(fā)度。在資源充足的情況下犁享,可以相應(yīng)增加TaskManager的個(gè)數(shù)余素,以提高運(yùn)行效率。
?在使用yarn-session命令時(shí)炊昆,添加“-n NUM”參數(shù)設(shè)置TaskManager個(gè)數(shù)桨吊。
?在使用yarn-cluster命令時(shí),添加“-yn NUM”參數(shù)設(shè)置TaskManager個(gè)數(shù)凤巨。
3.配置TaskManager Slot數(shù)视乐。
每個(gè)TaskManager多個(gè)核同時(shí)能跑多個(gè)task,相當(dāng)于增大了任務(wù)的并發(fā)度敢茁。但是由于所有核共用TaskManager的內(nèi)存佑淀,所以要在內(nèi)存和核數(shù)之間做好平衡。
?在使用yarn-session命令時(shí)彰檬,添加“-s NUM”參數(shù)設(shè)置SLOT數(shù)伸刃。
?在使用yarn-cluster命令時(shí)谎砾,添加“-ys NUM”參數(shù)設(shè)置SLOT數(shù)。
4.配置TaskManager內(nèi)存捧颅。
TaskManager的內(nèi)存主要用于任務(wù)執(zhí)行景图、通信等。當(dāng)一個(gè)任務(wù)很大的時(shí)候碉哑,可能需要較多資源挚币,因而內(nèi)存也可以做相應(yīng)的增加。
?將在使用yarn-sesion命令時(shí)扣典,添加“-tm MEM”參數(shù)設(shè)置內(nèi)存妆毕。
?將在使用yarn-cluster命令時(shí),添加“-ytm MEM”參數(shù)設(shè)置內(nèi)存贮尖。