天天看點

《HBase權威指南》一3.3 批量處理操作

本節書摘來異步社群《hbase權威指南》一書中的第3章,第3.3節,作者: 【美】lars george 譯者: 代志遠 , 劉佳 , 蔣傑 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

現在我們已經介紹過添加、檢索和删除表中資料的操作了,不過前面介紹的操作都是基于單個執行個體或基于清單的操作。這一節将會介紹一些api調用,這些調用可以批量處理跨多行的不同操作。

文字事實上,許多基于清單的操作,如delete(list deletes)或者get(list gets),都是基于batch()方法實作的。它們都是一些為了友善使用者使用而保留的方法。如果你是新手,推薦使用batch()方法進行所有操作。 下面的用戶端api方法提供了批量處理操作。使用者可能注意到這裡引入了一個新的名為row的類,它是put、get和delete的祖先,或者說是父類。

使用同樣的父類允許在清單中實作多态,即放入以上3種不同的子類。這種調用跟之前介紹的基于清單的調用方法一樣簡單易用。下面的例3.16展示了如何把不同的操作融合為一個伺服器端調用。

圖像說明文字請注意,不可以将針對同一行的put和delete操作放在同一個批量處理請求中。為了保證最好的性能,這些操作的處理順序可能不同,但是這樣會産生不可預料的結果。由于資源競争,某些情況下,使用者會看到波動的結果。

例3.16 使用批量處理操作的應用示例

使用常量可以友善重用。

建立清單存放所有操作。

添加一個put執行個體。

添加一個針對不同行的get執行個體。

添加一個delete執行個體。

添加一個會失敗的get執行個體。

建立一個結果數組。

列印捕獲的異常。

列印所有結果。

從控制台上可以看到以下結果:

與之前的例子一樣,在執行批量處理之前,由于插入了測試行的資料,是以先列印了測試行的相關輸出。首先輸出的是表的原内容,然後是示例代碼産生的輸出,最後輸出的是操作以後的表的内容。由輸出結果可見,要删除的列被删除了,新添加的列也成功添加了。

get操作的結果需要觀察輸出結果的中間部分,即示例代碼産生的輸出。那些以result[n](n從0到3)開頭的輸出是actions參數中對應操作的結果。示例中第一個操作是put,對應的結果是一個空的result執行個體,其中沒有keyvalue執行個體。這是批量處理調用傳回值的通正常則,它們給每個輸入操作傳回一個最佳比對的結果,可能的傳回值如表3-7所示。

《HBase權威指南》一3.3 批量處理操作

更進一步地觀察控制台上輸出的傳回結果數組,你會發現空的result執行個體列印出來是:keyvalues=none。get請求成功找到了相比對的結果,傳回一個對應的keyvalue執行個體。最後,有一個bogus列族的操作請求并傳回一個異常供使用者參考。

文字當使用者使用batch()功能時,put執行個體不會被用戶端寫入緩沖區緩沖。batch()請求是同步的,會把操作直接發送到伺服器端,這個過程沒有什麼延遲或其他中間操作。這與put()調用明顯不同,是以請慎重挑選需要的方法。

有兩種不同的批量處理操作看起來非常相似。不同之處在于,一個需要使用者輸入包含傳回結果的object數組,而另一個由函數幫助使用者建立這個數組。為什麼需要兩個方法呢?它們的語義有什麼不同嗎(如果有不同的話)?它們都可能抛出之前見到過的retriesexhaustedwithdetailsexception,是以關鍵的不同在于:

上面這個方法讓使用者可以通路部分結果,而下面這個方法不行:

後面這個方法如果抛出異常的話,不會有任何傳回結果,因為新結果數組傳回之前,控制流就中斷了。

而之前的方法會先向使用者提供的數組中填充資料,然後再抛出異常。例3.16的代碼就采用了前一種方法,并送出了結果數組。下面是一些batch()方法特性的彙總。

兩種方法的共同點

get、put和delete都支援。如果執行時出現問題,用戶端将抛出異常并報告問題。它們都不使用用戶端寫緩沖區。

能夠通路成功操作的結果,同時也可以擷取遠端遠端什麼需要兩個方法呢?他失敗時的異常。

隻傳回用戶端異常,不能通路程式執行中的部分結果。

文字在檢查結果之前,所有的批量處理操作都被執行了:即使使用者收到一個操作的異常,其他操作也都已經執行了。不過,在最壞的情況下,可能所有操作都會傳回異常。

另外,批量處理可以感覺暫時性錯誤,例如notservingregionexception(表明一個region已經被移動)會多次重試這個操作。使用者可以通過調整hbase.client.retries.number配置項(預設是10)來增加或減少重試次數。

繼續閱讀