国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 海量數(shù)據(jù)實時去重

這篇具有很好參考價值的文章主要介紹了大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 海量數(shù)據(jù)實時去重。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大數(shù)據(jù)|阿里實時計算|Flink

一、海量數(shù)據(jù)實時去重說明

借助redis的Set,需要頻繁連接Redis,如果數(shù)據(jù)量過大, 對redis的內(nèi)存也是一種壓力;使用Flink的MapState,如果數(shù)據(jù)量過大, 狀態(tài)后端最好選擇 RocksDBStateBackend; 使用布隆過濾器,布隆過濾器可以大大減少存儲的數(shù)據(jù)的數(shù)據(jù)量。

二、海里書實時去重為什么需要布隆過濾器

如果想判斷一個元素是不是在一個集合里,一般想到的是將集合中所有元素保存起來,然后通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數(shù)據(jù)結(jié)構(gòu)都是這種思路。
但是隨著集合中元素的增加,我們需要的存儲空間越來越大。同時檢索速度也越來越慢,上述三種結(jié)構(gòu)的檢索時間復(fù)雜度分別為。
布隆過濾器即可以解決存儲空間的問題, 又可以解決時間復(fù)雜度的問題.
布隆過濾器的原理是,當一個元素被加入集合時,通過K個散列函數(shù)將這個元素映射成一個位數(shù)組中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。

三、布隆過濾基本概念

布隆過濾器(Bloom Filter,下文簡稱BF)由Burton Howard Bloom在1970年提出,是一種空間效率高的概率型數(shù)據(jù)結(jié)構(gòu)。它專門用來檢測集合中是否存在特定的元素。
它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。

實現(xiàn)原理
布隆過濾器的原理是,當一個元素被加入集合時,通過K個散列函數(shù)將這個元素映射成一個位數(shù)組中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。
BF是由一個長度為m比特的位數(shù)組(bit array)與k個哈希函數(shù)(hash function)組成的數(shù)據(jù)結(jié)構(gòu)。位數(shù)組均初始化為0,所有哈希函數(shù)都可以分別把輸入數(shù)據(jù)盡量均勻地散列。
當要插入一個元素時,將其數(shù)據(jù)分別輸入k個哈希函數(shù),產(chǎn)生k個哈希值。以哈希值作為位數(shù)組中的下標,將所有k個對應(yīng)的比特置為1。
當要查詢(即判斷是否存在)一個元素時,同樣將其數(shù)據(jù)輸入哈希函數(shù),然后檢查對應(yīng)的k個比特。如果有任意一個比特為0,表明該元素一定不在集合中。如果所有比特均為1,表明該集合有(較大的)可能性在集合中。為什么不是一定在集合中呢?因為一個比特被置為1有可能會受到其他元素的影響(hash碰撞),這就是所謂“假陽性”(false positive)。相對地,“假陰性”(false negative)在BF中是絕不會出現(xiàn)的。
下圖示出一個m=18, k=3的BF示例。集合中的x、y、z三個元素通過3個不同的哈希函數(shù)散列到位數(shù)組中。當查詢元素w時,因為有一個比特為0,因此w不在該集合中。
大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 海量數(shù)據(jù)實時去重,大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-FLINK,flink,大數(shù)據(jù),sql

