目錄
配置內(nèi)存
設(shè)置并行度
操作場景
具體設(shè)置
補(bǔ)充
配置進(jìn)程參數(shù)
操作場景
具體配置
配置netty網(wǎng)絡(luò)通信
操作場景
具體配置
配置內(nèi)存
Flink是依賴內(nèi)存計(jì)算,計(jì)算過程中內(nèi)存不夠?qū)?/span>Flink的執(zhí)行效率影響很大??梢酝ㄟ^監(jiān)控GC(Garbage Collection),評(píng)估內(nèi)存使用及剩余情況來判斷內(nèi)存是否變成性能瓶頸,并根據(jù)情況優(yōu)化。
監(jiān)控節(jié)點(diǎn)進(jìn)程的YARN的Container GC日志,如果頻繁出現(xiàn)Full GC,需要優(yōu)化GC。
conf/flink-conf.yaml
env.java.opts: -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch -server
-XX:+HeapDumpOnOutOfMemoryError
調(diào)整老年代和新生代的比值。env.java.opts配置項(xiàng)中添加參數(shù):-XX:NewRatio。
如“-XX:NewRatio=2,則表示老年代與新生代的比值為2:1,新生代占整個(gè)堆空間的1/3,老年代占2/3。
設(shè)置并行度
操作場景
并行度控制任務(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è)置
任務(wù)的并行度可以通過以下四種層次(按優(yōu)先級(jí)從高到低排列)指定,用戶可以根據(jù)實(shí)際的內(nèi)存、CPU、數(shù)據(jù)以及應(yīng)用程序邏輯的情況調(diào)整并行度參數(shù)。
- 算子層次
一個(gè)算子、數(shù)據(jù)源和sink的并行度可以通過調(diào)用setParallelism()方法來指定,例如
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)并行度可以通過調(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");
- 客戶端層次
并行度可以在客戶端將job提交到Flink時(shí)設(shè)定。對(duì)于CLI客戶端,可以通過“-p”參數(shù)指定并行度。例如:
./bin/flink run -p 10 ../examples/*WordCount-java*.jar
- 系統(tǒng)層次
在系統(tǒng)級(jí)可以通過修改Flink客戶端conf目錄下的“flink-conf.yaml”文件中的“parallelism.default”配置選項(xiàng)來指定所有執(zhí)行環(huán)境的默認(rèn)并行度。
補(bǔ)充
開發(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)致無法并行,例如WindowAll。
- keyBy盡量不要使用String。
配置進(jìn)程參數(shù)
操作場景
Flink on YARN模式下,有JobManager和TaskManager兩種進(jìn)程。在任務(wù)調(diào)度和運(yùn)行的過程中,JobManager和TaskManager承擔(dān)了很大的責(zé)任。
因而JobManager和TaskManager的參數(shù)配置對(duì)Flink應(yīng)用的執(zhí)行有著很大的影響意義。用戶可通過如下操作對(duì)Flink集群性能做優(yōu)化。
具體配置
- 配置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)存。
- 配置TaskManager個(gè)數(shù)
每個(gè)TaskManager每個(gè)核同時(shí)能跑一個(gè)task,所以增加了TaskManager的個(gè)數(shù)相當(dāng)于增大了任務(wù)的并發(fā)度。在資源充足的情況下,可以相應(yīng)增加TaskManager的個(gè)數(shù),以提高運(yùn)行效率。
- 配置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ù)。
- 配置TaskManager內(nèi)存
TaskManager的內(nèi)存主要用于任務(wù)執(zhí)行、通信等。當(dāng)一個(gè)任務(wù)很大的時(shí)候,可能需要較多資源,因而內(nèi)存也可以做相應(yīng)的增加。
????????將在使用yarn-session命令時(shí),添加“-tm MEM”參數(shù)設(shè)置內(nèi)存。
????????將在使用yarn-cluster命令時(shí),添加“-ytm MEM”參數(shù)設(shè)置內(nèi)存。
配置netty網(wǎng)絡(luò)通信
操作場景
Flink通信主要依賴netty網(wǎng)絡(luò),所以在Flink應(yīng)用執(zhí)行過程中,netty的設(shè)置尤為重要,網(wǎng)絡(luò)通信的好壞直接決定著數(shù)據(jù)交換的速度以及任務(wù)執(zhí)行的效率。
具體配置
以下配置均可在客戶端的“conf/flink-conf.yaml”配置文件中進(jìn)行修改適配,默認(rèn)已經(jīng)是相對(duì)較優(yōu)解,請(qǐng)謹(jǐn)慎修改,防止性能下降。
- taskmanager.network.netty.num-arenas:
默認(rèn)是taskmanager.numberOfTaskSlots,表示netty的域的數(shù)量。
- taskmanager.network.netty.server.numThreads和taskmanager.network.netty.client.numThreads:
默認(rèn)是taskmanager.numberOfTaskSlots,表示netty的客戶端和服務(wù)端的線程數(shù)目設(shè)置。
- taskmanager.network.netty.client.connectTimeoutsec:
默認(rèn)是120s,表示taskmanager的客戶端連接超時(shí)的時(shí)間。
- taskmanager.network.netty.sendReceiveBufferSize:
默認(rèn)是系統(tǒng)緩沖區(qū)大小(cat /proc/sys/net/ipv4/tcp_[rw]mem) ,一般為4MB,表示netty的發(fā)送和接收的緩沖區(qū)大小。文章來源:http://www.zghlxwxcb.cn/news/detail-517264.html
- taskmanager.network.netty.transport:
默認(rèn)為nio方式,表示netty的傳輸方式,有nio和epoll兩種方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-517264.html
到了這里,關(guān)于Flink流批一體計(jì)算(7):Flink優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!