flink写入hive的时区问题
概述
本文主要對(duì)[3]進(jìn)行復(fù)現(xiàn)和闡述
環(huán)境版本
| 組件 | 版本 |
| Hadoop | 3.1.2 |
| Hive | 2.3.6 |
| Flink | 1.12.0 |
| Zookeeper | 3.6.0 |
#####################################################################################################################
本文流水線觸發(fā)條件
我們目前接觸到的有下面兩種:
| 環(huán)境 | 觸發(fā)計(jì)算條件(為了方便論述,這里忽略遲到數(shù)據(jù)等) |
| watermark寫入hive分區(qū) | watermark?>?toMills(partTime)?+?commitDelay |
| watermark與window計(jì)算[4] | watermark >= window_end_time? |
本文論述的是第一種
百度上常見(jiàn)的是表格中第二種
#####################################################################################################################
時(shí)區(qū)機(jī)制
Flink源碼中的toMills并不是jdk中的
java.time.Duration.toMillis()
兩者不是一個(gè)東西,不要搞混.
?
上述表格中的toMills會(huì)把傳入的創(chuàng)建hive分區(qū)的時(shí)間戳partTime誤當(dāng)做UTC時(shí)間(作為輸入),
然后+8小時(shí)轉(zhuǎn)化為東八區(qū)的時(shí)間toMills(partTime).
整理如下:
| ? | 使用的數(shù)據(jù)來(lái)自 | 被Flink誤當(dāng)做 | 進(jìn)一步轉(zhuǎn)化為 |
| watermark | 東八區(qū) | UTC時(shí)區(qū) | 無(wú) |
| partTime(創(chuàng)建hive分區(qū)的時(shí)間) | 東八區(qū) | UTC時(shí)區(qū) | toMills(partTime)=partTime+8:00 |
所以這就尷尬了,時(shí)區(qū)失配,導(dǎo)致無(wú)案發(fā)觸發(fā)Partition Commit(講人話就是Flink已經(jīng)寫入Sink的數(shù)據(jù)在Hive中看不到).
場(chǎng)景舉例:
16:23:48我新建了一個(gè)hive表(當(dāng)然也就等于是新建了hive分區(qū))
16:26:25時(shí)我去hive表格中查看數(shù)據(jù),結(jié)果一條都沒(méi)有.
為啥呢?
根據(jù)上述表格,我建立hive中表格fs_table的時(shí)間,被flink加了8小時(shí),需要當(dāng)前寫入的數(shù)據(jù)的時(shí)間戳生成的watermark
大于0:23:48(16:23:48+8:00)以后才能看到
因?yàn)闆](méi)有滿足表格中的水位線觸發(fā)條件,所以無(wú)法觸發(fā)Hive的Partition Commit,
最終導(dǎo)致一個(gè)奇怪的現(xiàn)象:
Flink明明已經(jīng)寫入Sink的數(shù)據(jù),在Hive的fs_table中看不到
#####################################################################################################################
實(shí)驗(yàn)驗(yàn)證
口說(shuō)無(wú)憑,我們來(lái)做一個(gè)對(duì)照實(shí)驗(yàn)
| 步驟 | 實(shí)驗(yàn)組 | 對(duì)照組 | 備注 |
| ① | 創(chuàng)建Hive表格fs_table | 創(chuàng)建Hive表格fs_table | ? |
| ② | 運(yùn)行StreamingWriteHive_bug.java | 運(yùn)行StreamingWriteHive.java | 對(duì)照組的水印加了8小時(shí) |
| ③ | select * from fs_table; | select * from fs_table; | ? |
| ④ | Hive的fs_table中無(wú)結(jié)果 | Hive的fs_table中一大堆結(jié)果 | ? |
?
#####################################################################################################################
?
Reference:
[1]Hive分區(qū)和分桶區(qū)別
[2]重要|flink的時(shí)間及時(shí)區(qū)問(wèn)題解決
[3]flink教程-flink 1.11 使用sql將流式數(shù)據(jù)寫入hive
[4]Flink EventTime和Watermarks原理結(jié)合代碼分析(轉(zhuǎn)載+解決+精簡(jiǎn)記錄)
[5]踩坑記 | Flink 天級(jí)別窗口中存在的時(shí)區(qū)問(wèn)題
[6]Hive創(chuàng)建二級(jí)分區(qū)表
總結(jié)
以上是生活随笔為你收集整理的flink写入hive的时区问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 和平精英哥斯拉在哪
- 下一篇: AppendStream和Retract