1. 程式人生 > >生產環境中的flume海量資料傳輸效能優化

生產環境中的flume海量資料傳輸效能優化

上一篇文章,記flume部署過程中遇到的問題以及解決方法,記錄了flume在執行過程中遇到的問題的解決方法,本文將記錄在專案除錯過程中對flume效能的優化。
再放上專案的拓撲結構圖:
這裡寫圖片描述

實際生產環境中,agent層的機器大約有50臺,在高峰時期生成的日誌量大約在5000條/s, 每天總共生成的日誌量大約在8T左右, collector的機器有8臺,所以對該系統的傳輸效率有很高的要求。

在測試中,發現在使用基本配置時,flume傳送資料的效率並不是很理想,agent向collector傳送資料最快也就每秒1000條左右,遠不能滿足系統傳輸需求,在隨後的除錯過程中,通過修改jvm環境引數以及agent、collector層的配置,逐步使得傳輸效能達到要求,現將除錯過程記錄如下:

agent層的除錯資料:

優化方法 java 環境 channel型別 sink型別與個數 是否壓縮 source接收到條數&速度 channel已寫入 &channel佔用率 sink輸出量 sink輸出速度 cpu佔用 記憶體佔用 總結
預設 file 100w 負載均衡 2個avro sink 2472192 1373/s 2473728 0.02% 2360100 1311/s 約35% 8.6G 傳輸效率很低
優化java配置,啟用2G記憶體 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 2個avro sink 6226688 3459/s 6227712 99.90% 5228000 2904/s 約30% 8.6G 傳輸效率有較大提升
avro壓縮傳輸 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 2個avro sink 5076224 2820/s 5077504 99.90% 4077800 2265/s 約47% 10.4G 傳輸效率不升反降
採用memory channel Xms2g Xmx2g Xss256k Xmn1g memory 100w 負載均衡 2個avro sink 6767104 3759/s 6771968 99.90% 5772200 3207/s 100%-200% 10.4G 傳輸效率有少量提升,但是cpu壓力很大
資料不傳輸到L2,直接sink到本地 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 2個file sink 5761280 3201/s 5762816 0.00% 5761662 3201/s 10%-50% 10.4G channel無堆積,但是傳輸量無明顯提升
將資料傳給8個Sink組成的L2 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 8個avro sink 1423616 791/s 1393664 99.90% 393700 218/s 5% 10.4G 傳輸效率極低
優化avro-avro傳輸,avro sink配置maxIoWorkers128,L2的avro source threads設為1000 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 2個file sink 2971392 1651/s 2972416 99.90% 1972500 1095/s 5%-20% 10.4G 傳輸效率不升反降
將L2資料sink到本地 Xms2g Xmx2g Xss256k Xmn1g file 100w 負載均衡 2個avro sink 6279168 3488/s 6280448 99.90% 5280500 2934/s 約30% 10.4G 傳輸效率無明顯提升
增大java記憶體 增大avro sink batchsize 啟用壓縮 啟用memorychannel Xms8g Xmx8g Xss256k Xmn3g memory 100w 負載均衡 2個avro sink 5640704 3134/s 5643776 99.90% 4644000 2580/s 30% 16.5G 傳輸效率無明顯提升
增加jvm記憶體到8G,filechannel設為1000w容量 Xms8g Xmx8g Xss256k Xmn3g file 1000w 負載均衡 2個file sink 7330816 4073/s 7332096 48% 2519000 1399/s 2%-16% 16.5G 傳輸效率不升反降
在上一種方法的基礎上增加avro batchsize為2000 Xms8g Xmx8g Xss256k Xmn3g file 2000w 負載均衡 2個avro sink 8168960 4538/s 8170496 69% 1270000 706/s 10%-20% 16.5G 傳輸效率極低
4個sink無組策略 Xms8g Xmx8g Xss256k Xmn3g file 2000w 無組策略 4個avro sink 7222272 4012/s 7223808 0.02% 7222272 4012/s 30%-50% 16.6G 取消負載均衡,效率有較大提升666
8個sink無組策略 Xms8g Xmx8g Xss256k Xmn3g file 2000w 無組策略 8個avro sink 7034624 3908/s 7035648 0.03614% 7032034 3906/s 30%-50% 16.6G 無組策略的情況下,8個sink和4個sink效率無差
4個sink無組策略 memrorychannel Xms8g Xmx8g Xss256k Xmn3g memory 100w 無組策略 4個avro sink 17435648 9686/s 17441536 47.56% 12678000 7043/s 100%-500% 16.6G cpu壓力很大
2個sink無組策略 memrorychannel L2的記憶體channel擴大到1億 Xms8g Xmx8g Xss256k Xmn3g memory 100w 無組策略 4個avro sink 18679438 10337/s 18684778 0.00256% 18683444 10448/s 10%-20% 16.6G 此為目前傳輸最快的方案
8個sink無組策略,2G記憶體 Xms2g Xmx2g Xss256k Xmn1g file 2000w 無組策略 8個avro sink 7067392 3926/s 7068416 0.00256% 7067212 3926/s 30%-40% 10.8G jvm2G記憶體已經夠用
8個sink無組策略,2G記憶體,壓縮 Xms2g Xmx2g Xss256k Xmn1g file 2000w 無組策略 8個avro sink 7362048 4090/s 7363072 0.0055% 7361995 4090/s 50%-100% 10.6G L1到L2壓縮對傳輸速度無太大提升,增大了CPU負擔
4個sink無組策略,2G記憶體,壓縮 Xms2g Xmx2g Xss256k Xmn1g file 2000w 無組策略 4個avro sink 7501056 4167/s 7502592 0.01664 8036352 4464/s 40%-50% 10.5G 從channel獲取的數量大於channel寫入的數量,說明此時的瓶頸在channel寫入
4個sink無組策略,2G記憶體,不壓縮 Xms2g Xmx2g Xss256k Xmn1g file 2000w 無組策略 4個avro sink 7745792 4303/s 7747328 0.02688 7741952 4301/s 50%-100% 10.5G L1到L2壓縮對傳輸速度無太大提升,增大了CPU負擔
8個sink無組策略,傳送到4個L2,每個L2有兩個source,兩個channel Xms2g Xmx2g Xss256k Xmn1g file 2000w 無組策略 8個avro sink 6734336 3741/s 6735360 0.00177 6735006 3742/s 30%-50% 10.8G 發給同一機器的兩個avro source無效能提升

