將 Apache HBase 叢集移轉至新的版本
本文討論如何將 Azure HDInsight 上的 Apache HBase 叢集更新為較新版本。
本文僅適用於在來源和目的地叢集使用相同 Azure 儲存體帳戶的情況。 若要在目的地叢集使用新的或不同儲存體帳戶進行升級,請參閱使用新的儲存體帳戶將 Apache HBase 移轉至新版本。
升級時的停機時間應該只有幾分鐘的時間。 這個停機時間是因排清所有記憶體內部資料的步驟,以及在新叢集上設定及重新啟動服務的時間所造成。 您的結果會依節點數目、資料量和其他變數而有所不同。
檢閱 Apache HBase 相容性
在升級 Apache HBase 之前,請確認來源和目的地叢集上的 HBase 版本相容。 請檢閱 HBase 版本相容性矩陣和 HBase 參考指南 中的版本資訊,以確定您的應用程式與新版本相容。
以下為範例相容性矩陣。 Y 表示相容性,而 N 表示潛在的不相容性:
相容性類型 | 主要版本 | 次要版本 | Patch |
---|---|---|---|
用戶端-伺服器連線相容性 | 否 | 是 | Y |
伺服器-伺服器相容性 | 否 | 是 | Y |
檔案格式相容性 | 否 | 是 | Y |
用戶端 API 相容性 | 否 | 是 | Y |
用戶端二進位相容性 | N | N | 是 |
伺服器端有限的 API 相容性 | |||
穩定 | 否 | 是 | Y |
發展中 | N | N | 是 |
不穩定 | N | N | N |
相依性相容性 | 否 | 是 | Y |
作業相容性 | N | N | 是 |
如需關於 HDInsight 版本和相容性的更多資訊,請參閱 Azure HDInsight 版本。
Apache HBase 叢集移轉概觀
若要升級 Azure HDInsight 上的 Apache HBase 叢集,請完成下列基本步驟。 如需詳細指示,請參閱詳細步驟和命令,或使用使用指令碼移轉 HBase 一節的指令碼進行自動移轉。
準備來源叢集:
- 停止擷取。
- 排清 memstore 資料。
- 停止 Ambari 的 HBase。
- 對於具有加速寫入的叢集,請備份「預寫記錄檔 (WAL)」目錄。
準備目的地叢集:
- 建立目的地叢集。
- 停止 Ambari 的 HBase。
- 更新 HDFS 服務組態中的
fs.defaultFS
,以參考原始來源叢集容器。 - 對於具有加速寫入的叢集,請更新 HBase 服務設定中的
hbase.rootdir
以參考原始來源叢集容器。 - 清除 Zookeeper 資料。
完成移轉:
- 清除並移轉 WAL。
- 將應用程式從目的地叢集的預設容器複製到原始來源容器。
- 從 Ambari 目的地叢集啟動所有服務。
- 驗證 HBase。
- 刪除來源叢集。
詳細的移轉步驟和命令
使用這些詳細的步驟和命令移轉 Apache HBase 叢集。
準備來源叢集
停止擷取來源 HBase 叢集。
排清您要升級的來源 HBase 叢集。
HBase 會將傳入資料寫入名為 memstore 的記憶體內部存放區中。 memstore 觸達特定的大小之後,HBase 會將 memstore 排清到磁碟,以長期儲存在叢集的儲存體帳戶中。 升級之後若刪除來源叢集,也會刪除 memstores 中的所有資料。 若要保留資料,請先將每個資料表的 memstore 手動排清到磁碟再進行升級。
您可以從Azure hbase-utils GitHub 存放庫執行 flush_all_tables.sh 指令碼,以排清 memstore 資料。
您也可以從 HDInsight 叢集執行下列 HBase 殼層命令來排清 memstore 資料:
hbase shell flush "<table-name>"
透過
https://<OLDCLUSTERNAME>.azurehdinsight.net
登入舊叢集上的 Apache Ambari,並停止 HBase 服務。在確認提示字元中,選取方塊以開啟 HBase 的維護模式。
如需連線至 Ambari 及使用 Ambari 的詳細資訊,請參閱使用 Ambari Web UI 管理 HDInsight 叢集。
如果您的來源 HBase 叢集沒有加速寫入功能,請略過此步驟。 針對具有加速寫入的來源 HBase 叢集,請在來源叢集的任何 Zookeeper 節點或背景工作節點上,從 SSH 工作階段執行下列命令,以備份 HDFS 下的 WAL 目錄。
hdfs dfs -mkdir /hbase-wal-backup hdfs dfs -cp hdfs://mycluster/hbasewal /hbase-wal-backup
準備目的地叢集
在 Azure 入口網站中,使用與來源叢集相同的儲存體帳戶來設定新的目的地 HDInsight 叢集,但使用不同的容器名稱:
在
https://<NEWCLUSTERNAME>.azurehdinsight.net
的新叢集上登入 Apache Ambari,並停止 HBase 服務。在 Services>HDFS>Configs>Advanced>Advanced core-site 下,變更
fs.defaultFS
HDFS 設定以指向原始來源叢集容器名稱。 例如,下列螢幕擷取畫面中的設定應該變更為wasbs://hbase-upgrade-old-2021-03-22
。如果您的目的地叢集具有加速寫入功能,請變更
hbase.rootdir
路徑以指向原始來源叢集容器名稱。 例如,下列路徑應變更為hbase-upgrade-old-2021-03-22
。 如果您的叢集沒有加速寫入,請略過此步驟。在任何 Zookeeper 節點或背景工作角色節點中執行下列命令,以清除目的地叢集上的 Zookeeper 資料:
hbase zkcli rmr /hbase-unsecure quit
清除和移轉 WAL
根據您的來源 HDI 版本,以及來源和目的地叢集是否有加速寫入,執行下列命令。
- 目的地叢集一律為 HDI 4.0 版,由於 HDI 3.6 屬於基本支援,因此不建議用於新的叢集。
- HDFS 複製命令為
hdfs dfs <copy properties starting with -D> -cp <source> <destination> # Serial execution
。
注意
- WASB 類型儲存體的
<source-container-fullpath>
為wasbs://<source-container-name>@<storageaccountname>.blob.core.windows.net
。 - Azure Data Lake Storage Gen2 儲存體類型的
<source-container-fullpath>
為abfs://<source-container-name>@<storageaccountname>.dfs.core.windows.net
。
- 來源叢集是具有加速寫入的 HDI 3.6,且目的地叢集具有加速寫入。
- 來源叢集是沒有加速寫入的 HDI 3.6,且目的地叢集具有加速寫入。
- 來源叢集是沒有加速寫入的 HDI 3.6,且目的地叢集沒有加速寫入。
- 來源叢集是具有加速寫入的 HDI 4.0,且目的地叢集具有加速寫入。
- 來源叢集是沒有加速寫入的 HDI 4.0,且目的地叢集具有加速寫入。
- 來源叢集是沒有加速寫入的 HDI 4.0,且目的地叢集沒有加速寫入。
來源叢集為具有加速寫入的 HDI 3.6 或 HDI 4.0,且目的地叢集具有加速寫入
清除目的地叢集的 WAL FS 資料,並將來源叢集的 WAL 目錄複製到目的地叢集的 HDFS。 在目的地叢集上的任何 Zookeeper 節點或背景工作節點中,執行下列命令以複製目錄:
sudo -u hbase hdfs dfs -rm -r hdfs://mycluster/hbasewal
sudo -u hbase hdfs dfs -cp <source-container-fullpath>/hbase-wal-backup/hbasewal hdfs://mycluster/
來源叢集是沒有加速寫入的 HDI 3.6,且目的地叢集具有加速寫入
清除目的地叢集的 WAL FS 資料,並將來源叢集的 WAL 目錄複製到目的地叢集的 HDFS。 在目的地叢集上的任何 Zookeeper 節點或背景工作節點中,執行下列命令以複製目錄:
sudo -u hbase hdfs dfs -rm -r hdfs://mycluster/hbasewal
sudo -u hbase hdfs dfs -Dfs.azure.page.blob.dir="/hbase/WALs,/hbase/MasterProcWALs,/hbase/oldWALs" -cp <source-container>/hbase/*WALs hdfs://mycluster/hbasewal
來源叢集是沒有加速寫入的 HDI 3.6,且目的地叢集沒有加速寫入
清除目的地叢集的 WAL FS 資料,並將來源叢集 WAL 目錄複製到目的地叢集的 HDFS。 若要複製目錄,請在目的地叢集上的任何 Zookeeper 節點或背景工作節點中執行下列命令:
sudo -u hbase hdfs dfs -rm -r /hbase-wals/*
sudo -u hbase hdfs dfs -Dfs.azure.page.blob.dir="/hbase/WALs,/hbase/MasterProcWALs,/hbase/oldWALs" -cp <source-container-fullpath>/hbase/*WALs /hbase-wals
來源叢集是沒有加速寫入的 HDI 4.0,且目的地叢集具有加速寫入
清除目的地叢集的 WAL FS 資料,並將來源叢集的 WAL 目錄複製到目的地叢集的 HDFS。 在目的地叢集上的任何 Zookeeper 節點或背景工作節點中,執行下列命令以複製目錄:
sudo -u hbase hdfs dfs -rm -r hdfs://mycluster/hbasewal
sudo -u hbase hdfs dfs -cp <source-container-fullpath>/hbase-wals/* hdfs://mycluster/hbasewal
來源叢集是沒有加速寫入的 HDI 4.0,且目的地叢集沒有加速寫入
清除目的地叢集的 WAL FS 資料,並將來源叢集 WAL 目錄複製到目的地叢集的 HDFS。 若要複製目錄,請在目的地叢集上的任何 Zookeeper 節點或背景工作節點中執行下列命令:
sudo -u hbase hdfs dfs -rm -r /hbase-wals/*
sudo -u hbase hdfs dfs -Dfs.azure.page.blob.dir="/hbase-wals" -cp <source-container-fullpath>/hbase-wals /
完成移轉
使用
sudo -u hdfs
使用者內容,將資料夾/hdp/apps/<new-version-name>
及其內容從<destination-container-fullpath>
複製到<source-container-fullpath>
下的/hdp/apps
資料夾。 您可以在目的地叢集上執行下列命令來複製資料夾:sudo -u hdfs hdfs dfs -cp /hdp/apps/<hdi-version> <source-container-fullpath>/hdp/apps
例如:
sudo -u hdfs hdfs dfs -cp /hdp/apps/4.1.3.6 wasbs://hbase-upgrade-old-2021-03-22@hbaseupgrade.blob.core.windows.net/hdp/apps
在目的地叢集上,儲存您的變更,並依照 Ambari 提示重新啟動所有必要的服務。
將您的應用程式指向目的地叢集。
注意
您應用程式的靜態 DNS 名稱會在升級時變更。 您不必將此 DNS 名稱寫入程式碼,而是可以在網域名稱的 DNS 設定中設定 CNAME,以指向叢集的名稱。 另一個選項是使用您應用程式的組態檔,以便您無須重新部署即可進行更新。
啟動擷取。
驗證 HBase 一致性以及簡單的資料定義語言 (DDL) 和資料操作語言 (DML) 作業。
如果目的地叢集狀態理想,即可刪除來源叢集。
使用指令碼移轉 HBase
在來源叢集上執行指令碼 migrate-hbase-source.sh,並在目的地叢集上執行 migrate-hbase-dest.sh。 使用下列指示來執行這些指令碼。
注意
這些指令碼不會複製 HBase 舊 WAL 作為移轉的一部分;因此,指令碼不會用於已啟用 HBase 備份或複寫功能的叢集。
在來源叢集上
sudo bash migrate-hbase-source.sh
在目的地叢集上
sudo bash migrate-hbase-dest.sh -f <src_default_Fs>
上述命令的必要引數:
-f, --src-fs
The fs.defaultFS of the source cluster
For example:
-f wasb://anynamehbase0316encoder-2021-03-17t01-07-55-935z@anynamehbase0hdistorage.blob.core.windows.net
下一步
若要深入了解 Apache HBase 和升級 HDInsight 叢集,請參閱下列文章: