業務計算中,我們經常會遇到使用Flink實時計算UV的問題,比如計算一天的實時UV,或者每個小時的UV。
應為UV是需要去重的,再大數據量的情況下,如何使用Flink進行高效的UV統計呢#比如計算一天實時UV
1. windowAll+HashSet大數據量不可行,因為要緩存一天數據,OOM問題隨時會發生
2. keyBy+window+MapState+配置RocksDB轉態存儲可行,只是因為MapState每次都需要變量才能獲取到總數據量大小,效率不高
3. keyBy+window+ValueState+BloomFilter+配置RocksDB轉態存儲,可行,BloomFilter的加入使得計算變得高效,但是BloomFliter有誤判率,不能實現100%精確,但是一般的業務場景,對于實時UV也并非要求100%精確,因此這是一個不錯的選擇.(這里的BloomFilter也可以使用HyperLogLog數據結構,都有誤判率)
4. 將數據存儲到第三方系統,比如Redis或者HBase,之后再統計計算. 在Redis中存儲可用使用bitmap數據結構,空間占用小。
也可以使用HyperLogLog數據結構`(每個 HyperLogLog 鍵只需要花費12 KB 內存,就可以計算接近2^64個不同元素的基數)`,不能保證精確,但是比bitmap數據結構占用空間更小。