collector層的除錯資料:

優化方法 java 環境 channel型別 sink型別與個數 是否壓縮 source接收到條數&速度 channel已寫入 &channel佔用率 sink輸出量 sink輸出速度 cpu佔用 記憶體佔用 總結
正常傳輸 Xms20g Xmx20g Xss256k Xmn8g file 100w 無組策略 1個kafka sink 3099048 1722/s 3095238 99.90% 2144761 1192/s 2%-5% 25.6G 輸出速度不夠
增加到4個sink,filechannel容量擴大 Xms20g Xmx20g Xss256k Xmn8g file 1億 無組策略 4個kafka sink 18850000 10472/s 18850000 9.86% 8970971 4984/s 50%-100% 25.6G 速度提升約4倍
使用memory channel Xms20g Xmx20g Xss256k Xmn8g memory 1000w 無組策略 4個kafka sink 17794000 9886/s 17744000 99.95% 7745000 4303/s 100%-800% 25.6G 相比使用file channel無效能提升
增加到8個sink Xms20g Xmx20g Xss256k Xmn8g file 1億 無組策略 8個kafka sink 19251655 10695/s 19249668 2% 17148675 9527/s 100%-150% 26.8G 8個sink傳輸比1個速度提升約8倍

agent到collector啟用zlib壓縮前後的網路頻寬情況
這裡寫圖片描述
由圖可見,在啟用壓縮前,頻寬基本佔用在50M左右,啟用後,頻寬佔用在10M左右

總結:
1、預設jvm環境只使用了20m記憶體,需要調整,擴大到2G基本夠用,不需要過大;
2、collector到kafka,啟用的sink越多,傳輸越快;
3、如果collector到kafka通路受阻,使資料堆積在channel中,如果channel堆滿,則會影響agent到collector的傳輸;
4、agent到collector如果配置了組策略(sink group),則一個組策略只啟動一個傳輸執行緒,多個sink成一組則傳輸效率遠不如sink各傳各的,一個sink相當於一個傳輸執行緒;
5、通路不受阻的情況下,memoryChannel傳輸效率比fileChannel高很多,不過對cpu、記憶體的要求會很高;
6、avro壓縮傳輸對傳輸效率沒有太大提升,反而增大cpu負擔,但是會大大降低網路頻寬;
7、在網路頻寬受限的情況下,增加sink、改用memory channel等方法都不能增加傳輸效率;
8、影響flume傳輸效能的主要因素有,jvm記憶體、網路頻寬、channel型別、sink個數、是否壓縮、機器硬體效能,各條件需要做一個綜合的效能平衡,某一個環節出現瓶頸就會影響整個系統的傳輸效能。

ps:csdn的表格使用起來太蛋疼了…這個表格搞了我整整一個下午加一個晚上…