溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

為什么Flink無法實(shí)時寫入MySQL

發(fā)布時間:2021-08-25 21:07:29 來源:億速云 閱讀:174 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“為什么Flink無法實(shí)時寫入MySQL”,在日常操作中,相信很多人在為什么Flink無法實(shí)時寫入MySQL問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”為什么Flink無法實(shí)時寫入MySQL”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

本文主要分為以下三部分:                        
                     
  1. 問題描述

  2. 解決思路

  3. 原因剖析                          

問題描述

 
Flink 1.10 使用 flink-jdbc 連接器的方式與 MySQL 交互,讀數(shù)據(jù)和寫數(shù)據(jù)都能完成,但是在寫數(shù)據(jù)時,發(fā)現(xiàn) Flink 程序執(zhí)行完畢之后,才能在 MySQL 中查詢到插入的數(shù)據(jù)。即,雖然是流計(jì)算,但卻不能實(shí)時的輸出計(jì)算結(jié)果?
為什么Flink無法實(shí)時寫入MySQL  

 
相關(guān)代碼片段:  

 
JDBCAppendTableSink.builder()    .setDrivername("com.mysql.jdbc.Driver")    .setDBUrl("jdbc:mysql://localhost/flink")    .setUsername("root")    .setPassword("123456")    .setParameterTypes(    BasicTypeInfo.INT_TYPE_INFO,    BasicTypeInfo.STRING_TYPE_INFO)    .setQuery("insert into batch_size values(?,?)")   .build()
 

 

如何解決?

Flink 1.10 這個問題是知道一秒鐘,不知磨洋工的 Case,在初學(xué)時候非常容易遇上,那么真的是 Flink 不能實(shí)時寫入 MySQL 嗎?當(dāng)然不是,上面代碼基礎(chǔ)之上簡單的加上一行,就解決問題了:

....setBatchSize(1) //將寫入MySQL的buffer大小為1。..

原因剖析

那么問題雖然解決了,根本原因是個啥呢?也許你看到這里會說,這問題很明顯,就是 Flink 設(shè)計(jì) JDBC Sink 的時候出于性能因素考慮,對寫入 buffer 做了默認(rèn)值設(shè)置。

沒錯,這一點(diǎn)你說的很對,在 Flink 1.10 中 JDBC OutputFormat 的基類  AbstractJDBCOutputFormat 里面和這相關(guān)的變量 DEFAULT_FLUSH_MAX_SIZE 默認(rèn)值是 5000,所以在你學(xué)習(xí)測試時候由于測試數(shù)據(jù)少(少于 5000),數(shù)據(jù)一直在 buffer 中,直到數(shù)據(jù)源數(shù)據(jù)結(jié)束,作業(yè)也結(jié)束了,才將計(jì)算結(jié)果刷入 MySQL,所以沒有實(shí)時的(每條)寫入 MySQL。如下:

為什么Flink無法實(shí)時寫入MySQL

但這里還有個因素需要注意,那就是時間因素,上面 DEFAULT_FLUSH_INTERVAL_MILLS 默認(rèn)值是 0,這個相當(dāng)于沒有時間限制,一直等到 buffer 滿了或者作業(yè)結(jié)束才能觸發(fā)寫出動作。

也就是有些初學(xué)者,發(fā)現(xiàn)問題,即使故意 debug 時候打上斷點(diǎn),不讓作業(yè)結(jié)束,但是等到花兒都謝了,數(shù)據(jù)也沒有寫入到 MySQL。

在 Flink 1.10 中 AbstractJDBCOutputFormat 有兩個實(shí)現(xiàn)類:

為什么Flink無法實(shí)時寫入MySQL

分別對應(yīng)了如下兩類 Sink:

為什么Flink無法實(shí)時寫入MySQL

所以在 Flink 1.10 中不論是 AppendTableSink 和 UpsertTableSink 都會有同樣的問題。不過 UpsertTableSink 時用戶可以設(shè)置時間,而 AppendTableSink 是連時間設(shè)置的入口都木有。

到此,關(guān)于“為什么Flink無法實(shí)時寫入MySQL”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI