使用 Apache HBase HBCK2 工具
本文說明如何使用 HBase HBCK2 工具。 HBCK2 是 Apache HBase 叢集的修復工具。
HBCK2 概觀
HBCK2 目前是一個簡單的工具,一次只做一件事。 在 hbase-2.x 中,Master 是所有狀態的最終仲裁程式,因此大多數 HBCK2 命令的一般準則是要求 Master 進行所有修復。
Master 必須啟動並執行,才能執行 HBCK2 命令。 HBCK1 會執行分析,並回報您的叢集為良好或錯誤,但 HBCK2 較不冒失。 在 hbase-2.x 中,操作員會決定需要修正的項目,然後使用包括 HBCK2 在內的工具進行修復。
HBCK2 與HBCK1
HBCK2 是 HBCK 的後續產品,該修復工具隨附於 hbase-1.x (也稱為 HBCK1)。 您可以使用 HBCK2 取代 HBCK1 來修復 hbase-2.x 叢集。 HBCK1 不應該針對 hbase-2.x 安裝執行,因為可能會造成損害。 其寫入設施 (-fix
) 已遭到移除。 它可以報告 hbase-2.x 叢集的狀態,但其評量不正確,因為它不了解 hbase-2.x 的內部運作。
HBCK2 無法像 HBCK1 一樣運作,即使是命令在兩個版本之間以類似方式命名的情況下也一樣。
取得 HBCK2
您可以在 HBase 散發目錄下找到版本。 如需詳細資訊,請參閱 HBase 下載頁面。
Master UI:HBCK 報告
在 2.1.6 中新增至 Master 的 HBCK 報告頁面,/hbck.jsp
,會顯示 Master 間隔執行兩次檢查的輸出。 其中一個是每當執行時,CatalogJanitor
的輸出。 如果在 hbase:meta
中找到重疊或漏洞,則 CatalogJanitor
會列出找到的項目。 另一個背景 chore
程序會比較 hbase:meta
和檔案系統內容。 如果發現異常,則會在 HBCK 報告區段中記下。
若要執行 CatalogJanitor
,請在 hbase 殼層中執行命令:catalogjanitor_run
。
若要執行 hbck chore
,請在 hbase 殼層中執行命令:hbck_chore_run
。
這兩個命令都不會接受任何輸入。
執行 HBCK2
您可以透過 $HBASE_HOME/bin/hbase
指令碼啟動 hbck
命令來執行命令。 根據預設,當您執行 bin/hbase hbck
時,會執行內建 HBCK1 工具。 若要執行 HBCK2,您必須使用 -j
選項指向建置的 HBCK2 jar,如下列範例所示:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar
此命令會列印 HBCK2 說明,而不傳遞選項或引數。
HBCK2 命令
注意
在測試叢集上測試這些命令,在實際執行環境中執行這些命令之前了解其功能。
assigns [OPTIONS] <ENCODED_REGIONNAME/INPUTFILES_FOR_REGIONNAMES>... | -i <INPUT_FILE>...
選項:
-o,--override
:覆寫另一個程序的擁有權。-i,--inputFiles
:接受一或多個已編碼區域名稱。
即使在 Master 初始化期間也可以使用此 raw
指派 (如果已指定 -skip
旗標)。 會略過協同處理器,並傳遞一或多個已編碼區域名稱。 de00010733901a05f5a2a3a382e27dd4
是使用者空間已編碼區域名稱外觀的範例。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar assigns de00010733901a05f5a2a3a382e27dd4
會傳回已建立 AssignProcedures
的 PID,或者如果沒有則傳回 -1。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含已編碼區域名稱,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar assigns -i fileName1 fileName2
unassigns [OPTIONS] <ENCODED_REGIONNAME>...| -i <INPUT_FILE>...
選項:
-o,--override
:覆寫另一個程序的擁有權。-i,--inputFiles
:接受一或多個已編碼名稱的輸入檔。
即使在 Master 初始化期間也可以使用此 raw
取消指派 (如果已指定 -skip
旗標)。 會略過協同處理器,並傳遞一或多個已編碼區域名稱。 de00010733901a05f5a2a3a382e27dd4
是使用者覆寫空間已編碼區域名稱外觀的範例。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar unassign de00010733901a05f5a2a3a382e27dd4
會傳回已建立 UnassignProcedures
的 PID,或者如果沒有則傳回 -1。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含已編碼區域名稱,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar unassigns fileName1 -i fileName2
bypass [OPTIONS] <PID>...
選項:
-o,--override
:如果程序正在執行或停滯,則會覆寫。-r,--recursive
:略過父代及其子系。 此選項速度緩慢且昂貴。-w,--lockWait
:放棄之前等候毫秒。 預設值=1。-i,--inputFiles
:接受一或多個 PID 的輸入檔。
會傳遞一或多個程序 PID,以跳至程序完成。 略過程序的父代會跳到完成。 實體的狀態不一致,需要手動修復。 可能需要重新啟動 Master,才能清除仍然保留的鎖定。 如果程序有子系,略過就會失敗。 如果您擁有的所有項目都是父代 PID 以完成父代和子系,請新增 recursive
。 此選項很慢且危險,因此請選擇性地使用它。 不一定一律運作.
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar bypass <PID>
如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 PID,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar bypass -i fileName1 fileName2
reportMissingRegionsInMeta <NAMESPACE|NAMESPACE:TABLENAME>... | -i <INPUT_FILE>...
選項:
i,--inputFiles
:接受命名空間或資料表名稱的一或多個輸入檔。
當區域從 hbase:meta
遺失但是目錄仍存在於 HDFS 時,請使用此選項。 此命令只是檢查方法。 其設計目的是為了報告用途,而且不會執行任何修正。 其提供哪些區域 (如果有的話) 會重新新增到 hbase:meta
的檢視,並依個別資料表或命名空間分組。
若要在中繼中有效地重新新增區域,請執行 addFsRegionsMissingInMeta
。 此命令需要 hbase:meta
上線。 針對以參數形式傳遞的每個命名空間/資料表,會針對 HDFS 上現有區域的 dirs,在 hbase:meta
中可用的區域之間執行差異。 沒有相符項目的區域 dirs 會依其相關資料表名稱來列印。 沒有遺漏區域的資料表會顯示「沒有遺漏的區域」訊息。 如果未指定任何命名空間或資料表,則會驗證所有現有的區域。
接受多個命名空間和資料表的組合。 資料表名稱應該包含命名空間部分,即使是預設命名空間中的資料表也是如此。 否則,會假設命名空間值。 此範例會在預設命名空間下觸發資料表 table_1
和 table_2
的遺漏區域報告:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar reportMissingRegionsInMeta default:table_1 default:table_2
此範例會針對預設命名空間下的資料表 table_1
,以及命名空間 ns1
中的所有資料表,觸發遺漏區域報告:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar reportMissingRegionsInMeta default:table_1 ns1
會針對以參數形式傳遞的每個資料表,或針對以參數形式指定的命名空間上的每個資料表,傳回遺漏區域清單。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <NAMESPACE|NAMESPACE:TABLENAME>
,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar reportMissingRegionsInMeta -i fileName1 fileName2
addFsRegionsMissingInMeta <NAMESPACE|NAMESPACE:TABLENAME>... | -i <INPUT_FILE>...
選項:
-i,--inputFiles
:當區域從hbase:meta
遺漏但是目錄仍存在於 HDFS 時,會採用一或多個命名空間資料表名稱的輸入檔。 需要hbase:meta
上線。
針對以參數形式傳遞的每個資料表名稱,會在 HDFS 上 hbase:meta
和區域 dirs 中可用的區域之間執行差異。 然後針對沒有 hbase:meta
相符項目的 dirs,會讀取 regioninfo
中繼資料檔案,並在 hbase:meta
中重新建立特定區域。 區域會在 hbase:meta
資料表中以 CLOSED 狀態重新建立,但不會在 Masters
快取中重新建立。 它們也不會被指派。 若要讓這些區域上線,請執行此命令執行完成時所列印的 HBCK2 assigns
命令。
如果您使用 2.3.0 之前的 hbase 版本,在執行一組 assigns
輸出之前,需要輪流重新啟動 HMaster。 此範例會針對預設命名空間中的資料表 tbl_1
、命名空間 n1
中的 tbl_2
,以及命名空間 n2
的所有資料表,新增遺漏區域:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar addFsRegionsMissingInMeta default:tbl_1 n1:tbl_2 n2
會傳回 HBCK2 和具有所有重新插入區域的 assigns
命令。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <NAMESPACE|NAMESPACE:TABLENAME>
,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar addFsRegionsMissingInMeta -i fileName1 fileName2
extraRegionsInMeta <NAMESPACE|NAMESPACE:TABLENAME>... | -i <INPUT_FILE>...
選項:
-f, --fix
:藉由移除找到的所有額外區域來修正中繼。-i,--inputFiles
:接受命名空間或資料表名稱的一或多個輸入檔。
會報告存在於 hbase:meta
上但檔案系統上沒有相關目錄的區域。 需要 hbase:meta
上線。 針對以參數形式傳遞的每個資料表名稱,會在特定檔案系統上 hbase:meta
和區域 dirs 中可用的區域之間執行差異。 如果已傳遞 --fix
選項,則會從 Meta 中刪除額外的區域。
注意
在您決定使用 --fix
選項之前,請務必檢查回報的額外區域是否與現有的有效區域重疊。 如果是,則 extraRegionsInMeta --fix
是最佳解決方案。 否則,assigns
命令是更簡單的解決方案。 如果區域不存在,則會在檔案系統中重新建立區域 dirs。
此範例會針對預設命名空間下的 table_1
,以及命名空間 ns1
中的所有資料表,觸發額外區域報告:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar extraRegionsInMeta default:table_1 ns1
此範例會針對預設命名空間下的 table_1
,以及命名空間 ns1
中的所有資料表,觸發額外區域報告,具有修正選項:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar extraRegionsInMeta -f default:table_1 ns1
會針對以參數形式傳遞的每個資料表,或針對以參數形式指定的命名空間上的每個資料表,傳回額外區域清單。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <NAMESPACE|NAMESPACE:TABLENAME>
,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar extraRegionsInMeta -i fileName1 fileName2
fixMeta
注意
此選項不適用於 HBase 2.1.6。 不建議在 2.1.6 HBase 叢集上使用。
在 hbase:meta
中執行錯誤或不一致狀態的伺服器端修正。 Master UI 具有相符的新 HBCK Report
索引標籤,其會傾印最近執行 catalogjanitor
所產生的報告,以及新的 hbck chore
。
請務必先讓 hbase:meta
保持健康狀態,再進行任何其他修復。 會修正 holes
和 overlaps
,在 HDFS 中建立 (空白) 區域目錄,以符合新增至 hbase:meta
的區域。
此命令與名為 的舊 hbck1 命令不同。 其適用於上次 catalog_janitor
和 hbck chore
執行所產生的報告。 如果沒有可修正的項目,則執行是迴圈。 否則,如果 HBCK Report
UI 回報問題,則執行 fixMeta
會清除 hbase:meta
問題。
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar fixMeta
generateMissingTableDescriptorFile <NAMESPACE:TABLENAME>
此命令會藉由產生遺漏資料表描述項檔案,嘗試修正孤立資料表。 如果資料表資料夾遺漏或如果 .tableinfo
存在,此命令就沒有作用。 (我們不會覆寫現有的資料表描述項。)此命令會先檢查 HBase Master 中是否快取 TableDescriptor
,在此情況下,會據以復原 .tableinfo
。 如果未在 Master 中快取 TableDescriptor
,則會使用下列項目建立預設 .tableinfo
檔案:
- 資料表名稱。
- 根據檔案系統決定的資料行系列清單。
TableDescriptor
和ColumnFamilyDescriptors
的預設屬性。 如果使用預設參數產生.tableinfo
檔案,請務必在稍後檢查資料表或資料行系列屬性。 (視需要加以變更。)此方法不會變更 HBase 中的任何項目。 只會將新的.tableinfo
檔案寫入檔案系統。 例如對於孤立資料表,維持ServerCrashProcedures
,您可能需要在產生遺漏資料表資訊檔案之後修正錯誤。
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar generateMissingTableDescriptorFile namespace:table_name
replication [OPTIONS] [<NAMESPACE:TABLENAME>... | -i <INPUT_FILE>...]
選項:
-f, --fix
:修正任何找到的複寫問題。-i,--inputFiles
:接受一或多個資料表名稱的輸入檔。
會尋找未刪除的複寫佇列,並在其通過 --fix
選項時加以刪除。 會傳遞資料表名稱來檢查複寫屏障,並在 --fix
時清除。
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar replication namespace:table_name
如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <TABLENAME>
,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar replication -i fileName1 fileName2
setRegionState [<ENCODED_REGIONNAME> <STATE> | -i <INPUT_FILE>...]
選項:
-i,--inputFiles
:接受一或多個已編碼區域名稱和狀態的輸入檔。
可能的區域狀態:
- OFFLINE
- OPENING
- OPEN
- CLOSIN
- CLOSED
- SPLITTING
- SPLIT
- FAILED_OPEN
- FAILED_CLOSE
- MERGING
- MERGED
- SPLITTING_NEW
- MERGING_NEW
- ABNORMALLY_CLOSED
警告
這個具有風險的選項僅供作為最後手段使用。
範例案例包括無法前進的取消指派或指派,因為區域在 hbase:meta
中處於不一致的狀態。 例如,unassigns
命令只有在以下列其中一個狀態傳遞區域時才能繼續:SPLITTING、SPLIT、MERGING、OPEN 或 CLOSING。
使用此命令手動設定區域狀態之前,請證明此區域不會透過執行程序來進行處理,例如 assign
或 split
。 您可以使用 list_procedures
命令,取得 hbase 殼層中執行程序的檢視。 此範例會將區域 de00010733901a05f5a2a3a382e27dd4
設定為 CLOSING:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar setRegionState de00010733901a05f5a2a3a382e27dd4 CLOSING
如果區域狀態已變更且 1
,則會傳回 0
。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <ENCODED_REGIONNAME> <STATE>
,每行一對。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar setRegionState -i fileName1 fileName2
setTableState [<TABLENAME> <STATE> | -i <INPUT_FILE>...]
選項:
-i,--inputFiles
:接受一或多個資料表名稱和狀態的輸入檔。
可能的資料表狀態為 ENABLED、DISABLED、DISABLING 和 ENABLING。
若要讀取目前的資料表狀態,請在 hbase 殼層中執行:
hbase> get 'hbase:meta', '<TABLENAME>', 'table:state'
x08x00 == ENABLED、x08x01 == DISABLED 等等的值。也可以在殼層提示中執行 describe <TABLENAME>
。 這個範例會讓資料表名稱使用者成為 ENABLED:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar setTableState users ENABLED
會傳回先前的資料表狀態。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <TABLENAME> <STATE>
,每行一對。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar setTableState -i fileName1 fileName2
scheduleRecoveries <SERVERNAME>... | -i <INPUT_FILE>...
選項:
-i,--inputFiles
:接受一或多個伺服器名稱的輸入檔。
針對 RegionServers
的清單排程 ServerCrashProcedure(SCP)
。 將伺服器名稱格式化為 <HOSTNAME>,<PORT>,<STARTCODE>
。 (請參閱 HBase UI/logs。)
這個範例使用 RegionServer
a.example.org, 29100,1540348649479
:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar scheduleRecoveries a.example.org,29100,1540348649479
會傳回已建立 ServerCrashProcedures
的 PID,或者如果未建立任何程序則傳回 -1。 (請參閱 Master 記錄以取得為何未如此的原因。)在 HBase 2.0.3、2.1.2、2.2.0 或更新版本中新增命令支援。 如果已指定 -i or --inputFiles
,則會傳遞一或多個輸入檔案名稱。 每個檔案都包含 <SERVERNAME>
,每行一個。 例如:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar scheduleRecoveries -i fileName1 fileName2
修正問題
本節可協助您對常見問題進行疑難排解。
一般準則
當您進行修復時,請先確定 hbase:meta
一致,再修正任何其他問題類型,例如檔案系統偏差。 檔案系統中的偏差或指派的問題應在 hbase:meta
按順序整理好之後解決。 如果 hbase:meta
發生問題,則 Master 無法在採用孤立檔案系統資料或進行區域指派時進行適當的放置。
若未先透過 CLOSED 轉換,如果區域處於 CLOSING 狀態,則無法指派區域 (或者反過來,如果處於 OPENING 狀態則無法取消指派)。 區域必須一律從 CLOSED 移至 OPENING、移至 OPEN,然後再移至 CLOSING 和 CLOSED。
當您進行修復時,請一次修正一個資料表。
如果資料表為 DISABLED,則無法指派區域。 在 Master 記錄中,您會看到 Master 報告已略過,因為資料表為 DISABLED。 您可以指派區域,因為其目前處於 OPENING 狀態,而且您想要其處於 CLOSED 狀態,以便與資料表的 DISABLED 狀態一致。 在此情況下,您可能必須暫時將資料表狀態設定為 ENABLED,才能執行指派。 然後,您會在取消指派陳述式之後重新設定。 HBCK2 具有可讓您執行這項變更的設施。 請參閱 HBCK2 使用方式輸出。
指派和取消指派
一般而言,在指派時,Master 會持續存在直到成功為止。 指派會在區域上取得獨佔鎖定。 鎖定會防止並行指派或取消指派執行。 針對已鎖定區域的指派會等到鎖定釋放後再進行。
Master startup cannot progress, in holding-pattern until region online
:
2018-10-01 22:07:42,792 WARN org.apache.hadoop.hbase.master.HMaster: hbase:meta,1.1588230740 isn't online; state={1588230740 state=CLOSING, ts=1538456302300, server=ve1017.example.org,22101,1538449648131}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region online.
Master 無法繼續啟動,因為沒有指派 hbase:meta
(或 hbase:namespace
) 的程序。 若要插入一個程序,請使用 HBCK2 工具:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar assigns -skip 1588230740
在此範例中,1588230740 是 hbase:meta
區域的已編碼名稱。 傳遞 -skip
選項以阻止 HBCK2 對遠端 Master 執行版本檢查。 如果遠端 Master 未啟動,版本檢查會提示 Master is initializing response
或 PleaseHoldException
並卸除指派嘗試。 -skip
命令可避免版本檢查,並導入排程的指派。
hbase:namespace
系統資料表可能會發生相同的情況。 尋找 hbase:namespace
區域的已編碼區域名稱,並採取類似我們對 hbase:meta
所做的步驟。 在這個後者案例中,Master 實際上會列印類似此範例的實用訊息:
2019-07-09 22:08:38,966 WARN [master/localhost:16000:becomeActiveMaster] master.HMaster: hbase:namespace,,1562733904278.9559cf72b8e81e1291c626a8e781a6ae. isn't online; state={9559cf72b8e81e1291c626a8e781a6ae state=CLOSED, ts=1562735318897, server=null}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region onlined.
若要為上一個記錄行中指出的 hbase:namespace
資料表排程指派:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar -skip assigns 9559cf72b8e81e1291c626a8e781a6ae
傳遞命名空間區域的已編碼名稱。 (每個部署的已編碼名稱不同。)
hbase:meta region/table restore/rebuild 中的遺漏區域
某些不尋常的案例已從 hbase:meta
資料表中移除資料表區域。 這些案例的分級顯示其由操作員引發。 使用者針對 HBCK2 叢集執行過時的 HBCK1 OfflineMetaRepair 工具。 OfflineMetaRepair 是修正 HBase 1.x 版本上 hbase:meta
資料表相關問題的已知工具。 原始版本與 HBase 2.x 或更高版本不相容,而且已進行一些調整。 在極端情況下,現在可以透過 HBCK2 執行。
在大部分情況下,區域最終會隨機在 hbase:meta
中遺漏,但 hbase 也許仍可運作。 在這種情況下,您可以使用 HBCK2 中的 addFsRegionsMissingInMeta
命令,在線上使用 Master 來解決問題。 此命令相較於稍後涵蓋的完整 hbase:meta
重建,較不會造成對 hbase 的干擾。 甚至可以用於復原命名空間資料表區域。
hbase:meta region/table restore/rebuild 中的額外區域
在某些情況下,檔案系統中已移除資料表區域,但 hbase:meta
資料表上仍有相關項目。 此案例的發生原因可能是因為分割、手動作業錯誤 (例如手動刪除或移動區域 dir),或甚至是中繼資訊資料遺失問題 (例如 HBASE-21843)。
此類問題可以透過使用 HBCK2 中的 extraRegionsInMeta --fix
命令,在線上使用 Master 來解決。 此命令相較於稍後涵蓋的完整 hbase:meta
重建,較不會造成對 hbase 的干擾。 在不支援 fixMeta
HBCK2 選項的版本上發生這種情況時也很有用 (2.0.6、2.1.6、2.2.1、2.3.0 或 3.0.0 之前的任何版本)。
線上 hbase:meta 重建配方
如果 hbase:meta
損毀不嚴重,hbase 仍然可以讓它上線。 即使命名空間區域位於遺漏區域之間,在初始化期間仍可掃描 hbase:meta
,其中 Master 正在等候指派命名空間。 若要確認這種情況,可以執行 hbase:meta
掃描命令。 如果未逾時或顯示任何錯誤,則 hbase:meta
已上線:
echo "scan 'hbase:meta', {COLUMN=>'info:regioninfo'}" | hbase shell
如果訊息未顯示任何錯誤,則可以使用 HBCK2 addFsRegionsMissingInMeta
。 會讀取 FS 區域目錄上可用的區域中繼資料資訊,以在 hbase:meta
中重新建立區域。 因為其可以使用 hbase 部分運作來執行,因此會嘗試停用受回報問題影響的線上資料表,並將區域重新新增至 hbase:meta
。 可以檢查特定資料表或命名空間,或來自所有命名空間的所有資料表。 此範例會針對預設命名空間中的資料表 tbl_1
、命名空間 n1
中的 tbl_2
,以及命名空間 n2
的所有資料表,顯示新增遺漏區域:
hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar addFsRegionsMissingInMeta default:tbl_1 n1:tbl_2 n2
因為其與 Master 為獨立運作,在順利完成之後,需要執行更多步驟才能指派已重新新增的區域。 訊息如下所列:
addFsRegionsMissingInMeta
輸出指派命令,其中包含已重新新增的所有區域。 此命令稍後必須執行,因此請複製並儲存以方便使用。- 針對 2.3.0 之前的 HBase 版本,在順利完成
addFsRegionsMissingInMeta
並儲存輸出之後,請重新啟動所有執行中的 HBase Master。
重新啟動 Master 且 hbase:meta
已上線之後 (檢查 Web UI 是否可存取),請從先前儲存的 addFsRegionsMissingInMeta
輸出執行指派命令。
注意
如果命名空間區域位於遺漏區域之間,您必須在傳回的指派命令開頭新增 --skip
旗標。
如果叢集遭受 hbase:meta
資料表的災難性損失,可以使用下列配方進行粗略重建。 概要來說,我們會停止叢集。 執行 HBCK2 OfflineMetaRepair 工具,這會將已卸除的目錄和中繼資料讀取至檔案系統,並盡最大努力重新建構可行的 hbase:met
資料表。 重新啟動您的叢集。 插入指派,讓系統命名空間資料表上線。 最後,重新指派您想要啟用的使用者空間資料表。 (重建 hbase:meta
會建立資料表,所有資料表離線且未指派任何區域。)
詳細的重建配方
注意
僅使用此選項作為最後手段。 不建議這樣做。
停止叢集。
從 HBCK2 執行重建
hbase:meta
命令。 這個命令會將原始hbase:meta
移開,並放置新重建的項目。 這個範例示範如何執行工具。 這會新增-details
旗標,讓工具將資訊傾印在 HDFS 中找到的區域:hbase --config /etc/hbase/conf -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar org.apache.hbase.hbck1.OfflineMetaRepair -details
啟動叢集。 不會完全啟動。 因為命名空間資料表不在線上,而且此應變的程序存放區中沒有指派程序,所以會停滯。 HBase Master 記錄會顯示此狀態。 此範例顯示其記錄的內容:
2019-07-10 18:30:51,090 WARN [master/localhost:16000:becomeActiveMaster] master.HMaster: hbase:namespace,,1562808216225.725a0fe6c2c869d3d0a9ed82bfa80fa3. isn't online; state={725a0fe6c2c869d3d0a9ed82bfa80fa3 state=CLOSED, ts=1562808619952, server=null}; ServerCrashProcedures=false. Master startup can't progress, in holding-pattern until region onlined.
若要指派命名空間資料表區域,您無法使用殼層。 如果您使用殼層,則會因為 Master 尚未啟動而失敗且有
PleaseHoldException
。 (其在宣告自己「啟動」之前正在等待命名空間資料表上線。) 您必須使用 HBCK2 指派命令。 若要指派,您需要命名空間已編碼名稱。 其會顯示在引用的記錄中。 在此案例中為725a0fe6c2c869d3d0a9ed82bfa80fa3
。 您必須傳遞-skip
命令,才能略過 Master 版本檢查。 (如果沒有該項目,您的 HBCK2 叫用會引發PleaseHoldException
,因為 Master 尚未啟動。)此範例會新增命名空間資料表的指派:hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar -skip assigns 725a0fe6c2c869d3d0a9ed82bfa80fa3
如果叫用傳回
Connection refused
,Master 是否已啟動? 如果 Master 無法自行初始化,則會在一段時間後關機。 重新啟動叢集/Master,然後重新執行指派命令。當指派成功執行時,您會看到其發出類似下列範例的內容。 結尾的
48
是指派程序排程的 PID。 如果傳回的 PID 為-1
,則 Master 啟動尚未達到足夠的進度,因此請重試。 或者,已編碼區域名稱可能不正確,因此請檢查此問題。hbase --config /etc/hbase/conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.x.x-SNAPSHOT.jar -skip assigns 725a0fe6c2c869d3d0a9ed82bfa80fa3
18:40:43.817 [main] WARN org.apache.hadoop.util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 18:40:44.315 [main] INFO org.apache.hbase.HBCK2 - hbck sufpport check skipped [48]
檢查 Master 記錄。 Master 應該已啟動。 您會看到成功完成 PID=48。 尋找類似此範例的一行,以確認成功啟動 Master:
master.HMaster: Master has completed initialization 132.515sec
可能需要一些時間才會顯示。
hbase:meta
的重建會以 DISABLED 狀態新增使用者資料表,以及以 CLOSED 模式新增區域。 透過殼層重新啟用資料表,讓所有資料表區域重新上線。 一次執行一個,或查看全部啟用 ".*" 命令一次啟用所有資料表。重建中繼遺漏編輯,而且可能需要使用本文先前所述的設施進行後續修復和清除。
已卸除參考檔案、遺漏 hbase.version 檔案和損毀的檔案
HBCK2 可以檢查是否有停止回應的參考和損毀的檔案。 您可以要求其將錯誤檔案排在旁邊,可能需要克服區域不會上線或讀取失敗的艱難。 請參閱 HBCK2 清單中的檔案系統命令。 傳遞一或多個資料表名稱 (或使用 none
來檢查所有資料表)。 報告錯誤檔案。 傳遞 --fix
選項進行修復。
程序重新啟動
作為最後手段,如果 Master 雜亂且所有修復嘗試只會打開無法完成的可復原鎖定或程序,或者如果一組 MasterProcWALs
在沒有界限的情況下成長,則可以抹除 Master 狀態。 將 /hbase/MasterProcWALs/
目錄移至 HBase 安裝下,然後重新啟動 Master 程序。 其會以表格式格式傳回,不需要記憶體。
如果在清除所有區域時愉快地指派或離線,在 Master 重新啟動時,Master 應該會繼續,就像什麼事都沒發生一樣。 但是,如果當時有區域正在轉換,操作員必須進行干預,將未完成的指派或取消指派帶給其終端點。
閱讀所述的 hbase:meta
info:state
資料行,以判斷需要指派或取消指派的內容。 將 MasterProcWALs
移開來清除所有歷程記錄之後,應該就不會有任何實體遭到鎖定,因此您可以自由大量指派或取消指派。