本文相關(guān)討論
- flink內(nèi)存對(duì)任務(wù)性能的影響:通過了解內(nèi)存模型,了解這些模型都負(fù)責(zé)那些工作,比如用戶代碼使用堆,數(shù)據(jù)通訊使用直接內(nèi)存等,以便能夠根據(jù)任務(wù)特點(diǎn)針對(duì)性調(diào)整任務(wù)內(nèi)存;
- 并發(fā)與帶寬之間的關(guān)系,local模式下怎么根據(jù)帶寬,設(shè)置最佳線程數(shù);
- 內(nèi)存監(jiān)控相關(guān)命令。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-802175.html
任務(wù)說明:
使用local模式運(yùn)行flink sql任務(wù),任務(wù)為:從hdfs解析數(shù)據(jù)到hdfs中的離線任務(wù),其中數(shù)據(jù)量有4億,文件數(shù)有13個(gè),初始運(yùn)行參數(shù)為:堆內(nèi)存設(shè)為3g、并發(fā)設(shè)為13,其中運(yùn)行命令如下:
java -XX:NativeMemoryTracking=summary -Xms3096m -Xmx3096m -cp $FLINK_HOME/lib/chunjun-core.jar:$FLINKX_HOME/bin/:$FLINK_HOME/lib/*:$HADOOP_CLASSPATH \
$CLASS_NAME -job hdfs-hdfs.sql -mode local -jobType sql \
-flinkConfDir $FLINK_HOME/conf \
-flinkLibDir $FLINK_HOME/lib \
-hadoopConfDir $HADOOP_CONF_DIR \
-confProp "{ \"taskmanager.numberOfTaskSlots\":13}"
本例子使用chunjun提交flink任務(wù)。
?
一. flink的內(nèi)存管理
了解flink內(nèi)存模型,可以讓我們針對(duì)任務(wù)特點(diǎn),合理設(shè)置內(nèi)存,在不造成內(nèi)存浪費(fèi)的同時(shí),分析出任務(wù)性能瓶頸。
1.Jobmanager的內(nèi)存模型
組成部分 | 配置參數(shù) | 描述 |
---|---|---|
JVM 堆內(nèi)存 | jobmanager.memory.heap.size |
JobManager 的 JVM 堆內(nèi)存??蚣軆?nèi)存、特殊批處理source、cp、akka通訊(java api實(shí)現(xiàn))。 |
堆外內(nèi)存 | jobmanager.memory.off-heap.size |
JobManager 的_堆外內(nèi)存(直接內(nèi)存或本地內(nèi)存)_。 |
JVM Metaspace | jobmanager.memory.jvm-metaspace.size |
Flink JVM 進(jìn)程的 Metaspace。 |
JVM 開銷 |
jobmanager.memory.jvm-overhead.min jobmanager.memory.jvm-overhead.max jobmanager.memory.jvm-overhead.fraction
|
用于其他 JVM 開銷的本地內(nèi)存,例如??臻g、垃圾回收空間等。該內(nèi)存部分為基于進(jìn)程總內(nèi)存的受限的等比內(nèi)存部分。 |
Flink 需要多少 JVM 堆內(nèi)存,很大程度上取決于運(yùn)行的作業(yè)數(shù)量、作業(yè)的結(jié)構(gòu)及上述用戶代碼的需求。
jobManager的內(nèi)存管理相關(guān)調(diào)優(yōu)不用關(guān)注太多,因?yàn)閖obmanager的任務(wù)相對(duì)固定。
?
2.TaskManager的內(nèi)存模型
2.1. 模型說明
內(nèi)存分類 | 解釋 |
---|---|
一. 堆內(nèi)存 | |
1. 框架堆內(nèi)存 | 啟動(dòng)TM所需內(nèi)存 |
2. Task堆內(nèi)存 | 存放、執(zhí)行Flink算子及用戶代碼 |
二.堆外內(nèi)存 | |
3. 框架堆外內(nèi)存* | 用于 Flink 框架的堆外內(nèi)存(直接內(nèi)存或本地內(nèi)存) |
4. 任務(wù)堆外內(nèi)存* | 用于 Flink 應(yīng)用的算子及用戶代碼的堆外內(nèi)存(直接內(nèi)存或本地內(nèi)存)(比如用戶代碼使用netty進(jìn)行數(shù)據(jù)傳輸)。 |
5. 網(wǎng)絡(luò)內(nèi)存* | 用戶任務(wù)之間數(shù)據(jù)傳輸?shù)闹苯觾?nèi)存 |
6. 托管內(nèi)存 | 用于存放Flink的中間結(jié)果和RocksDB State Backend 的本地內(nèi)存 |
7. JVM Metaspace和Overhead內(nèi)存 | 用于JVM存儲(chǔ)類元數(shù)據(jù);JVM的例如??臻g、垃圾回收空間等開銷 |
*代表直接內(nèi)存。
?
2.2. 通訊、數(shù)據(jù)傳輸方面
TaskManager和JobManager之間的通訊
主要依賴JVM堆內(nèi)存,網(wǎng)絡(luò)緩沖器內(nèi)存在數(shù)據(jù)傳輸方面也起到了一定的作用。具體來說:
- TaskManager和JobManager之間的所有通信(例如任務(wù)提交,狀態(tài)更新等)都是通過Akka消息進(jìn)行的。
- 在數(shù)據(jù)傳輸過程中,TaskManager使用的網(wǎng)絡(luò)緩沖器內(nèi)存也在一定程度上參與了和JobManager的通信。比如說,TaskManager需要向JobManager發(fā)送一些統(tǒng)計(jì)信息,或者在寫入或讀取遠(yuǎn)程狀態(tài)數(shù)據(jù)時(shí),都需要使用網(wǎng)絡(luò)緩沖器內(nèi)存。
?
TaskManager之間的通信
TaskManager之間的通信主要使用的是網(wǎng)絡(luò)緩沖器內(nèi)存(Network Memory)。當(dāng)兩個(gè)TaskManager之間需要交換數(shù)據(jù)時(shí),會(huì)使用網(wǎng)絡(luò)緩沖器內(nèi)存來存儲(chǔ)待發(fā)送的數(shù)據(jù)以及接收到的數(shù)據(jù)。
Flink的網(wǎng)絡(luò)通信基于Netty,Netty默認(rèn)使用堆外(off-heap)內(nèi)存進(jìn)行數(shù)據(jù)的讀寫操作。在數(shù)據(jù)發(fā)送方,F(xiàn)link會(huì)先將數(shù)據(jù)序列化后存放到網(wǎng)絡(luò)緩沖器中,然后通過網(wǎng)絡(luò)發(fā)送到接收方。在接收方,F(xiàn)link會(huì)從網(wǎng)絡(luò)緩沖器中讀取數(shù)據(jù),然后進(jìn)行反序列化,恢復(fù)成原始的數(shù)據(jù)格式。 網(wǎng)絡(luò)緩沖器內(nèi)存的大小會(huì)影響Flink job的性能,如果設(shè)置得過小可能會(huì)導(dǎo)致數(shù)據(jù)傳輸?shù)钠款i,過大則可能會(huì)浪費(fèi)內(nèi)存資源。
?
2.3. 框架、任務(wù)堆外內(nèi)存
- 框架堆外內(nèi)存:主要用于網(wǎng)絡(luò)緩沖和一些需要大數(shù)據(jù)計(jì)算的操作,如排序或哈希操作。Flink使用堆外內(nèi)存以存儲(chǔ)中間結(jié)果,防止大數(shù)據(jù)操作時(shí)耗盡所有的Java堆內(nèi)存。
- 任務(wù)堆外內(nèi)存:主要用于用戶代碼和操作,以及用戶代碼依賴的庫和插件的內(nèi)存需求。它使得用戶代碼和框架操作能在任務(wù)中并行運(yùn)行而不會(huì)互相干擾。
在實(shí)際操作中,你可以根據(jù)具體工作負(fù)載的需求來調(diào)整這三部分內(nèi)存的配置。
?
2.4. 托管內(nèi)存
托管內(nèi)存(Managed Memory)主要用于數(shù)據(jù)處理和中間結(jié)果的存儲(chǔ),被用于以下幾個(gè)主要的用途:
- 狀態(tài)后端:如果你使用RockDB這樣的內(nèi)存稀疏狀態(tài)后端,那么托管內(nèi)存可以用作寫緩沖區(qū)或者讀緩沖區(qū),用來優(yōu)化讀寫的性能。
- 網(wǎng)絡(luò)緩沖:在數(shù)據(jù)發(fā)送和接收過程中,F(xiàn)link使用托管內(nèi)存作為網(wǎng)絡(luò)緩沖區(qū)。
- 批處理算子:在進(jìn)行批處理的計(jì)算時(shí),如排序和哈希操作,F(xiàn)link會(huì)使用到托管內(nèi)存。
?
狀態(tài)后端存儲(chǔ)
- Flink 任務(wù)處理中的狀態(tài)(例如鍵控狀態(tài))通常需要持久化,以確保容錯(cuò)性和恢復(fù)能力。
托管內(nèi)存是Flink特地為狀態(tài)后端和網(wǎng)絡(luò)緩沖等用途分配的內(nèi)存段。 托管內(nèi)存被用于存儲(chǔ)狀態(tài)后端的數(shù)據(jù),這樣可以避免將大量狀態(tài)數(shù)據(jù)存儲(chǔ)在 JVM 堆內(nèi)存中,從而提高任務(wù)的穩(wěn)定性和性能。- 當(dāng)你啟用RockDB狀態(tài)后端時(shí),F(xiàn)link將把數(shù)據(jù)寫入磁盤,而不僅僅是維持在內(nèi)存中,這樣可以支持更大的狀態(tài)大小和更長的保留周期。
?
3.任務(wù)分析
任務(wù)為local模式,任務(wù)為從hdfs讀到hdfs寫,hdfs的源數(shù)據(jù)有13個(gè)文件,總共有4億的數(shù)據(jù),每條數(shù)據(jù)98byte。下面從flink內(nèi)存模型的角度分析下任務(wù)對(duì)各內(nèi)存的使用情況
local模式代表,在機(jī)器上啟動(dòng)一個(gè)minicluster,這包含一個(gè)jobmanager、一個(gè)taskmanager。
- 任務(wù)啟動(dòng)時(shí)會(huì)使用框架堆內(nèi)存(Framework Heap Memory)創(chuàng)建啟動(dòng)jobmanager和taskmanager。
- 因?yàn)橹挥幸粋€(gè)taskmanager,也就是不會(huì)涉及到taskmanager之間的數(shù)據(jù)傳輸,所以不會(huì)用到網(wǎng)絡(luò)緩存(Network Memory)。
- 從用戶代碼層面看,這里使用的是flink sql ,其中hdfs-connector用于讀寫數(shù)據(jù),這算是用戶代碼,而相關(guān)讀寫實(shí)現(xiàn)使用的是hdfs
client相關(guān)api實(shí)現(xiàn),api中沒有涉及到使用直接內(nèi)存的方法,所以讀寫數(shù)據(jù)的操作是在堆內(nèi)存中(.任務(wù)堆內(nèi)存(Task Heap Memory))。- 此離線任務(wù)來一條數(shù)據(jù)處理一條,即任務(wù)無狀態(tài)、或中間結(jié)果,也就是說任務(wù)不需要托管內(nèi)存(Managed memory)
所以總體分析下來,local模式下我們需要調(diào)控的是堆內(nèi)存,因?yàn)閿?shù)據(jù)傳輸主要存在于用戶代碼中。
?
二. 單個(gè)節(jié)點(diǎn)的帶寬瓶頸
根據(jù)拿到的帶寬,與任務(wù)消費(fèi)數(shù)據(jù)速度,我們大概可以測(cè)試出任務(wù)的并發(fā)度。
1. 帶寬相關(guān)理論
網(wǎng)絡(luò)帶寬是指在一個(gè)固定的時(shí)間內(nèi)(1秒),能通過的最大位數(shù)據(jù),是個(gè)峰值數(shù)據(jù), 單位是Mbps
。
?
上行帶寬/下行帶寬
帶寬的上行和下行分別指的是網(wǎng)絡(luò)傳輸中數(shù)據(jù)的上傳和下載方向。
- 對(duì)于服務(wù)器來說對(duì)外提供服務(wù)用的是自己的
上行帶寬
和用戶的下行帶寬
, 而用戶上傳東西則用的自己的上行帶寬
和服務(wù)器的下行帶寬
- 對(duì)于用戶來說訪問服務(wù)器用的是用戶的
下行帶寬
和服務(wù)器的上行帶寬
, 而上傳文件則用的用戶的上行帶寬
和服務(wù)器的下行帶寬
?
流量單位/存儲(chǔ)單位
下載速度的單位為KB/s,而帶寬所使用的計(jì)量單位為Kb/s,兩者相差8倍:8 bit = 1 B 一字節(jié) (1Byte)
帶寬速度計(jì)算:
1M帶寬下載速度125KB/s;
2M帶寬下載速度125KB/s*2;
10M帶寬下載速度125KB/s*10=1.25M/s;
20M帶寬下載速度125KB/s*20=2.5M/s;
100M帶寬下載速度125KB/s*100=12.5M/s
?
實(shí)際帶寬速率的損失
理論上,2Mbps帶寬,寬帶理論速率是 256KB/s。實(shí)際速率大約為103–200kB/s。4M,即4Mb/s寬帶理論速率是 512KB/s 實(shí)際速率大約為200—440kB/s。
其原因是受用戶計(jì)算機(jī)性能、網(wǎng)絡(luò)設(shè)備質(zhì)量、資源使用情況、網(wǎng)絡(luò)高峰期、網(wǎng)站服務(wù)能力、線路衰耗、信號(hào)衰減等多因素的影響而造成的)。
?
吞吐量
吞吐量是指在沒有幀丟失的情況下,設(shè)備能夠接收并轉(zhuǎn)發(fā)的最大數(shù)據(jù)速率實(shí)際帶寬,單位Mbps, 通常用來描述一個(gè)系統(tǒng)的性能。
與帶寬的關(guān)系:吞吐量即在規(guī)定時(shí)間、空間及數(shù)據(jù)在網(wǎng)絡(luò)中所走的路徑(網(wǎng)絡(luò)路徑)的前提下,下載文件時(shí)實(shí)際獲得的帶寬值。由于多方面的原因,實(shí)際上吞吐量往往比傳輸介質(zhì)所標(biāo)稱的最大帶寬小得多
例如: 帶寬為10Mbps的鏈路連接的一對(duì)節(jié)點(diǎn)可能只達(dá)到2Mbps的吞吐量。這樣就意味著,一個(gè)主機(jī)上的應(yīng)用能夠以2Mbps的速度向另外的一個(gè)主機(jī)發(fā)送數(shù)據(jù)。
?
2. 使用speedtest-cli 測(cè)試帶寬
# 安裝
$ sudo yum install -y speedtest-cli
# 測(cè)試
$ speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Unicom (111.206.170.119)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by China Telecom TianJin-5G (TianJin) [123.83 km]: 65.213 ms
Testing download speed................................................................................
Download: 143.51 Mbit/s
Testing upload speed......................................................................................................
Upload: 456.74 Mbit/s
?
3. 任務(wù)分析
Speedtest-cli測(cè)量出的是你的網(wǎng)絡(luò)連接的最大理論帶寬。實(shí)際上,你的實(shí)際網(wǎng)絡(luò)帶寬可能因?yàn)楹芏嘁蛩兀ɡ缇W(wǎng)絡(luò)擁堵,服務(wù)器性能,距離測(cè)試服務(wù)器的遠(yuǎn)近,你本地網(wǎng)絡(luò)的設(shè)置等)而低于這個(gè)理論值。對(duì)于代碼中處理數(shù)據(jù),還要考慮代碼處理數(shù)據(jù)的效率。
實(shí)際在測(cè)試過程中,有如下瓶頸:
- 使用3G內(nèi)存啟動(dòng)flink任務(wù),對(duì)于每條數(shù)據(jù)為98Byte,單線程每次處理4萬條數(shù)據(jù),13個(gè)線程(數(shù)據(jù)源共有13個(gè)文件)同時(shí)消費(fèi),花費(fèi)20s,大概算下來每秒處理2.43MB/s數(shù)據(jù)。
- 當(dāng)增大堆內(nèi)存時(shí)效率并未提升,也就是到了帶寬瓶頸。且當(dāng)我將內(nèi)存降低到2G時(shí),消費(fèi)速度并未明顯減小。
?
也就是說每秒處理2.43MB/s數(shù)據(jù)是機(jī)器帶寬瓶頸,目前最佳內(nèi)存為2G,并發(fā)減小時(shí)處理時(shí)間會(huì)比例減小,當(dāng)并發(fā)減小到4時(shí),處理速度達(dá)到快,3秒處理完,但總體算下來小于每秒處理2.43MB/s數(shù)據(jù),也就是說并發(fā)根據(jù)文件數(shù)設(shè)置可以達(dá)到最佳性能。
?
3. 其他工具使用介紹
測(cè)試任務(wù)占用內(nèi)存: jps + top
# 1. 找到指定進(jìn)程
jps -l
2900 com.dtstack.chunjun.Main
3645 sun.tools.jps.Jps
# 2. 查看一個(gè)進(jìn)程占用內(nèi)存
top -p <pid>
按e會(huì)轉(zhuǎn)換內(nèi)存為byte->m->g等單位,較為人性化的展示。
文章來源:http://www.zghlxwxcb.cn/news/detail-802175.html
?
到了這里,關(guān)于【性能調(diào)優(yōu)】local模式下flink處理離線任務(wù)能力分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!