離線計算中的冪等和DataWorks中的相關事項

摘要: 概念 冪等這個詞在軟件研發中常常被提到。好比消息發送時不該該同時給同個用戶推送屢次相同的消息,針對同一筆交易的付款也不該該在重試過程當中扣屢次錢。曾見過一個案例,有個對於一個單據的確認模塊沒有考慮到冪等性,致使對應的單據有兩條確認記錄。運維

點此查看原文:http://click.aliyun.com/m/42758/異步

概念分佈式

冪等這個詞在軟件研發中常常被提到。好比消息發送時不該該同時給同個用戶推送屢次相同的消息,針對同一筆交易的付款也不該該在重試過程當中扣屢次錢。曾見過一個案例,有個對於一個單據的確認模塊沒有考慮到冪等性,致使對應的單據有兩條確認記錄。其實冪等這個詞是個數學的概念,表示這個操做執行屢次的結果和執行一次是徹底同樣的。嚴格的定義這裏不展開討論,有興趣的能夠到網上搜一下,會有不少介紹。通俗一些說,冪等表示這個操做能夠屢次重跑,不用擔憂重跑後到結果會亂掉。就賦值而言,i=1就是個冪等到操做,不管作多少次賦值,只要有作成功一次,i的值就是1。而i++就不是一個冪等的操做。若是屢次執行這個操做,i的值會不斷增長1。網站

從前面的例子也能夠看出,冪等的優點是能夠屏蔽重試帶來的問題。在分佈式的環境裏,通常會經過消息中間件、異步調用等方式實現服務之間的解耦。在這過程當中,如出現系統異常情況下的狀態不明確的狀況,通常會進行重試。若是應用不知足冪等的要求,則就會出現錯誤的結果。spa

離線計算與冪等日誌

離線計算裏的一個做業常常是很是重的,跑一個做業要較多時間。並且因爲其特性,常常是凌晨開始計算,在OLTP業務調用量上來之前須要產出結果。若是發現問題,常常沒有太多的時間留給技術人員去詳細定位問題的緣由,而後清理髒數據後從新進行計算。這時候咱們須要計算可以進行任意次的重跑,也就是說計算須要知足冪等性。對於一個知足冪等性要求的做業,出現問題的時候,咱們能夠首先先重跑一下做業,以期能儘快恢復業務,後續再根據以前的日誌慢慢定位問題。下面咱們以MaxCompute+ DataWorks爲例,從不一樣的角度裏討論離線計算的典型場景——離線數倉,看看都有哪些地方須要作到冪等以及如何作到。中間件

計算圖片

目前的離線計算,出於開發的效率考慮,通常都會考慮使用SQL進行代碼開發。SQL裏包含DDL和DML兩種語句。除了SQL,計算引擎通常還支持MapReduce、Graph等計算模型。開發

DDL
DDL語法能夠經過語句裏的if exists/if not exists來確保冪等性。好比建立表能夠用create table if not exists xxx,刪除表能夠經過drop table if exists xxx來保證不報錯並且能夠重複執行。固然建立表也能夠先刪除後再建立來事先冪等性。誠然,若是是建表這種「一次性」的操做能夠在上線的時候手工作好,可是平常的分區建立/刪除等操做就須要經過寫進代碼裏,經過if exists/if not exists來保證能夠重試。rem

DML
DML對數據有影響的是Insert操做。目前Insert有兩種模式:Insert into和Insert overwrite。其中Insert into是把數據追加到原來的數據裏,而Insert overwrite是把之前的數據直接覆蓋。因此能夠清楚得看到,Insert into是不知足冪等性要求的,而Insert overwrite是知足的。若是使用Dataworks的SQL節點跑一個Insert into的做業,會有提示

!!!警告!!!
在SQL中使用insert into語句有可能形成不可預料的數據重複,儘管對於insert into語句已經取消SQL級別的重試,但仍然存在進行任務級別重試的可能性,請儘可能避免對insert into語句的使用!

我也曾去了解一些使用Insert into的用戶,要使用這種數據更新方式的緣由,除去數據訂正,發現通常都是針對一些不會變化的數據(好比網站的日誌、天天的統計結果等)天天須要追加到表裏。其實這種更好的方法是建立一個分區表,把天天須要Insert into的數據改爲Insert overwrite到天天的一個不一樣分區裏。

MapReduce
MapReduce默認就是使用覆蓋寫入的模式的。若是確實有須要追加寫入,可使用com.aliyun.odps.mapred.conf.JobConf的setOutputOverwrite(boolean isOverwrite)來實現。
若是須要改爲冪等的,可使用前面SQL裏提到的,把數據寫入特定的分區裏來實現。

ETL
ETL咱們暫時不考慮數據清洗(通常數據清洗是經過計算來實現的),而這隻討論數據的同步。在Dataworks裏,數據的同步經過數據集成模塊來實現。在數倉中,數據同步包括數據導入到數倉和數據從數倉中導出兩種場景。

數據導入的場景要實現冪等性比較容易。只須要設置導入的MaxCompute表的清洗規則爲「寫入前清理已有數據Insert Overwr」便可。這樣數據在導入的過程當中會先清空數據後再導入,從而實現冪等。

圖片描述

數據導出的場景,若是數據是全量導出的,也能夠用相似數據導入的方法,配置「導入前準備語句」,把原來的數據所有刪除後從新導入。另外若是數據源支持主鍵衝突設置時,能夠經過「主鍵衝突」設置成「Replace Into」來實現數據的替換。

圖片描述

從上面的截圖裏能夠看到,目前Dataworks自己就支持設置「出錯重試」,若是同步做業知足冪等性要求的,能夠大膽開啓這個設置,從而下降運維成本提升穩定性。

掃碼獲取更多資訊:
圖片描述

相關文章
相關標籤/搜索