A. 資料庫物理結構中,存儲著哪幾種形式的數據結構
Log File物理結構
log block結構分為日誌頭段、日誌記錄、日誌尾部
Block Header,佔用12位元組
Data部分
Block tailer,佔用4位元組
Block Header
這個部分是每個Block的頭部,主要記錄的塊的信息
Block Number,表示這是第幾個block,佔用4位元組,是通過LSN計算得來的,佔用4位元組
Block data len,表示該block中有多少位元組已經被使用了,佔用2位元組
First Rec offet,表示該block中作為第一個新的mtr開始的偏移量,佔用2位元組
Checkpoint number,表示該log block最後被寫入時的檢查點的值,佔用4位元組
B. checkpoint是什麼意思啊拜託各位大神
CheckPoint 1. Check Point 軟體技術有限公司 Check Point 軟體技術有限公司成立時間於 1993 年,美國總部在加利福尼亞州紅木城,國際總部在以色列萊莫干市,員工人數: 1180 多人。 是全球首屈一指的 Internet 安全解決方案供應商,在全球企業防火牆、個人防火牆及虛擬專用網路( VPN )市場上居於領導地位。 Check Point 軟體技術有限公司的安全虛擬網路( SVN )體系結構可提供支持安全、可靠的網際網路通信的基礎設施。通過網際網路、 Intranet 和 Extranet , SVN 可確保網路、系統、應用和用戶之間的安全通信。在公司的 「Next Generation」 產品系列中發布的 SVN 解決方案,進一步加強了公司網路、遠程員工、辦事處以及合作夥伴外部網的業務通信和資源的安全。 Check Point 公司的安全性開放式平台( OPSEC )可提供一個先進的框架, 它使得 Check Point 的解決方案能夠與 350 多家領先企業的卓越解決方案集成及協同工作。此外, Check Point 通過遍布 88 個國家及地區的 2,200 多家合作夥伴銷售及集成其解決方案,同時提供相關服務。 企業級防火牆 /VPN 網關 – VPN-1 Pro Check Point VPN-1 Pro 是緊密集成的防火牆和 VPN 網關,為企業應用程序和網路資源提供全面的安全和遠程連接。 VPN-1 Pro 將市場領先的FireWall-1 安全套件與久經考驗的 VPN 技術結合在一起,通過提供到企業網路、遠程用戶和移動用戶、分支機構、業務合作夥伴的安全連接,滿足了互聯網、內聯網和外聯網 VPNs 的嚴格需求。它具有行業最智能的安全檢測技術、 Stateful Inspection 和 Application IntelligenceTM,為阻止網路層和應用層攻擊提供了預先的防禦機制。 VPN-1 Pro 解決方案可用在業界最廣泛的開放式平台和安全設備之上,可以滿足任何規模企業的性價比需求。 虛擬防火牆– VPN-1 VSX VPN-1 VSXT是一種為諸如數據中心和園區網等大型企業環境設計的高速、多策略虛擬安全解決方案。基於經過實踐證明的安全解決方案, VPN-1 Pro , VSX 可以為復雜基礎架構中的多個網路提供綜合全面的保護,幫助它們安全的連接到互聯網和 DMZ 等共享的資源,並且實現了在提供集中管理的同時允許它們之間進行安全互動。 VSX 網關利用一台硬體設備就可以幫助各單位創建一個包括路由器、交換機和 VPN-1 網關的復雜、虛擬的網路。這種解決方案替換和改造負責安全保護和聯網的物理設備,減少了為整個網路提供安全保障所需的硬體投入。目前,只有 VSX 提供的平台才實現了高可擴展性、虛擬化網路,以及可以被輕松部署和管理的安全服務。 集中管理– SmartCenter 和 SmartCenter Pro SmartCenter 是基於目前業界最一致、最強大的管理架構,安全管理架構( SMART )的基礎之上。它支持企業集中定義邊界、內部和 Web 的安全策略;關聯和優化安全事件;實施高級的監視和報告功能——這一切都通過一個控制台來實現。在所有網關分配安全策略升級變得很簡單,從而確保一致的策略實施並提高運營效率。這樣,企業能保護對業務關鍵的資產並實現它們在安全方面投資的最大化。 SmartCenter 解決方案提供了功能強大的軟體工具來集中配置、管理和監視多個 Check Point 網關和執行點。它們包括一個類似儀表盤的界面來集中定義 VPN 、防火牆和服務質量( quality-of-service )的策略以及一台管理伺服器來存儲這些策略。 終端安全 – Integrity Integrity 可以確保您的企業網路免受惡意代碼或者目標攻擊的入侵。在為每個網路終端提供主動防禦的同時,它還提供了集中式策略管理和實施。 Integrity 使您可以為每台接入網路的電腦輕松開發、管理和實施無與倫比的安全方案,從而提供全面的接入保護。在保持 IT 部門和終端用戶生產能力的同時, Integrity 的保護功能可以恢復企業數據和關鍵系統的保密性、完整性和有效性。 Integrity 客戶端和伺服器軟體通過集中管理的主動保護以及策略實施的一致性檢查確保所有聯網計算機的安全。 官方網址: http://www.checkpoint.com.cn/ SQL SEVER中 CHECKPOINT 語法如下: CHECKPOINT CHECKPOINT 命令用於將當前工作的資料庫中被更改過的數據頁data page 或日誌頁(log page)從數據緩沖器(data buffer cache)中強制寫入硬碟。 2. ORACLE 中的 checkpoint checkpoint是什麼? checkpoint是的一個內部事件,這個事件激活以後會觸發資料庫寫進程(DBWR)將數據緩沖( DATA BUFFER CACHE)中的臟數據塊寫出到數據文件中。 在資料庫系統中,寫日誌和寫數據文件是資料庫中IO消耗最大的兩種操作,在這兩種操作中寫數據文件屬於分散寫,寫日誌文件是順序寫,因此為了保證資料庫的性能,通常資料庫都是保證在提交(commit)完成之前要先保證日誌都被寫入到日誌文件中,而臟數據塊著保存在數據緩存(buffer cache)中再不定期的分批寫入到數據文件中。也就是說日誌寫入和提交操作是同步的,而數據寫入和提交操作是不同步的。這樣就存在一個問題,當一個資料庫崩潰的時候並不能保證緩存裡面的臟數據全部寫入到數據文件中,這樣在實例啟動的時候就要使用日誌文件進行恢復操作,將資料庫恢復到崩潰之前的狀態,保證數據的一致性。檢查點是這個過程中的重要機制,通過它來確定,恢復時哪些重做日誌應該被掃描並應用於恢復。 一般所說的checkpoint是一個資料庫事件(event),checkpoint事件由checkpoint進程(LGWR/CKPT進程)發出,當checkpoint事件發生時DBWn會將臟塊寫入到磁碟中,同時數據文件和控制文件的文件頭也會被更新以記錄checkpoint信息。 checkpoint的作用 checkpoint主要2個作用: 保證資料庫的一致性,這是指將臟數據寫入到硬碟,保證內存和硬碟上的數據是一樣的; 縮短實例恢復的時間,實例恢復要把實例異常關閉前沒有寫出到硬碟的臟數據通過日誌進行恢復。如果臟塊過多,實例恢復的時間也會很長,檢查點的發生可以減少臟塊的數量,從而提高實例恢復的時間。 通俗的說checkpoint就像word的自動保存一樣。 檢查點分類 完全檢查點(Normal checkpoint) 增量檢查點(Incremental checkpoint) checkpoint相關概念術語 在說明checkpoint工作原理之前我們先了解一些相關的術語。 完全檢查點工作過程 一個checkpoint操作可以分成三個不同的階段: 第一階段,checkpoint進程開始一個checkpoint事件,並記錄下checkpoint RBA,這個通常是當前的RBA。 第二階段,checkpoint進程通知DBWn進程將所有checkpoint RBA之前的buffer cache裡面的臟塊寫入磁碟。 確定臟塊都被寫入磁碟以後進入到第三階段,checkpoint進程將checkpoint信息(SCN)寫入/更新數據文件和控制文件中。 更新SCN的操作由CKPT進程完成,在Oracle 8.0之後CKPT進程默認是被啟用的,如果CKPT進程沒有啟用的話那相應的操作將由LGWR進程完成。 什麼時候發生normal checkpoint 下面這些操作將會觸發checkpoint事件: 日誌切換,通過ALTER SYSTEM SWITCH LOGFILE。 DBA發出checkpoint命令,通過ALTER SYSTEM checkpoint。 對數據文件進行熱備時,針對該數據文件的checkpoint也會進行,ALTER TABLESPACE TS_NAME BEGIN BACKUP/END BACKUP。 當運行ALTER TABLESPACE/DATAFILE READ ONLY的時候。 SHUTDOWN命令發出時。 特別注意: 日誌切換會導致checkpoint事件發生,但是checkpoint發生卻不會導致日誌切換。 日誌切換觸發的是normal checkpoint,而不是大家所說的增量checkpoint,只不過log switch checkpoint的優先順序非常低,當一個log switch checkpoint發生的時候它並不會立即的通知DBWn進程去寫數據文件,但是當有其它原因導致checkpoint或者是寫入數據文件的RBA超過log switch checkpoint的checkpoint RBA的時候,這次的log switch checkpoint將會被標記成完成狀態,同時更新控制文件和數據文件頭。我們隨後可以做個實驗驗證這個說法。 在Oracle中SCN相當於它的時鍾,在現實生活中我們用時鍾來記錄和衡量我們的時間,而Oracle就是用SCN來記錄和衡量整個Oracle系統的更改。 Oracle中checkpoint是在一個特定的「時間點」發生的,衡量這個「時間點」用的就是SCN,因此當一個checkpoint發生時SCN會被寫入文件頭中以記錄這個checkpoint。 增量checkpoint 增量checkpoint工作過程 因為每次完全的checkpoint都需要把buffer cache所有的臟塊都寫入到數據文件中,這樣就是產生一個很大的IO消耗,頻繁的完全checkpoint操作很對系統的性能有很大的影響,為此Oracle引入的增量checkpoint的概念,buffer cache中的臟塊將會按照BCQ隊列的順序持續不斷的被寫入到磁碟當中,同時CKPT進程將會每3秒中檢查DBWn的寫入進度並將相應的RBA信息記錄到控制文件中。 有了增量checkpoint之後在進行實例恢復的時候就不需要再從崩潰前的那個完全checkpoint開始應用重做日誌了,只需要從控制文件中記錄的RBA開始進行恢復操作,這樣能節省恢復的時間。 發生增量checkpoint的先決條件 恢復需求設定 (FAST_START_IO_TARGET/FAST_START_MTTR_TARGET) LOG_checkpoint_INTERVAL參數值 LOG_checkpoint_TIMEOUT參數值 最小的日誌文件大小 buffer cache中的臟塊的數量 增量checkpoint的特點 增量checkpoint是一個持續活動的checkpoint。 沒有checkpoint RBA,因為這個checkpoint是一直都在進行的,所以不存在normal checkpoint裡面涉及的checkpoint RBA的概念。 checkpoint advanced in memory only 增量checkpoint所完成的RBA信息被記錄在控制文件中。 增量checkpoint可以減少實例恢復時間。 增量checkpoint相關參數設置 log_checkpoint_interval 設定兩次checkpoint之間重做日誌塊(重做日誌塊和系統數據塊是一樣的)數,當重做日誌塊數量達到設定值的時候將觸發checkpoint。 log_checkpoint_timeout 設定兩次checkpoint之間的間隔時間,當超時值達到時增量checkpoint將被觸發。Oracle建議不用這個參數來控制,因為事務(transaction)大小不是按時間等量分布的。將此值設置成0時將禁用此項設置。 fast_start_io_target 因為log_checkpoint_interval主要看的時候重做日誌塊的數量,並不能反應buffer cache中臟數據塊的修改,因此Oracle又引入了這個參數來實現當臟數據塊達到一定數量的時候觸發checkpoint,不過此參數實際上控制的是恢復時所需IO的數量。 fast_start_mttr_target 此參數是在9i中引入用來代替前面的三個參數的,它定義了數據塊崩潰後所需要的實例恢復的時間,Oracle在實際上內在的解釋成兩個參數:fast_start_io_target和log_checkpoint_interval.如果這兩個參數沒有顯式的指定,計算值將生效.。 fast_start_mttr_target可以設定的最大值是3600,即一個小時。它的最小值沒有設限,但是並不是說可以設置一個任意小的值,這個值會受最小dirty buffer(最小為1000)的限制,同時還會受初始化時間以及文件打開時間的限制。 在設置此參數的時候要綜合考慮系統的IO,容量以及CPU等信息,要在系統性能和故障恢復時間之間做好平衡。 將此參數設置成0時將禁用 fast-start checkpointing,這樣能見效系統負載但同時會增加系統的恢復時間。 如果fast_start_io_target or log_checkpoint_interval被指定,他們會自動覆蓋由fast_start_mttr_target參數計算出來的值。
麻煩採納,謝謝!
C. Spark之CheckPoint
sparkContext.setCheckpointDir()
Streaming裡面的 checkpoint 又有其特殊的重要性。除存儲某個 DStream 的數據外,還存儲了環境相關信息。數據的 checkpoint 的目的同上,為了切斷過長的依賴,使後面的操作的依賴更可口。而 metadata 的 checkpoint 是為了更好的恢復 driver。
Spark Streaming 會 checkpoint 兩種類型的數據。
注意:類 Checkpoint 對象序列化後的數據,在 Spark Streaming application 重新編譯 後,再去反序列化 checkpoint 數據就會失敗。這個時候就必須新建 StreamingContext。解決方案:對於重要的數據,自行維護,比如 kafka 的offset。
TODO check: offset checkpoint metadata or hdfs 存 or
zookeeper存 比較。
Write Ahead Log+ reliable receivers(收到數據並且 replicate 之後向 source 確認)
多大程度上保證 zero data loss,跟源本身的實現機制,receiver 的實現也有關系
具體參考:
http://spark.apache.org/docs/latest/streaming-programming-guide.html#deploying-applications
Spark 在生產環境下經常會面臨transformation的RDD非常多(例如一個Job中包含1萬個RDD)或者具體transformation的RDD本身計算特別復雜或者耗時(例如計算時長超過1個小時),這個時候就要考慮對計算結果數據的持久化。如果採用persist把數據放在內存中,雖然是快速的,但是也是最不可靠的;如果把數據放在磁碟上,也不是完全可靠的!例如磁碟會損壞,系統管理員可能清空磁碟。持久化的方向可以是 persistent 或者 checkpoint。 當兩者目的又有所不同。
加入進行一個1萬個步驟,在9000個步驟的時候persist,數據還是有可能丟失的,但是如果checkpoint,數據丟失的概率幾乎為0。
理解spark streaming 情形下的數據丟失,對 checkpoint 非常重要
http://spark.apache.org/docs/latest/streaming-programming-guide.html#fault-tolerance-semantics
D. 07_Flink之checkpoint和state
barrier攜帶者快照的id,快照的id在快照存放在最前面
flink容錯-checkpoint流程
第二個問題:停止數據處理,做完快照,廣播屏障。
1、快照數據存儲,不往下發?只發barrier,應該裡麵包含著數據才對。
2、一個運算元存儲做,那麼計算是存儲之前做,還是存儲之後做。?
第三個問題:最下面那個到底對嗎
state數據保存在java堆內存中,執行checkpoint的時候,會把state的快照數據保存到jobmanager的內存中 基於內存的state backend在生產環境下不建議使用。【因為怕丟失】
state數據保存在taskmanager的內存中,執行checkpoint的時候,會把state的快照數據保存到配置的文件系統中,可以使用hdfs等分布式文件系統。
基於RocksDB + FS
RocksDB跟上面的都略有不同,它會在本地文件系統中維護狀態,state會直接寫入本地rocksdb中。同時RocksDB需要配置一個遠端的filesystem。
checkpoint與state之間的關系
checkpoint是一個動詞,如果順利的話,會產生一個名詞。
state:流式計算中持久化的狀態
state存放在local state backend。
在flink中,state可以分為這兩種,一種是keyed State,一種是
並行,多個節點一起計算。
並發,一個節點,多個線程計算。
hello1永遠只會到並發的task上面去。
不去keyby也能拿到它.
triggercheckpoint,當task收到所有barrier之後,會進行快照,再快照之前,將自己的輸出繼續傳遞barrier,並將自己的狀態非同步寫入到持久化存儲中。
我已經把快照做好,並且把元數據告訴你。
E. 郵件伺服器郵件存儲和日誌的介紹
本文以資料庫的基本原理為基礎,分析了EXCHANGE SERVER的存儲系統,並說明了各部分的作用。
一、IS服務和ESE的層次關系
IS服務是EXCHANGE伺服器中重要的服務之一,它控制著對郵箱和PF的存儲操作請求,EXCHANGE伺服器的存儲實際上是由ESE的資料庫引擎來管理的。這個ESE引擎是微軟專門為保存非關系型數據而開發的,目前在微軟的很多產品中都有廣泛的應用,如:AD資料庫、DHCP、WINS、SRS等等。
EXCHANGE的資料庫是由EDB文件、STM文件和LOG文件組成。在這些文件里,微軟使用了「B+樹」的內部數據結構。ESE的引擎的任務之一,就是當IS服務請求訪問資料庫的時候,把這些請求轉化為對內部數據結構的讀寫訪問。B+樹的特點是能夠對存儲在硬碟上的數據提供快速訪問能力。微軟利用「B+樹」作為ESE的後台結構的主要原因,就是盡可能的提高訪問數據時I/O性能。當然,這些結構對於EXCHANGE STORE來說是透明的。
另外,作為一個資料庫系統,ESE有責任提供事務級別的操作的支持,並維護資料庫的完整性和一致性。對資料庫系統而言,我們提到事務時,一般用ACID來描述事務的特點。
A--Atomic(原子的):事務必須是全或全無的操作,要麼全部成功更新,要麼全部不被更新
C--Consistent(一致的):一個成功提交的事務必須使資料庫處於一個一致的狀態。
I--Isolated(孤立的):所有未提交的更改都必須能夠和其他事務孤立。
D--Durable(持久的):當事務一旦提交,所做的更改必須存儲到穩定的介質上,防止系統失敗導致的資料庫不一致。(此點非常重要!!)
二、EXCHANGE 2000/2003存儲系統的新特點
在EX5.5中,ESE的版本為ESE97,而在EX2000/2003里,ESE版本已經升級ESE98了。ESE引起在以下方面得到了改進:
* I/O性能進一步提高和優化
* 對日誌文件增加了計算校驗操作
* 提高了ESEUTIL等工具的維護速度
而IS也在以下方面有了更新:
* 在每個SERVER上提供多個SG支持
* 資料庫STM文件格式的引入,提高了INTERNET郵件的性能
* WSS的引入,用戶可以使用多種協議訪問資料庫
三、EDB和STM的關系
常有人問,EDB文件是資料庫,那STM文件是做什麼用的?可以刪除嗎?
在EX5.5里,只有EDB文件,因為在EX5.5發布時,微軟主推的是內部郵件系統,因此其主要協議為MAPI,這是微軟的私有郵件西醫,EDB文件是專門為此協議優化過的。因此在EX5.5中,為了支持INTERNET郵件,必須在每次處理INTERNET郵件時,做一個格式轉換。這顯然帶來了性能的損失。
在EX2000里,微軟加大了對INTERNET郵件的支持,這就是STM文件的來源。MAPI格式是RPC和二進制標準的,而STM是純文本加上一些MIME編碼格式,這樣的區別使得它們不可能存儲在同一資料庫里。因此EX2000中,微軟開始使用EDB和STM兩個文件來分別保存兩種格式的郵件。並且在兩個文件之間建立了引用和關聯。對於用戶來說,它的郵箱實際上是跨越了EDB和STM文件共同組成的。另外,需要注意的是,EDB文件中還保留著用戶的郵箱結構。所以EDB文件更加重要。那麼EDB和STM是怎麼協同工作的呢?我們以幾個情景來分析之。
情景一:用戶使用OUTLOOK(MAPI)發送接收郵件
在該情景下,用戶將郵件通過MAPI協議提交給資料庫,直接被保存EDB文件中。當用戶通過MAPI訪問郵箱里的郵件時,如果被訪問的郵件在EDB里,直接返回,如果在STM里(如外來郵件),則執行轉換,將STM轉換為EDB文件格式,再返回用戶。
情景二:用戶使用標准SMTP/POP3/IMAP4等協議訪問
用戶使用非MAPI協議提交的郵件,內容保存在STM文件里,但是由於EDB里有郵箱結構,STM沒有,因此系統會把郵件的重要信息提取出來,放在EDB里。當用戶用MAPI提取郵件時,過程同上,當用戶通過標准協議訪問時,同樣需要進行格式轉換,轉換為STM文件格式返回。 這些轉換是在後台發生的。對用戶來說是透明的。通過上面的描述,你會看到,這兩個文件是緊密聯系的缺一不可。所以,在任何時間我們都不要單獨操作這兩個文件,它們是一個整體。同時也要注意的是,無論用戶使用何方式訪問郵箱,都需要向EDB文件請求郵箱結構信息,這是需要注意的。
四、LOG文件的重大作用
在論壇里經常會看到有人說我的硬碟怎麼很快就沒了,一看原來是日誌文件搞的鬼,於是就有人刪除日誌文件,甚至使用循環日誌來強制減少日誌,甚至有人提出這樣的疑問,日誌到底有什麼用?是不是多餘的'?那我們來看看日誌的重大作用。
對於一個SG來說,系統會產生一系列的日誌,這些日誌的擴展名為LOG,前綴一般是E00、E01……除了這些連續的日誌文件外,還有一些特殊的日誌文件(res1.log,res2.log,e0x.chk))),它們又有什麼用呢?我們的管理員通常不喜歡備份這一操作,因此對這些日誌是痛恨不已啊。那麼微軟在EXCHANGE資料庫系統中引入日誌的作用難道真的是多此一舉嗎?我們從以下幾個方面來考察一下日誌的作用:
1、作為一個企業級的郵件系統,必須要保證數據安全和完整。必須能夠面對隨時可能發生的意外災難,把數據損失降低到最小。
2、必須提供高性能的郵件處理能力,對資料庫中的郵件的事務操作在完成後必須馬上(或是說立即)被記錄在存儲介質上(見前面的事務持久性說明)
3、災難發生後,使用資料庫備份恢復必須要返回到災難發生前一刻的資料庫狀態(這是至關重要的!!)
現在我們來更進一步的看一下,當用戶要修改郵箱中的內容時,被修改的內容首先被提取出來放到內存中,實際的修改是發生在內存里的,這是眾所周知的,當修改完成後,這些內容必須被盡快寫回存儲介質,這樣才表示一個事務成功完成了。
從事務的描述中我們可以看到,事務是具有原子特性的,為了保證資料庫的一致和完整,事務必須全部成功或全部失敗,如果事務失敗,則必須回滾到事務開始的狀態。而當郵件在內存中修改完成後,此時事務並沒有完成(為什麼呢?)因為一旦系統崩潰,這些修改就丟失了。所以要確保事務修改完成,必須盡快將修改寫回到資料庫里去(也就是硬碟上)。這也是事務的持久性要求。注意,我們這里說的第一時間或是盡快,是一個什麼樣的概念。如果我們直接修改EDB文件,由於EDB
文件比較大,那麼在硬碟上修改一個大文件,就 需要花費大量的時間在等待和尋找數據存儲塊上(見操作系統原理),當系統出現高負載的繁忙狀態時,這將是一個非常大的瓶頸。也就無法做到「盡快」了。那怎麼辦呢?所以資料庫系統使用了日誌,而日誌通常很小(EXCHANGE的日誌只有5MB),向這些文件寫入修改結果是很快速的,因此當內存的修改完成後,這些結果就會立即寫入日誌中,以保證了事務的持久性。當成功寫入日誌後,該事務就成功完成了(現在在硬碟上了,不會因為當機丟失了)接下來,ESE引擎會在後台慢慢將這些日誌里的修改記錄寫回真正的資料庫里去(這對用戶來說已經不是那麼重要了),這就是日誌的第一個作用:確保事務在第一時間(盡可能快的)保存到非易失存儲器上(提供了事務持久性支持)。
根據上面的藐視,我們看到運行中的EXCHANGE資料庫,是由三個部分組成的:
* 內存中已經完成處理還沒有寫會到日誌里的內容(Dirt page)
* 還沒有寫到資料庫文件里的日誌內容
* EDB和STM資料庫文件
對於第一個部分,一旦掉電就回丟失的,是最不安全的。而對於第二部分的內容,系統通過檢查點文件(CHK)來標記哪些日誌已經被寫入資料庫了,而哪些還沒有。CHK文件類似一個指針。我們可以用「ESEUTIL /MK」來檢查CHK文件里的內容,在該命令的輸出中的checkpoint:<0x8,26d1,29>這樣的東西就是檢查點位置,它表示E0x00008的日誌的頁面序號已經被成功寫入資料庫了。大家可以自己看看。。:)
前面提到過,EXCHANGE系統在出現災難時,應能恢復到災難發生前的時刻的狀態。這是非常重要的。但即使是最勤快的管理員,也只能在指定的預定時間內做系統備份,而不可能時時刻刻的都在備份。那麼在備份完成後到災難發生之前的這段數據該如何保護呢?是不是就任由它丟失呢?顯然是不可能的。那答案是什麼呢?就是日誌文件。前面我們知道,任何對資料庫的更改都先寫入日誌里,再由日誌寫入資料庫,這樣我們只要找到日誌文件,就可以重新進行模擬的操作來完成備份後的資料庫文件的更改了,我們舉個例子來看看:
假設我們在凌晨3點完成了一次FULLBACKUP,備份完成後,系統正常運行,到下午4點的時候,系統突然崩潰。管理員用凌晨3點的數據恢復了資料庫,那麼從凌晨3點到下午4點這段時間的數據變更,就只能依賴於日誌了。當完成資料庫恢復後,系統會自動的跟蹤到關聯的日誌文件,如果發現有比當前資料庫還新的日誌存在,系統就會自動的按照日誌的順序將更改寫回到資料庫中去。因此這樣一來,從凌晨3點到下午4點的數據變更就被完整的恢復了。這就是日誌的第二個作用:保證系統備份和恢復的完整性。當然前提是沒有使用循環日誌!!(看到了吧,使用循環日誌的危害是相當大的,比起你的數據來說,多做幾次備份不是沒有意義的吧?
說到這里,有人可能要問,如果資料庫和日誌同時損壞,如何辦?答案是:盡量避免這樣的情況發生。首先資料庫損壞的幾率要大於日誌,另外,微軟建議將資料庫和日誌分別存儲在不同的磁碟上,要是這樣還會同時壞,那就沒有辦法了,呵呵。。對於管理員對日誌文件的抱怨,合理的解決方法是定期做備份。啟用循環日誌是不正確的做法,當啟用循環日誌後,一旦系統發生災難恢復,將有可能不能將系統恢復到災難發生時的狀態,磁碟和數據誰更重要,管理員自己要考慮考慮了。
五、ESE與IS服務的啟動和關閉
ESE引擎在載入資料庫文件時,會去檢查資料庫文件的標志。這個標志保留了上次關閉資料庫的狀態,當狀態為正常關閉說,系統將直接載入該資料庫,當資料庫標志為非正常關閉時,系統將先進行一個軟恢復過程(你可以在事件里看到它),然後再載入。
那麼,正常關閉和非正常關閉有什麼區別呢?一個正常關閉的資料庫,表示所有的日誌信息都已經正確的寫入資料庫了。反之一個非正常關閉的資料庫,則表示至少有一部分數據未能正確的從日誌寫入資料庫。要注意的是,非正常關閉的資料庫並不等於已經被破壞的資料庫。只表示有數據沒有提交到資料庫文件。
使用ESEUTIL/MH命令可以看到資料庫的該狀態,其中的STATE欄位標記的就是這個狀態,「CLEANSHUTDOWN」表示資料庫正常關閉。當系統載入處於非正常關閉的資料庫時,就會根據檢查點文件確定日誌文件的位置,並做重放操作。當檢查點文件丟失或損壞時,系統將從最早的日誌文件開始處理。有的時候,系統不能自動的修復資料庫,這時我們也可以用「ESEUTIL /R」命令手工的恢復處於非正常關閉狀態的資料庫。強烈推薦在系統異常關閉後執行此命令。在執行前最好前確定資料庫文件的狀態確實為非正常關閉,不要對正常關閉的資料庫執行該恢復命令!
由此可見,EXCHANGE系統對資料庫有自我修復能力,能確保系統在發生意外後恢復正確的狀態。但這並不是說我們可以隨意的關閉系統,仍要UPS等必要的保護措施。
六、關於M盤
在EX2000里,有一個M盤的映射。這個映射只是提供開發人員通過API訪問郵箱和郵件用的。因此對M盤的手工操作都可能帶來資料庫的破壞,請注意,另外,有一種觀點認為備份了M盤就備份了郵件,這是絕對錯誤的。M盤雖然是資料庫的映射,但已經去掉了很多的關聯和內在聯系。因此備份M盤是不能恢復資料庫的。所有的EXCHANGE管理員必須按規定認真的備份系統狀態和SG。切不可偷懶哦。
F. Hadoop-HDFS 元數據管理機制和snn角色 checkpoint機制
元數據是存儲數據的數據
1.存儲文件自身的屬性
文件名稱\許可權\大小\修改時間
2.存儲文件塊的位置隱射信息
記錄文件塊和node之間的映射信息
安存儲形式分為
1.元數據怎樣存儲
為了方便用戶快速訪問,元數據的信息存儲在nn的內存當中
2.為了防止數據丟失
nn定時將內存的元數據持久化,持久化生成一個文件fsimage(內存鏡像文件)
3.為了避免兩次持久化之間數據丟失
nn會通過日誌記錄文件的寫(事務性)操作存放在 edits.log 日誌文件
幫助nn 把最近的edit.log日誌文件合並到fismage文件當中,清空一下日誌 得到一個新的fsimage文件
1,首先建立一個eits.new用來記錄後續執行的日誌文件
2,snn拉取之前的eits 日誌文件和fsimage文件
3,snn 把拉取的eits日誌和fsimage文件載入到內存當中並做合並操作
4,把合並完的內容存儲到fsimage.ckpt中
5,把fsimage.ckpt 跟之前的fsimage 做一個校檢,並替換掉fsimage
6.edis_new -> edis SecondaryNameNode->fsimage
ssn只是nn的輔助角色,只是幫助nn合並數據文件,snn無法頂替nn主角色的功能
注意 nn 和snn 在執行時 都會佔用較大內存
在部署時要有意避免他倆在同一個主機
G. 關於 Flink checkpoint,都在這里(二)
目前業界主流的實時計算框架包括 Flink、Spark Streaming、Storm。相比於 Batch,Stream 的容錯則需要考慮更多。Batch 數據通常基於穩定性較高的分布式存儲進行數據的讀寫(如 HDFS、S3 等),當數據計算出現異常時可以通過重新計算的方式保證最終結果的一致性,Spark 就是基於這樣的思路設計的,它通過 lineage 機制來重新計算。並且 Batch 計算往往不需要過多的考慮數據的時效性,而且不需要做到 7×24 小時的運行。但相對於 Stream 而言則會更加復雜。
對於 Stream 而言需要面對不同的流式數據源,可以是 File Stream、隊列(如 Kafka),甚至可能是某個服務發來的消息。數據源的多樣性就註定了 Stream 的容錯需要重新進行考慮。並且 Stream 數據的容錯需要在短時間內進行恢復,否則將可能會導致大量的數據積壓甚至丟失,因為 Stream 數據鏈路不會因為下游處理任務的異常而停止數據的產出。
讓我們將問題描述的更具體一些,方便更清楚的了解 Stream 的容錯思想。對於分布式計算而言,目前主流的思路都是採用 Master-Slave 架構。Master 主要用於進行 Slave 節點的管理(比如檢測 Slave 是否存活,狀態管理等),Slave 主要是擔當數據計算的職責。因此,從容錯角度而言分為:
Master 容錯相對而言較為簡單,因為不需要直接參與數據計算。主要分為有狀態的 Master 和無狀態的 Master 兩類。
像 Storm 這類無狀態的實時計算框架,Master(即 Storm 的 Nimbus 節點)的異常往往不影響 Slave(即 Storm worker 節點)的數據計算,只需要重新啟動一個 Master 即可,這個過程中不需要進行 Master 狀態的恢復,也不會影響實時數據的處理。甚至 Slave 節點在無感知的情況下就完成了 Master 的恢復。但是這種方式會犧牲一定的功能,實時計算框架本身無法支持狀態流的處理。
像 Flink 、 Spark Streaming 這類包含狀態的實時計算框架,需要恢復 Master 節點的同時還需要對其狀態進行恢復,Master 狀態信息包含一些必要的配置、以及對 Slave 節點狀態管理的信息(如「某個 Slave 節點的狀態快照所在的 HDFS 路徑」)。Spark Streaming、Flink 的做法都是基於 checkpoint 機制對 Master 節點的狀態進行備份,異常發生時需要基於上一次的狀態備份進行恢復。
Flink 還提供了 HA 機制,即同時運行至少 2 個 JobManager 節點,但是只有其中一個真正的處理管理事務(稱為主節點——Leader),其他的僅僅保持狀態信息的同步(稱為從節點——Standby)。一旦 Leader 發生異常,其中一個 Standby 將會代替異常節點繼續進行任務的管理。 更多關於 Flink HA 可以參考官方文檔 。這種機制是犧牲更多的資源來換取任務的穩定性,主從切換的成本相比於從狀態備份中恢復速度更快。
Stream 數據處理整體而言可以分為 3 部分:
根據不同的保障級別,Stream 數據容錯級別又分為 3 種語義:
我們之所以將數據接收和寫入單獨拿出來,是因為在面對不同的數據源時,實時框架的容錯機制與最高語義保障級別是不同的。如 Flink 而言,它的 exactly-once 語義總的來說是針對於數據處理階段而言,即只有框架內數據的處理可以保障 exactly-once,而數據的接收、寫入是否是 exactly-once 語義取決於數據源本身與 Source、Sink 運算元的實現邏輯。通常來說,我們將能夠保障數據接收、數據處理、數據接入整體數據一致性稱為 端到端(end-to-end) 的數據一致性。
端到端的數據一致性保障相對而言是很復雜的,因為數據源的種類眾多,這些一般都不是分布式實時框架中的一部分,數據的發送與接收邏輯不受實時框架的控制。
對於 Storm 而言,框架內僅提供了相關的介面用於用戶自己實現一致性語義,並沒有直接提供各種存儲的一致性 Spouts,數據寫入也是如此。數據處理過程提供 at-least-once 語義保障(exactly-once 語義由 Storm Trident 提供了保障,本篇暫不做討論)。Storm 通過 ACK 的機制保證 at-least-once 語義。簡單來說,當 Storm 接收到一條數據後將會給這條數據唯一的 id,數據被下游 Bolts 處理但是處理後的 id 不會發生改變,當且僅當該 id 的數據經過的 Bolts 全部 ACK 後才認定該數據被 徹底處理(fully processed) ,否則 Spout 將再次發送該數據直到數據被徹底處理。
Spark Streaming 的數據接收通過預寫入日誌的機制保障了 at-least-once 語義。簡單來說,就是將接收到的數據以日誌的形式寫入到穩定的存儲中(存儲位置基於 checkpoint 配置獲取),這樣一來就與數據源解耦,可以基於預寫入日誌實現數據重發的能力,從而保障 at-least-once 語義。數據處理過程中基於 RDD 的容錯機制進行恢復,提供了精確一次的語義。數據寫入需要用戶自己實現,Spark Streaming 提供了兩種思路:冪等寫入和事務性寫入。
Flink 全局基於 checkpoint 進行容錯,通過向流數據中插入特殊的事件——checkpoint barrier 來觸發各個運算元製作狀態快照,快照會寫入到持久化的存儲中。Flink Source、Sink 的語義保障需要依賴數據源以及自身的實現邏輯。但是 Flink 提供了多種狀態介面,如 ListState、MapState,用於進行運算元狀態的記錄,狀態容錯可以保障 exactly-once 語義。這也是與 Spark Streaming 的不同之處。
到這里我們大致了解了各個框架的容錯機制,我們不禁想回味一下:分布式實時計算框架的容錯機制的本質是什麼?容錯到底在保障什麼?
從本質上講,容錯在保障數據可以被正確的處理,即使在發生異常的情況下。實時流處理的正確性又體現在 處理過程的完整性 與 時序的正確性 。即一條數據要被所有的邏輯完整的處理一次(根據語義的不同也可能是多次),且多條數據之間的處理的時序不發生改變。
舉個例子,如下圖所示的數據流 DAG 圖中,流數據序列 [1, 2, 3, …, n] 被輸入到 A 中,然後最終流向 D。完整性即每一個事件都被完整的 DAG 路徑處理,即 A -> B -> D 或 A -> C -> D ,時序性即事件 1 永遠先於事件 2 被處理,即使在發生了異常後恢復的情況下也是如此。
從整體來看,實時分布式計算框架的容錯機制核心思想是 確認 與 重試 ,但是不同的框架重試過程中回滾的數據量不同。
Storm 通過 ACK 機制判斷數據是否完整處理,否則將重發數據,重新進行計算。這種單條數據粒度的 ACK 與重試機制即可以保障時序性,也可以保障處理過程的完整性。但是這樣細的粒度犧牲了一定的性能。Storm 並沒有將數據流進行冗餘存儲來保障容錯,從這個角度而言它的容錯是輕量級的。
Spark Streaming 通過微批次的方式將數據進行截斷,以批次為單位進行容錯。這種方式一旦發生了異常,可以從上一個批次中恢復繼續執行。這種機制從一定程度上提升了性能,但是對時效性有損。因為微批次的思路對數據流進行了截斷,時間語義上的單位時間也只能根據批次的大小來界定。Spark Streaming 提供了數據流的冗餘(預寫入日誌)可以真正做到與數據源解耦,對於所有的數據源均可以保障容錯的語義,但是這類的容錯是重量級的。
Flink 的思路也是對數據進行截斷,從而可以分段治之。相比於 Spark Streaming 而言這種截斷並沒有改變數據流的連續性,時間語義上的單位時間仍然是以事件粒度來界定。並且 Flink 不會對數據流進行冗餘(雖然 unaligned-checkpoint 會產生一部分的數據冗餘,但是與 Spark Streaming 這種全部數據冗餘的思路是不同的),只關注計算中的狀態容錯。這種思路較為輕量級,並且能夠保障 exactly-once 語義。但是這種思路無法應對所有的數據源場景,需要強依賴數據源的實現與 Source、Sink 運算元的邏輯。
總體而言,實時流的容錯核心是基於 數據截斷 和 重試機制 。Storm 的數據截斷粒度是單條數據級別的,通過 ACK 的機制實現的重試機制,此截斷粒度不會影響數據的時效性。Spark Streaming 的截斷粒度是微批次的,截斷會影響數據的時效性,然後通過數據冗餘的方式保障了重試機制,這種冗餘數據的方式可以面對任何數據源時都能夠保證數據一致性。Flink 是基於 checkpoint barrier 將數據流截斷,barrier 會隨著數據流而流動,避免了流量截斷帶來的時效性影響,並且 Flink 容錯只關注狀態,藉助狀態的回滾來保證數據一致性。
從容錯實現來看,三種框架的側重點有所不同。Storm 作為無狀態計算框架,採用的是非常簡單有效的機制保障容錯。Spark Streaming 更注重數據的可恢復性,希望通過備份原始數據能夠在任何情況下、面對任何數據源都能夠保證數據一致性。Flink 相對而言更加輕量,更注重數據的時效性,不希望容錯機制帶來太多的時效性損失(例如 unaligned-checkpoint)。
感謝你讀到這里,希望你現在對 Flink 容錯機制和其他的實時計算框架的容錯機制有了一個基本的了解,對其容錯思路和本質有了不同的想法。 下一篇 我們將討論 Flink checkpoint 的數據結構,探索它究竟是如何存儲的?都存儲了哪些內容?基於這些備份數據如何在異常中恢復?
可可 @ 歡迎郵件聯系我
H. flink歷史服務
flink任務停止後,JobManager會將已經完成任務的統計信息進行存檔,歷史服務進程則在任務停止後可以對任務統計信息進行查詢。比如:最後一次的checkpoint、任務運行時的相關配置。
默認啟動埠8082:
查看/tmp/flink-web-history-7586c510-103f-4443-8252-59c56d86930e歷史服務存儲文件夾中的內容。
歷史服務存儲文件中,存儲了用於頁面展示的模板配置。歷史任務信息存儲在Jobs路徑下,其中包含了已經完成的Job,每次啟動都會從historyserver.archive.fs.dir拉取所有的任務元數據信息。
每個任務文件夾中包含我們需要獲取的一些信息,通過restAPI獲取時指標時,就是返回這些內容。
任務運行時,通過RestAPI將產生的checpoint路徑存儲到DB,以便根據路徑續跑任務。當任務結束時,可能沒辦法及時從正在運行的任務中拉去最後一次checkpoint信息,此時需要從歷史服務獲取, http://historyIP:8082/jobs/jobid/checkpoints 。
線上任務停止後,根據存儲在DB的checkpoint路徑選擇續跑,此時續跑失敗。異常日誌顯示選擇續跑的checkpoint文件不存在,查看DB和hdfs上存儲的checkpoint信息,發現hdfs保存的最後一條checkpointID和DB存儲的最後一條不一致。初步定位,最後一次獲取checkpoint信息失敗。
查看歷史服務報錯日誌,是因為歷史服務未能找到 hdfs://ns1/flink/completed 路徑,導致獲取數據失敗。查看hdfs確實也沒有該路徑,最後定位沒有配置jobmanager.archive.fs.dir參數。
I. Docker Checkpoint/Restore
唔,暫時小記一下checkpoint / restore,希望之後能回顧並深入認識下目前的問題。
CRIU全稱「Checkpoint / Restore in Userspace」,是一個為Linux提供檢查點/恢復功能的工具,主要是對運行中的應用進行凍結(freeze)再基於其在磁碟上的所有文件建立檢查點,並根據checkpoint恢復凍結時狀態並繼續運行。CRIU可以運用到場景包括:應用熱遷移(live migration)、快照、遠程調試(debugging)等等。CRIU為OpenVZ、LXZ/LXD、Docker等都提供了很好的支持。
/proc是一個基於內存的文件系統,包括CPU、內存、分區劃分、[I/O地址]、直接內存訪問通道和正在運行的進程等等,Linux通過/proc訪問內核內部數據結構及更改內核設置等。Checkpoint很大程度上是基於/proc文件系統進行的,主要依賴/proc獲取文件描述符信息、管道參數、內存映射等。
Checkpoint通過進程轉存器(process mper)進行以下步驟:
Restore恢復過程主要進行以下步驟:
Docker container實際上也是一個進程,故CRIU實質上是對容器進程進行checkpoint/restore。
源碼裝CRIU有一丟丟麻煩,記得把官網說的那些庫都下完整哦。
docker雖然提供了checkpoint,但切換至experimental下才能用,新建/etc/docker/daemon.json文件,(docker的配置文件,默認沒有)。
若該文件參數更改很多,就會起沖突......解決辦法:盡量只將自己需要更改的配置參數寫入就好,若還沖突,就啟動docker時手動指定參數或腳本啟動吧。
另外,我使用docker 18及之後的版本時,checkpoint無法正常使用,主要出現以下問題:
據說是???moby的原因,但看Stackflow上的問題也還是open的,關閉了一個但感覺他關的莫名其妙;有一個問題下,開發人員說解決了,但還未推到新版本。我的解決辦法:試驗之後, 建議使用較新版本17.06進行checkpoint/restore ,可以正常使用,可能18版本(小生年方18,尚未婚娶)太新了腳跟還沒站穩。
現在可以開始愉快地使用docker checkpoint了!!Docker CLI提供了checkpoint命令。
create
ls
rm 無話可說
start
啟動時沒有單獨的命令,但在container start可以指定checkpoint選項參數,如將容器從/home/vickee/chkps/目錄下的chkp0恢復:
注意:在創建checkpoint時,若我們指定的路徑為/home/PATH,則恢復時還需要具體指定到該路徑下的/home/PATH/[CONTAINER_FULL_ID]/checkpoints。因為恢復時,我們可能新建容器,或者將另一個容器從別的容器的checkpoint恢復,故需自己根據checkpoint信息進行路徑完善。
CRIU對最新內核的支持有限,且好像在較新版本中,移除了--checkpoint-dir即指定目錄這一特性。
若容器運行時有用external terminal( docker run -t ),checkpoint會失敗的。[ 參數-t 讓docker分配一個偽終端並綁定到容器的標准輸入上, -i 則讓容器的標准輸入保持打開,常一起使用。]
links:
https://criu.org/Docker
https://criu.org/Installation
https://criu.org/Checkpoint/Restore
J. 揭秘Spark_checkpoint
checkpoint是什麼
(1)、Spark 在生產環境下經常會面臨transformation的RDD非常多(例如一個Job中包含1萬個RDD)或者具體transformation的RDD本身計算特別復雜或者耗時(例如計算時長超過1個小時),這個時候就要考慮對計算結果數據持久化保存;
(2)、Spark是擅長多步驟迭代的,同時擅長基於Job的復用,這個時候如果能夠對曾經計算的過程產生的數據進行復用,就可以極大的提升效率;
(3)、如果採用persist把數據放在內存中,雖然是快速的,但是也是最不可靠的;如果把數據放在磁碟上,也不是完全可靠的!例如磁碟會損壞,系統管理員可能清空磁碟。
(4)、Checkpoint的產生就是為了相對而言更加可靠的持久化數據,在Checkpoint的時候可以指定把數據放在本地,並且是多副本的方式,但是在生產環境下是放在HDFS上,這就天然的藉助了HDFS高容錯、高可靠的特徵來完成了最大化的可靠的持久化數據的方式;
假如進行一個1萬個運算元操作,在9000個運算元的時候persist,數據還是有可能丟失的,但是如果checkpoint,數據丟失的概率幾乎為0。
checkpoint原理機制
1.當RDD使用cache機制從內存中讀取數據,如果數據沒有讀到,會使用checkpoint機制讀取數據。此時如果沒有checkpoint機制,那麼就需要找到父RDD重新計算數據了,因此checkpoint是個很重要的容錯機制。checkpoint就是對於一個RDD chain(鏈)如果後面需要反復使用某些中間結果RDD,可能因為一些故障導致該中間數據丟失,那麼就可以針對該RDD啟動checkpoint機制,使用checkpoint首先需要調用sparkContext的setCheckpoint方法,設置一個容錯文件系統目錄,比如hdfs,然後對RDD調用checkpoint方法。之後在RDD所處的job運行結束後,會啟動一個單獨的job來將checkpoint過的數據寫入之前設置的文件系統持久化,進行高可用。所以後面的計算在使用該RDD時,如果數據丟失了,但是還是可以從它的checkpoint中讀取數據,不需要重新計算。
2.persist或者cache與checkpoint的區別在於,前者持久化只是將數據保存在BlockManager中但是其lineage是不變的,但是後者checkpoint執行完後,rdd已經沒有依賴RDD,只有一個checkpointRDD,checkpoint之後,RDD的lineage就改變了。persist或者cache持久化的數據丟失的可能性更大,因為可能磁碟或內存被清理,但是checkpoint的數據通常保存到hdfs上,放在了高容錯文件系統。
問題:哪些 RDD 需要 cache?
會被重復使用的(但不能太大)。
問題:用戶怎麼設定哪些 RDD 要 cache?
因為用戶只與 driver program 打交道,因此只能用 rdd.cache() 去 cache 用戶能看到的 RDD。所謂能看到指的是調用 transformation() 後生成的 RDD,而某些在 transformation() 中 Spark 自己生成的 RDD 是不能被用戶直接 cache 的,比如 receByKey() 中會生成的 ShuffledRDD、MapPartitionsRDD 是不能被用戶直接 cache 的。
運算時間很長或運算量太大才能得到的 RDD,computing chain 過長或依賴其他 RDD 很多的 RDD。 實際上,將 ShuffleMapTask 的輸出結果存放到本地磁碟也算是 checkpoint,只不過這個 checkpoint 的主要目的是去 partition 輸出數據。
問題:什麼時候 checkpoint?
cache 機制是每計算出一個要 cache 的 partition 就直接將其 cache 到內存了。但 checkpoint 沒有使用這種第一次計算得到就存儲的方法,而是等到 job 結束後另外啟動專門的 job 去完成 checkpoint 。 也就是說需要 checkpoint 的 RDD 會被計算兩次。因此,在使用 rdd.checkpoint() 的時候,建議加上 rdd.cache(), 這樣第二次運行的 job 就不用再去計算該 rdd 了,直接讀取 cache 寫磁碟。其實 Spark 提供了 rdd.persist(StorageLevel.DISK_ONLY) 這樣的方法,相當於 cache 到磁碟上,這樣可以做到 rdd 第一次被計算得到時就存儲到磁碟上,但這個 persist 和 checkpoint 有很多不同,之後會討論。
RDD 需要經過 [ Initialized --> marked for checkpointing --> checkpointing in progress --> checkpointed ] 這幾個階段才能被 checkpoint。
Initialized: 首先 driver program 需要使用 rdd.checkpoint() 去設定哪些 rdd 需要 checkpoint,設定後,該 rdd 就接受 RDDCheckpointData 管理。用戶還要設定 checkpoint 的存儲路徑,一般在 HDFS 上。
marked for checkpointing: 初始化後,RDDCheckpointData 會將 rdd 標記為 MarkedForCheckpoint。
checkpointing in progress: 每個 job 運行結束後會調用 finalRdd.doCheckpoint(),finalRdd 會順著 computing chain 回溯掃描,碰到要 checkpoint 的 RDD 就將其標記為 CheckpointingInProgress,然後將寫磁碟(比如寫 HDFS)需要的配置文件(如 core-site.xml 等)broadcast 到其他 worker 節點上的 blockManager。完成以後,啟動一個 job 來完成 checkpoint(使用 rdd.context.runJob(rdd, CheckpointRDD.writeToFile(path.toString, broadcastedConf)) )。
checkpointed: job 完成 checkpoint 後,將該 rdd 的 dependency 全部清掉,並設定該 rdd 狀態為 checkpointed。然後, 為該 rdd 強加一個依賴,設置該 rdd 的 parent rdd 為 CheckpointRDD, 該 CheckpointRDD 負責以後讀取在文件系統上的 checkpoint 文件,生成該 rdd 的 partition。
有意思的是我在 driver program 里 checkpoint 了兩個 rdd,結果只有一個(下面的 result)被 checkpoint 成功,pairs2 沒有被 checkpoint,也不知道是 bug 還是故意只 checkpoint 下游的 RDD:
checkPoint是一種容錯機制,當我們的程序需要很多transformation操作的時候,如果我們擔心中間某些關鍵的後面會反復幾次使用的RDD,可能會因為節點的故障,導致持久化數據的丟失,那麼就可以針對該RDD額外啟動checkpoint機制, 實現容錯和高可用。
首先要調用 SparkContext的setCheckPointDir()方法,設置一個容錯的文件系統的目錄,比如HDFS; 然後對RDD調用checkpoint()方法。之後,在RDD所處的job運行結束之後,會啟動一個單獨的job,來將checkPoint的RDD的數據寫入之前設置的文件系統,進行高可用、容錯的類持久化操作。
此時就算在後面使用RDD時,它的持久化的數據,不小心丟失了,但是還是可以從它的checkpoint文件中直接讀取其數據,從而不需要重新計算。 (CacheManager)
答:首先使用SparkContext.setCheckpointDir() ,設置checkpoint的目錄,然後使用RDD.checkpoin進行checkpoint。
剖析,當我們使用了checkpoint之後,發生的一系列操作:
1、 對RDD調用了checkpoint()方法之後,它就接受RDDCheckpointData對象的管理。
2、 RDDCheckpointData對象,會負責將調用了checkpoint()方法的RDD的狀態,設置為MarkedForCheckpoint。
3、 在RDD所在的那個job運行結束之後,會調用job中,最後一個RDD的doCheckPoint()方法,該方法沿著finalRDD的lineage向上查找,標記為MarkedForCheckpoint的RDD,並將其標記為CheckpointingInProgress。
4、 然後啟動一個單獨的job,來將lineage中,標記為CheckpointingInProgress的RDD,進行checkpoint的操作,也就是將這個RDD寫入到Sparkcontext.setCheckpointDir()方法設置的文件系統中。
答:最主要的區別:
在於持久化,只是將數據保存在BlockManager中,但是rdd的lineage沒有發生改變。
但是checkpoint執行完以後,rdd已經沒有之前所謂的依賴rdd了,而只有一個強行為其設置的checkpointRDD,也就是說,checkpoint之後,rdd的lineage就改變了。
其次,持久化的數據丟失的可能性更大,無論是磁碟、或者是內存,都有可能丟失;但是checkpoint的數據,通常是保存在容錯、高可用的文件系統中的,比如HDFS,依賴於這種高容錯的文件西永,所以checkpoint的數據丟失可能性非常低。
答:如果一個RDD沒有緩存,而且還設置了checkpoint,這樣的操作是很悲劇的,細想,本來當前RDD的這個job都執行結束了,但是由於中間的rdd沒有持久化,那麼checkpoint job想要將rdd 的數據寫入到外部文件系統中的話,還得從rdd之前所有的rdd,全部重新計算一次,然後才能計算出rdd的數據,再將其checkpoint到外部的文件系統中,
所以我們通常建議,對要checkpoint的rdd使用persisit(StorageLevel_DISK_OMLY),該rdd計算之後,就直接將其持久化到磁碟上去,然後後面進行checkpoint操作是,直接從磁碟上讀取rdd的數據,並checkpoint到外部文件系統即可,不需要重新計算一次rdd。