1. 程式人生 > >超200萬?約翰斯·霍普金大學資料錯誤!——談談如何保證實時計算資料準確性

超200萬?約翰斯·霍普金大學資料錯誤!——談談如何保證實時計算資料準確性

作為全球新冠疫情資料的實時統計的權威,約翰斯—霍普金斯大學的實時資料一直是大家實時關注的,也是各大媒體的主要資料來源。在今天早上的相當一段長的時間,霍普金斯大學的全球疫情分佈大屏中顯示,全球確診人數已經突破200萬。

有圖有真相

隨後相關媒體也進行了轉發,不過這個資料明顯波動太大,隨後該網站也修改了資料

約翰斯·霍普金斯大學系統科學與工程中心就製作了“全球新冠病毒擴散地圖”,用於實時視覺化和跟蹤報告的病例。於1月22日首次公開。

為了提高資料的實時性,資料的來源通過手動和自動獲取的方式。手動的方式出錯的概率還是很大的,如果我們可以通過實時流獲取資料的方式,就可以避免資料錯誤的問題,這其實是資料從一方到達另一方的資料是否準確的問題,也就是端到端的一致性。

這種訊息傳遞的定義叫做訊息傳遞語義:

我們要了解的是message delivery semantic 也就是訊息傳遞語義。

這是一個通用的概念,也就是訊息傳遞過程中訊息傳遞的保證性。

分為三種:

最多一次(at most once): 訊息可能丟失也可能被處理,但最多隻會被處理一次。

可能丟失 不會重複

至少一次(at least once): 訊息不會丟失,但可能被處理多次。

可能重複 不會丟失

精確傳遞一次(exactly once): 訊息被處理且只會被處理一次。

不丟失 不重複 就一次

那麼我們希望能做到精確傳遞一次(exactly once),雖然可能會付出一些效能的代價。

我們從幾個常見的流計算框架中,看一看都是如何解決端到端的一致性的問題。

1、Kafka

Kafka是最初由Linkedin公司開發,是一個分散式、支援分割槽的(partition)、多副本的(replica),基於zookeeper協調的分散式訊息系統,它的最大的特性就是可以實時的處理大量資料以滿足各種需求場景:比如基於hadoop的批處理系統、低延遲的實時系統、storm/Spark流式處理引擎,web/nginx日誌、訪問日誌,訊息服務等等,用scala語言編寫,Linkedin於2010年貢獻給了Apache基金會併成為頂級開源專案。

而kafka其實有兩次訊息傳遞,一次生產者傳送訊息給kafka,一次消費者去kafka消費訊息。

兩次傳遞都會影響最終結果,

兩次都是精確一次,最終結果才是精確一次。

兩次中有一次會丟失訊息,或者有一次會重複,那麼最終的結果就是可能丟失或者重複的。

一、Produce端訊息傳遞

這是producer端的程式碼:

Properties properties = new Properties();
        properties.put("bootstrap.servers", "kafka01:9092,kafka02:9092");
        properties.put("acks", "all");
        properties.put("retries", 0);
        properties.put("batch.size", 16384);
        properties.put("linger.ms", 1);
        properties.put("buffer.memory", 33554432);
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);
        for (int i = 1; i <= 600; i++) {
            kafkaProducer.send(new ProducerRecord<String, String>("z_test_20190430", "testkafka0613"+i));
            System.out.println("testkafka"+i);
        }
        kafkaProducer.close();

其中指定了一個引數acks 可以有三個值選擇:

0:producer完全不管broker的處理結果 回撥也就沒有用了 並不能保證訊息成功傳送 但是這種吞吐量最高

all或者-1:leader broker會等訊息寫入 並且ISR都寫入後 才會響應,這種只要ISR有副本存活就肯定不會丟失,但吞吐量最低。

1:預設的值 leader broker自己寫入後就響應,不會等待ISR其他的副本寫入,只要leader broker存活就不會丟失,即保證了不丟失,也保證了吞吐量。

所以設定為0時,實現了at most once,而且從這邊看只要保證叢集穩定的情況下,不設定為0,訊息不會丟失。