優(yōu)點
1.不需要存儲數(shù)據(jù)本身,只用比特表示,因此空間占用相對于傳統(tǒng)方式有巨大的優(yōu)勢,并且能夠保密數(shù)據(jù);
2.時間效率也較高,插入和查詢的時間復(fù)雜度均為, 所以他的時間復(fù)雜度實際是
3.哈希函數(shù)之間相互獨立,可以在硬件指令層面并行計算。
缺點
1.存在假陽性的概率,不適用于任何要求100%準確率的情境;
2.只能插入和查詢元素,不能刪除元素,這與產(chǎn)生假陽性的原因是相同的。我們可以簡單地想到通過計數(shù)(即將一個比特擴展為計數(shù)值)來記錄元素數(shù),但仍然無法保證刪除的元素一定在集合中。
使用場景
所以,BF在對查準度要求沒有那么苛刻,而對時間、空間效率要求較高的場合非常合適.
另外,由于它不存在假陰性問題,所以用作“不存在”邏輯的處理時有奇效,比如可以用來作為緩存系統(tǒng)(如Redis)的緩沖,防止緩存穿透。
假陽性概率的計算
假陽性的概率其實就是一個不在的元素,被k個函數(shù)函數(shù)散列到的k個位置全部都是1的概率。可以按照如下的步驟進行計算: p = f(m,n,k)
其中各個字母的含義:
1.n :放入BF中的元素的總個數(shù);
2.m:BF的總長度,也就是bit數(shù)組的個數(shù)
3.k:哈希函數(shù)的個數(shù);
4.p:表示BF將一個不在其中的元素錯判為在其中的概率,也就是false positive的概率;
A.BF中的任何一個bit在第一個元素的第一個hash函數(shù)執(zhí)行完之后為 0的概率是:

B.BF中的任何一個bit在第一個元素的k個hash函數(shù)執(zhí)行完之后為 0的概率是:

C.BF中的任何一個bit在所有的n元素都添加完之后為 0的概率是:

D.BF中的任何一個bit在所有的n元素都添加完之后為 1的概率是:

E.一個不存在的元素被k個hash函數(shù)映射后k個bit都是1的概率是:

結(jié)論:在哈數(shù)函數(shù)個數(shù)k一定的情況下
1.比特數(shù)組m長度越大, p越小, 表示假陽性率越低
2.已插入的元素個數(shù)n越大, p越大, 表示假陽性率越大
經(jīng)過各種數(shù)學(xué)推導(dǎo):
對于給定的m和n,使得假陽性率(誤判率)最小的k通過如下公式定義:

四、使用布隆過濾器實現(xiàn)去重

Flink已經(jīng)內(nèi)置了布隆過濾器的實現(xiàn)(使用的是google的Guava)文章來源地址http://www.zghlxwxcb.cn/news/detail-728547.html

package com.lyh.flink12;

import com.atguigu.flink.java.chapter_6.UserBehavior;
import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flin

