kafka處理大文件注意事項

這篇文章是我在粗略學(xué)習(xí)kafka時遇到的問題和網(wǎng)上查閱過的資料。kafka和java我都不是很熟悉灵寺,只知道基本的概念曼库。文章中可能有疏漏和錯誤的地方,大家參考一下就好略板。有錯誤拜托大家指正毁枯!

broker端

  • 配置文件需要配置的參數(shù)
  1. message.max.bytes : kafka 會接收單個消息size的最大限制, 默認(rèn)為1M左右叮称。如果producer發(fā)送比這個大的消息种玛,kafka默認(rèn)會丟掉。producer可以從callback函數(shù)中獲得錯誤碼:10瓤檐。
  2. log.segment.bytes : kafka數(shù)據(jù)文件的大小蒂誉。默認(rèn)為1G, 需要確保此值大于一個消息的最大大小。
  3. replica.fetch.max.bytes : broker可復(fù)制的消息的最大字節(jié)數(shù), 默認(rèn)為1M距帅。這個值應(yīng)該比message.max.bytes大右锨,否則broker會接收此消息,但無法將此消息復(fù)制出去碌秸,從而造成數(shù)據(jù)丟失绍移。
  • bin目錄下的kafka-run-class.sh中需要配置的參數(shù)
    kafka是由scala和java編寫的。所以需要調(diào)一些jvm的參數(shù)讥电。java的內(nèi)存分為堆內(nèi)內(nèi)存和堆外內(nèi)存蹂窖。
  1. -Xms2048m, -Xmx2048m,設(shè)置的是堆內(nèi)內(nèi)存恩敌。-Xms是初始可用的最大堆內(nèi)內(nèi)存瞬测。-Xmx設(shè)置的是最大可用的堆內(nèi)內(nèi)存。二者設(shè)置成一樣是因為效率問題纠炮,可以讓jvm少做一些運算月趟。如果這兩個參數(shù)設(shè)置的太小,kafka會出現(xiàn)java.lang.OutOfMemoryError: Java heap space的錯誤恢口。

  2. --XX:MaxDirectMemorySize=8192m孝宗。這個參數(shù)配置的太小,kafka會出現(xiàn)java.lang.OutOfMemoryError: Direct buffer memory的錯誤耕肩。 因為kafka的網(wǎng)絡(luò)IO使用了java的nio中的DirectMemory的方式,而這個申請的是堆外內(nèi)存因妇。

    至于kafka的什么組件的哪些方法用了堆內(nèi)內(nèi)存還是堆外內(nèi)存问潭,還有用多少,我不清楚婚被,沒有學(xué)過java狡忙,也沒看過kafka源碼。只是碰到了這個問題址芯,然后記錄一下去枷。

producer端(php-rdkafka)

  1. message.max.bytes, 要設(shè)置大于發(fā)送最大數(shù)據(jù)的大小是复,否則會produce失敗删顶。

consumer端(php-rdkafka)

  1. receive.message.max.bytes : kafka 協(xié)議response 的最大長度,應(yīng)該保證次參數(shù)大于等于message.max.bytes淑廊。否則消費會失敗逗余。
    另外,還需要注意一個問題季惩,版本過低的librdkafka的receive.message.max.bytes只支持1000到1000000000录粱。目前最新版本的可以支持到2147483647。使用此參數(shù)的時候還需要注意一個問題画拾,比如我在broker端設(shè)置的message.max.bytes為1000啥繁, 在consumer端設(shè)置的receive.message.max.bytes也為1000,但是除了數(shù)據(jù)青抛,response還有協(xié)議相關(guān)字段旗闽,這時候整個response的大小就會超過1000。而consumer就會收到“Receive failed: Invalid message size 1047207987 (0..1000000000): increase receive.message.max.bytes”這樣的錯誤蜜另。broker為何會返回總量為1000大小的數(shù)據(jù)呢适室?其實librdkafka有這樣一個參數(shù):fetch.max.bytes, 它有這樣的描述:Maximum amount of data the broker shall return for a Fetch request. Messages are fetched in batches by the consumer and if the first message batch in the first non-empty partition of the Fetch request is larger than this value, then the message batch will still be returned to ensure the consumer can make progress. The maximum message batch size accepted by the broker is defined via message.max.bytes (broker config) or max.message.bytes (broker topic config). fetch.max.bytes is automatically adjusted upwards to be at least message.max.bytes (consumer config). 它會自動調(diào)整到message.max.bytes 這樣的大小,返回的數(shù)據(jù)大小甚至還可能超過這個大小举瑰。而你此時設(shè)置的
    receive.message.max.bytes == message.max.bytes == 1000 就會出上面說的那個錯誤捣辆。所以應(yīng)該讓consumer端設(shè)置的receive.message.max.bytes大于broker端設(shè)置的 message.max.bytes ,我猜應(yīng)該大于單個最大數(shù)據(jù)的大小此迅,這樣就不會出錯了汽畴,但是沒有驗證。目前我的測試環(huán)境數(shù)據(jù)最大為500M左右耸序。message.max.bytes 我設(shè)置了900M忍些, receive.message.max.bytes設(shè)置了1000000000, 暫時沒有出現(xiàn)問題佑吝。

內(nèi)存方面需要考慮的問題

  • 有一段這樣的描述 Brokers allocate a buffer the size of replica.fetch.max.bytes for each partition they replicate. If replica.fetch.max.bytes is set to 1 MiB, and you have 1000 partitions, about 1 GiB of RAM is required. Ensure that the number of partitions multiplied by the size of the largest message does not exceed available memory.
    The same consideration applies for the consumer fetch.message.max.bytes setting. Ensure that you have enough memory for the largest message for each partition the consumer replicates. With larger messages, you might need to use fewer partitions or provide more RAM.

一些坑

性能調(diào)優(yōu)

https://www.cnblogs.com/SpeakSoftlyLove/p/6511547.html
https://blog.csdn.net/vegetable_bird_001/article/details/51858915

以上內(nèi)容參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末开仰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子薪铜,更是在濱河造成了極大的恐慌众弓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隔箍,死亡現(xiàn)場離奇詭異谓娃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜒滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門滨达,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俯艰,你說我怎么就攤上這事捡遍。” “怎么了竹握?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵画株,是天一觀的道長。 經(jīng)常有香客問我啦辐,道長污秆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任昧甘,我火速辦了婚禮良拼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘充边。我一直安慰自己庸推,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布浇冰。 她就那樣靜靜地躺著贬媒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肘习。 梳的紋絲不亂的頭發(fā)上际乘,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音漂佩,去河邊找鬼脖含。 笑死罪塔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的养葵。 我是一名探鬼主播征堪,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关拒!你這毒婦竟也來了佃蚜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤着绊,失蹤者是張志新(化名)和其女友劉穎谐算,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归露,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡氯夷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靶擦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腮考。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玄捕,靈堂內(nèi)的尸體忽然破棺而出踩蔚,到底是詐尸還是另有隱情,我是刑警寧澤枚粘,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布馅闽,位于F島的核電站,受9級特大地震影響馍迄,放射性物質(zhì)發(fā)生泄漏福也。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一攀圈、第九天 我趴在偏房一處隱蔽的房頂上張望暴凑。 院中可真熱鬧,春花似錦赘来、人聲如沸现喳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗦篱。三九已至,卻和暖如春幌缝,著一層夾襖步出監(jiān)牢的瞬間灸促,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留浴栽,地道東北人荒叼。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像吃度,于是被迫代替她去往敵國和親甩挫。 傳聞我的和親對象是個殘疾皇子贴硫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容