但是還有一種情況就是訊息成功寫入,而這個時候由於網路問題producer沒有收到寫入成功的響應,producer就會開啟重試的操作,直到網路恢復,訊息就傳送了多次。這就是at least once了。

kafka producer 的引數acks 的預設值為1,所以預設的producer級別是at least once。並不能exactly once。

二、Consumer端訊息傳遞

consumer是靠offset保證訊息傳遞的。

consumer消費的程式碼如下:

Properties props = new Properties();
        props.put("bootstrap.servers", "kafka01:9092,kafka02:9092");
        props.put("group.id", "test");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        
        props.put("auto.offset.reset","earliest");
        
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Arrays.asList("foo", "bar"));
      try{
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(1000);
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
         }
        }finally{
          consumer.close();
        }

其中有一個引數是 enable.auto.commit

若設定為true consumer在消費之前提交位移 就實現了at most once

若是消費後提交 就實現了 at least once 預設的配置就是這個。

kafka consumer的引數enable.auto.commit的預設值為true ,所以預設的consumer級別是at least once。也並不能exactly once。

圖 consumer-groups

三、精確一次

通過了解producer端與consumer端的設定,我們發現kafka在兩端的預設配置都是at least once,肯能重複,通過配置的話呢也不能做到exactly once,好像kafka的訊息一定會丟失或者重複的,是不是沒有辦法做到exactly once了呢?

確實在kafka 0.11.0.0版本之前producer端確實是不可能的,但是在kafka 0.11.0.0版本之後,kafka正式推出了idempotent producer。

也就是冪等的producer還有對事務的支援。

冪等的producer

kafka 0.11.0.0版本引入了idempotent producer機制,在這個機制中同一訊息可能被producer傳送多次,但是在broker端只會寫入一次,他為每一條訊息編號去重,而且對kafka開銷影響不大。

如何設定開啟呢? 需要設定producer端的新引數 enable.idempotent 為true。

而多分割槽的情況,我們需要保證原子性的寫入多個分割槽,即寫入到多個分割槽的訊息要麼全部成功,要麼全部回滾。

這時候就需要使用事務,在producer端設定 transcational.id為一個指定字串。

這樣冪等producer只能保證單分割槽上無重複訊息;事務可以保證多分割槽寫入訊息的完整性。

圖 事務

這樣producer端實現了exactly once,那麼consumer端呢?

consumer端由於可能無法消費事務中所有訊息,並且訊息可能被刪除,所以事務並不能解決consumer端exactly once的問題,我們可能還是需要自己處理這方面的邏輯。比如自己管理offset的提交,不要自動提交,也是可以實現exactly once的。

還有一個選擇就是使用kafka自己的流處理引擎,也就是Kafka Streams,

設定processing.guarantee=exactly_once,就可以輕鬆實現exactly once了。

Apache Flink是由Apache軟體基金會開發的開源流處理框架,其核心是用Java和Scala編寫的分散式流資料流引擎。Flink以資料並行和流水線方式執行任意流資料程式,Flink的流水線執行時系統可以執行批處理和流處理程式。此外,Flink的執行時本身也支援迭代演算法的執行。

我們從flink消費並寫入kafka的例子是如何通過兩部提交來保證exactly-once語義的

為了保證exactly-once,所有寫入kafka的操作必須是事物的。在兩次checkpiont之間要批量提交資料,這樣在任務失敗後就可以將沒有提交的資料回滾。

兩部提交協議的第一步是預提交。flink的jobmanager會在資料流中插入一個檢查點的標記(這個標記可以用來區別這次checkpoint的資料和下次checkpoint的資料)。

這個標記會在整個dag中傳遞。每個dag中的運算元遇到這個標記就會觸發這個運算元狀態的快照。

讀取kafka的運算元,在遇到檢查點標記時會儲存kafka的offset。之後,會把這個檢查點標記傳到下一個運算元。

接下來就到了flink的記憶體操作運算元。這些內部運算元就不用考慮兩部提交協議了,因為他們的狀態會隨著flink整體的狀態來更新或者回滾。

到了和外部系統打交道的時候,就需要兩步提交協議來保證資料不丟失不重複了。在預提交這個步驟下,所有向kafka提交的資料都是預提交。