到了這里,關(guān)于大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 海量數(shù)據(jù)實時去重的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink RedisSink

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink RedisSink

    具體版本根據(jù)實際情況確定 參見大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Redis 安裝與使用 可以根據(jù)要寫入的redis的不同數(shù)據(jù)類型進行調(diào)整

    2024年02月13日
    瀏覽(16)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink窗口函數(shù)

    前面指定了窗口的分配器, 接著我們需要來指定如何計算, 這事由window function來負責. 一旦窗口關(guān)閉, window function 去計算處理窗口中的每個元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一種. ReduceFunction,AggregateFunction更加高效, 原因就是Flink可以對

    2024年02月11日
    瀏覽(38)
  • 【Flink】 Flink實時讀取mysql數(shù)據(jù)

    準備 你需要將這兩個依賴添加到 pom.xml 中 mysql mysql-connector-java 8.0.0 讀取 kafka 數(shù)據(jù) 這里我依舊用的以前的 student 類,自己本地起了 kafka 然后造一些測試數(shù)據(jù),這里我們測試發(fā)送一條數(shù)據(jù)則 sleep 10s,意味著往 kafka 中一分鐘發(fā) 6 條數(shù)據(jù)。 package com.zhisheng.connectors.mysql.utils; impo

    2024年02月03日
    瀏覽(15)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink定時器

    基于處理時間或者事件時間處理過一個元素之后, 注冊一個定時器, 然后指定的時間執(zhí)行. Context和OnTimerContext所持有的TimerService對象擁有以下方法: currentProcessingTime(): Long 返回當前處理時間 currentWatermark(): Long 返回當前watermark的時間戳 registerProcessingTimeTimer(timestamp: Long): Unit 會注

    2024年02月10日
    瀏覽(20)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink惡意登錄監(jiān)控

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink惡意登錄監(jiān)控

    對于網(wǎng)站而言,用戶登錄并不是頻繁的業(yè)務(wù)操作。如果一個用戶短時間內(nèi)頻繁登錄失敗,就有可能是出現(xiàn)了程序的惡意攻擊,比如密碼暴力破解。 因此我們考慮,應(yīng)該對用戶的登錄失敗動作進行統(tǒng)計,具體來說,如果同一用戶(可以是不同IP)在2秒之內(nèi)連續(xù)兩次登錄失敗,就

    2024年02月07日
    瀏覽(14)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink狀態(tài)編程(上)

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink狀態(tài)編程(上)

    有狀態(tài)的計算是流處理框架要實現(xiàn)的重要功能,因為稍復(fù)雜的流處理場景都需要記錄狀態(tài),然后在新流入數(shù)據(jù)的基礎(chǔ)上不斷更新狀態(tài)。 SparkStreaming在狀態(tài)管理這塊做的不好, 很多時候需要借助于外部存儲(例如Redis)來手動管理狀態(tài), 增加了編程的難度。 Flink的狀態(tài)管理是它的優(yōu)

    2024年02月09日
    瀏覽(92)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink時間滾動動窗口

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink時間滾動動窗口

    在流處理應(yīng)用中,數(shù)據(jù)是連續(xù)不斷的,因此我們不可能等到所有數(shù)據(jù)都到了才開始處理。當然我們可以每來一個消息就處理一次,但是有時我們需要做一些聚合類的處理,例如:在過去的1分鐘內(nèi)有多少用戶點擊了我們的網(wǎng)頁。在這種情況下,我們必須定義一個窗口,用來收集

    2024年02月11日
    瀏覽(22)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink狀態(tài)后端(下)

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink狀態(tài)后端(下)

    每傳入一條數(shù)據(jù),有狀態(tài)的算子任務(wù)都會讀取和更新狀態(tài)。由于有效的狀態(tài)訪問對于處理數(shù)據(jù)的低延遲至關(guān)重要,因此每個并行任務(wù)(子任務(wù))都會在本地維護其狀態(tài),以確保快速的狀態(tài)訪問。 狀態(tài)的存儲、訪問以及維護,由一個可插入的組件決定,這個組件就叫做狀態(tài)后端(

    2024年02月09日
    瀏覽(21)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink-Transform

    大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink-Transform

    轉(zhuǎn)換算子可以把一個或多個DataStream轉(zhuǎn)成一個新的DataStream.程序可以把多個復(fù)雜的轉(zhuǎn)換組合成復(fù)雜的數(shù)據(jù)流拓撲. 2.1、map(映射) 將數(shù)據(jù)流中的數(shù)據(jù)進行轉(zhuǎn)換, 形成新的數(shù)據(jù)流,消費一個元素并產(chǎn)出一個元素 2.2、filter(過濾) 根據(jù)指定的規(guī)則將滿足條件(true)的數(shù)據(jù)保留,不

    2024年02月13日
    瀏覽(18)
  • 大數(shù)據(jù)-玩轉(zhuǎn)數(shù)據(jù)-Flink 網(wǎng)站UV統(tǒng)計

    在實際應(yīng)用中,我們往往會關(guān)注,到底有多少不同的用戶訪問了網(wǎng)站,所以另外一個統(tǒng)計流量的重要指標是網(wǎng)站的獨立訪客數(shù)(Unique Visitor,UV)。 對于UserBehavior數(shù)據(jù)源來說,我們直接可以根據(jù)userId來區(qū)分不同的用戶。 將userid放到SET集合里面,統(tǒng)計集合長度,便可以統(tǒng)計到網(wǎng)

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包