當所有運算元的快照完成,也就是這次的checkpoint完成時,flink的jobmanager會向所有運算元發通知說這次checkpoint完成,flink負責向kafka寫入資料的運算元也會正式提交之前寫操作的資料。在任務執行中的任何階段失敗,都會從上一次的狀態恢復,所有沒有正式提交的資料也會回滾。

總結一下flink的兩步提交:

​ 當所有運算元都完成他們的快照時,進行正式提交操作

​ 當任意子任務在預提交階段失敗時,其他任務立即停止,並回滾到上一次成功快照的狀態。

​ 在預提交狀態成功後,外部系統需要完美支援正式提交之前的操作。如果有提交失敗發生,整個flink應用會進入失敗狀態並重啟,重啟後將會繼續從上次狀態來嘗試進行提交操作。

這樣flink就通過狀態和兩次提交協議來保證了端到端的exactly-once語義。

更多大資料,實時計算相關博文與科技資訊,歡迎搜尋或者掃描下方關注 “實時流式計算”

相關推薦

200&#183;大學資料錯誤——談談如何保證實時計算資料準確性

作為全球新冠疫情資料的實時統計的權威,約翰斯—霍普金斯大學的實時資料一直是大家實時關注的,也是各大媒體的主要資料來源。在今天早上的相當一段長的時間,霍普金斯大學的全球疫情分佈大屏中顯示,全球確診人數已經突破200萬。 有圖有真相 隨後相關媒體也進行了轉發,不過這個資料明顯波動太大,隨後該網站也修改了資料

【DataScience學習筆記】Coursera課程《數據科學家的工具箱》 大學——Week2 Installing the Toolbox課堂筆記

repos terminal gin 是把 系統 cal director down 哪些 Coursera課程《數據科學家的工具箱》 約翰霍普金斯大學 Week2 Installing the Toolbox Command Line Interface 基本上現在的每臺

【DataScience學習筆記】Coursera課程《數據科學家的工具箱》 大學——Week3 Conceptual Issues課堂筆記

性別 有序 進行 有助於 variables -i -o 維基 enc Coursera課程《數據科學家的工具箱》 約翰霍普金斯大學 Week3 Conceptual Issues Types of Questions Types of Data Science Quest

·大學召開腦科學大會

歐美已率先“發兵”,將腦研究提升到國家戰略層面蒲慕明說,中國的腦科學研究過去20年才開始真正起步。美國神經科學學會成員有五、六萬人,而中國的神經科學學會成員只有六千人左右,這是十倍以上的差距。中國也只有少數實驗室在神經科學領域具備國際競爭力,研究人員偏年輕化,本領域領軍人物較少,仍需多年積累。“基於現實層面的

百度推薦~『辦理利物浦莫爾大學畢業證』原件一模一樣證書

新的 多少 包含 陌生 他還 速度 但是 ken 專業 辦理利物浦約翰莫爾斯大學畢業證 【微/Q:9798 3838——WeChat:9798 3838】【帖子永久有效,看不到請點擊百度快照】聯系人Allen【辦理畢業證,成績單,學歷認證、文憑、學位證、成績單等】代辦國外(

高速電路設計實踐PDF,高速數字設計PDF-華德-遜,高速電路設計與模擬分析Cadence例項設計詳解

今天給大家推薦三本關於高速電路設計的書籍,《高速電路設計實踐》《高速數字設計》《高速電路設計與模擬分析Cadence例項設計詳解》,第一本出自國內作者的一本好書,書中很多技術點都講的非常細緻,同時例舉了例項; 第二本為國外作者霍華德-約翰遜,深入淺出的講解了高速電路設計中應該注意的各種

性感天才黑客喬治&#183;茲George Hotz 17歲打臉喬布20歲搞瘋索尼

負責人 baidu span href 影響 五一 人工 inf 民間 1.國內外著名黑客信息 1) 國外著名黑客 George Hotz 喬治·霍茲(George Hotz,1989年10月2日-),美國學生,2007年8月解鎖蘋果(Apple)iPhone手機,使得i

[BZOJ1022][SHOI2008]小的遊戲John

獲得 ++ style int gre div for 單詞 std 1022: [SHOI2008]小約翰的遊戲John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2892 Solved: 1836[Submit][

用戶流失200、資金池疑似見了底,摩拜靠什麽拿到下一輪融資?

共享單車摩拜單車是不是越來越少了?這是筆者最近幾個月以來心裏最大的一個問號。在筆者居住的北京街頭,現在已經很難再尋到那一抹橙色了。出了地鐵,排成一溜給你帶來出行便捷的幸福感的單車,不是橙色;走在街上,從你身邊不時穿過的單車用戶們蹬著的,橙色不是主流;好不容易找到了一片橙色摩拜的聚集地,又連著幾輛都掃不開……本

[SHOI2008]小的遊戲John

span input 選擇 str bsp 應該 ios color div Description   小約翰經常和他的哥哥玩一個非常有趣的遊戲:桌子上有n堆石子,小約翰和他的哥哥輪流取石子,每個人取 的時候,可以隨意選擇一堆石子,在這堆石子中取走任意多的石子,但

BZOJ 1022: [SHOI2008]小的遊戲John (Anti-nim)

ant 所有 之前 自然 i++ page urn pen status Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 2003[Submit][Status][Discuss] Descript

1022: [SHOI2008]小的遊戲John9(Auti_SG)

style log script 一行 組成 spa std Go turn 1022: [SHOI2008]小約翰的遊戲John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3150 Solved: 2013[Su

bzoj1022: [SHOI2008]小的遊戲John(博弈SG-nim遊戲)

mat flag enter int ans problem blank 入門題 pos 1022: [SHOI2008]小約翰的遊戲John 題目:傳送門 題目大意:    一道反nim遊戲,即給出n堆石子,每次可以取完任意一堆或一堆中的若幹個(至少取1),最後一

畢業真實的版本=#「利物浦摩爾大學畢業證書」LJMU原件一模一樣證書

同學 收費 雅思 灰色 通知書 百度快照 ini art 不清楚 利物浦約翰摩爾大學畢業證書【微/Q:211491711◆WeChat:Asa211491711】CSU畢業證書/聯系人Asa[查看點擊百度快照查看]【學歷認證、文憑、學位證、成績單等】代辦國外(海外)澳洲英國

MaxCompute助力ofo實現精細化運營:日訂單3200、整體運行效率提升76%

數據庫摘要:ofo小黃車大數據BI系統負責人龍利民為大家分享了ofo的上雲體驗,重點分享了MaxCompute的應用實踐,最後對阿裏雲提出了自己的建議需求。 關於ofo小黃車 共享經濟不僅與技術相關,它還關乎人類共同命運,關乎可持續發展。 原文地址:http://click.aliyun.com/m/4396

[Bzoj1022][SHOI2008]小的遊戲John(博弈論)

pan submit 博弈論 取數 n) 比賽 bmi http bbs 1022: [SHOI2008]小約翰的遊戲John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2976 Solved: 1894

《刻意練習》 如何從新手到大師 安德&#183;艾利克森 羅伯特&#183;爾 著

改變 世界 人的 自己 進行 前景 通過 自動 之間 001 引言 天才存在嗎 我們的大鬧擁有和莫紮特這樣的“天才”相同的適應能力,“天才”只是更多地利用了這種適應能力。 莫紮特的完美音高 “天才”是訓練的產物 本書將告訴我們什麽 017 第1章 有目的的練習 一旦某個

【bzoj1022】小的遊戲John

https tps problem names href else ace other -- Portal -->bzoj1022 Solution ?  ?這題其實是裸的反Nim,這裏主要是為了寫反Nim遊戲的證明 ?  ?首先給出反Nim(anti-nim)的定義

菁優網(jyeoo.com)題庫數據(題目數據102組題數據2100含圖片)

ger blank 試題 csv 密碼 tom .data 內容 ica 本文原創作者:數據超市(http://www.data-shop.net)本文原始鏈接:http://www.data-shop.net/2016/03/jyeoo_com_20160321/數據說明

【BZOJ1022】小的遊戲(博弈論)

get pan gist ref pac namespace lib ble () 【BZOJ1022】小約翰的遊戲(博弈論) 題面 BZOJ 題解 \(Anti-SG\)遊戲的模板題目。 #include<iostream> #include<cstdi