如何在 Azure HDInsight 叢集中使用 Apache Hive 複寫
在資料庫和倉儲的內容中,複寫是將實體從一個倉儲複製到另一個倉儲的程序。 複製可套用至整個資料庫或較小的層級,例如資料表或分割區。 目標是要有一個複本會隨著基底實體變更而變更。 Apache Hive 上的複寫著重於災害復原,並提供單向的主要複本複寫。 在 HDInsight 叢集中,Hive 複寫可用來單向複寫 Hive 中繼存放區和 Azure Data Lake Storage Gen2 上相關聯的基礎資料湖。
Hive 複寫經過多年的演進,已有較新的版本提供更理想的功能,且速度更快,資源耗用量更低。 在本文中,我們會討論 HDInsight 3.6 和 HDInsight 4.0 叢集類型支援的 Hive 複 (Replv2)
寫。
優點 replv2
Hive ReplicationV2 (也稱為 Replv2
)在使用 Hive IMPORT-EXPORT 的第一個 Hive 複寫版本上具有下列優點:
- 事件架構累加複寫
- 時間點複寫
- 降低頻寬需求
- 減少中繼複本的數目
- 維持複寫狀態
- 限制式複寫
- 支援中樞和輪輻模型
- 支援 ACID 資料表 (在 HDInsight 4.0 中)
複寫階段
Hive 事件型複寫是在主要叢集和次要叢集之間設定的。 此複寫包含兩個不同的階段:啟動載入和累加執行。
啟動
啟動載入會執行一次,以將資料庫的基底狀態從主要資料庫複寫到次要資料庫。 如有需要,您可以設定啟動載入,以在需要啟用複寫的目標資料庫中包含資料表的子集。
累加執行
啟動載入之後,累加執行是在主要叢集上自動進行,而累加執行期間所產生的事件則是在次要叢集上播放。 當次要叢集趕上主要叢集時,次要叢集會與主要叢集的事件達成一致。
複寫命令
Hive 提供一組 REPL 命令 (DUMP
、LOAD
和 STATUS
) 來協調事件的流程。 DUMP
命令會產生主要叢集上所有 DDL/DML 事件的本機記錄。 LOAD
命令是會以延遲方式將記錄的中繼資料和資料複製至已擷取的複寫傾印輸出的方法,會在目標叢集上執行。 STATUS
命令會從目標叢集執行,以提供最新複寫負載已成功複寫的最新事件識別碼。
設定複寫來源
開始複寫之前,請確定要複寫的資料庫已設定為複寫來源。 您可以使用 DESC DATABASE EXTENDED <db_name>
命令來確認參數 repl.source.for
是否以原則名稱設定。
如果已排程原則,而 repl.source.for
參數未設定,則您必須先使用 ALTER DATABASE <db_name> SET DBPROPERTIES ('repl.source.for'='<policy_name>')
設定此參數。
ALTER DATABASE tpcds_orc SET DBPROPERTIES ('repl.source.for'='replpolicy1')
將中繼資料傾印至資料湖
REPL DUMP [database name]. => location / event_id
命令會在啟動程序階段中用來將相關的中繼資料傾印至 Azure Data Lake Storage Gen2。 event_id
會指定將相關中繼資料放入 Azure Data Lake Storage Gen2 中的最小事件。
repl dump tpcds_orc;
範例輸出︰
dump_dir | last_repl_id |
---|---|
/tmp/hive/repl/38896729-67d5-41b2-90dc-46eeed4c5dd0 | 2925 |
將資料載入目標叢集
REPL LOAD [database name] FROM [ location ] { WITH ( ‘key1’=‘value1’{, ‘key2’=‘value2’} ) }
命令可用來將資料載入目標叢集中,以進行複寫的啟動程序和累加階段。 [database name]
可以與來源相同,也可以是目標叢集上的不同名稱。 [location]
代表來自先前 REPL DUMP
命令的輸出位置。 這表示目標叢集應該能夠與來源叢集聯繫。 新增 WITH
子句主要是用來防止目標叢集重新啟動,以允許複寫。
repl load tpcds_orc from '/tmp/hive/repl/38896729-67d5-41b2-90dc-46eeed4c5dd0';
輸出最後一個複寫的事件識別碼
REPL STATUS [database name]
命令會在目標叢集上執行,並輸出最後一個複寫的 event_id
。 此命令也可讓使用者知道其目標叢集復寫到哪些狀態。 您可以使用此命令的輸出來建構下一個用於累加複寫的 REPL DUMP
命令。
repl status tpcds_orc;
範例輸出︰
last_repl_id |
---|
2925 |
將相關的資料和中繼資料傾印至資料湖
REPL DUMP [database name] FROM [event-id] { TO [event-id] } { LIMIT [number of events] }
命令可用來將相關的中繼資料和資料傾印至 Azure Data Lake Storage。 此命令用於累加階段,且會在來源倉儲上執行。 累加階段需要 FROM [event-id]
,而 event-id
的值可藉由在目標倉儲上執行 REPL STATUS [database name]
命令來衍生。
repl dump tpcds_orc from 2925;
範例輸出︰
dump_dir | last_repl_id |
---|---|
/tmp/hive/repl/38896729-67d5-41b2-90dc-466466agadd0 | 2960 |
Hive 複寫程序
下列步驟是在 Hive 複寫程序期間發生的循序事件。
確定要複寫的資料表已設定為特定原則的複寫來源。
使用相關條件約束對主要叢集發出
REPL_DUMP
命令,例如資料庫名稱、事件識別碼範圍,以及 Azure Data Lake Storage Gen2 儲存體 URL。系統會將中繼存放區中所有追蹤事件的傾印序列化為最新的。 此傾印會儲存在主要叢集上的 Azure Data Lake Storage Gen2 儲存體帳戶中 (位於
REPL_DUMP
所指定的 URL 上)。主要叢集會將複寫中繼資料保存到主要叢集的 Azure Data Lake Storage Gen2 儲存體。 路徑可在 Ambari 的 Hive 設定 UI 中設定。 此程序會提供中繼資料儲存所在的路徑,以及最新追蹤的 DML/DDL 事件的識別碼。
REPL_LOAD
命令會從次要叢集發出。 此命令指向步驟 3 中設定的路徑。次要叢集會讀取中繼資料檔案,其中包含在步驟 3 中建立的追蹤事件。 請確定次要叢集可透過網路連線至從
REPL_DUMP
追蹤的事件儲存所在之主要叢集的 Azure Data Lake Storage Gen2 儲存體。次要叢集會繁衍分散式複製 (
DistCP
) 計算。次要叢集會從主要叢集的儲存體複製資料。
次要叢集上的中繼存放區會更新。
最後追蹤的事件識別碼會儲存在主要中繼存放區中。
累加複寫會依循相同的程序,且必須以最後一個複寫的事件識別碼作為輸入。 這會導致上次複寫事件之後的累加複製。 累加複寫通常會以預先決定的頻率自動執行,以達到所需的復原點目標 (RPO)。
複寫模式
複寫通常會以單向的方式設定於主要和次要叢集之間,此時,主要叢集會處理讀取和寫入要求。 次要叢集只會處理讀取要求。 如果發生災害,次要叢集會允許寫入,但必須將反向複寫重新設定為主要叢集。
有許多適用於 Hive 複寫的模式,包括「主要-次要」、「中樞和輪輻」,以及「轉送」。
在 HDInsight 中,「作用中主要-待命次要」是常見的商務持續性和災害復原 (BCDR) 模式,HiveReplicationV2 可透過 VNet 對等互連將此模式與區域分隔的 HDInsight Hadoop 叢集搭配使用。 對等互連到這兩個叢集的通用虛擬機器,可用來裝載複寫自動化指令碼。 如需與可能的 HDInsight BCDR 模式有關的詳細資訊,請參閱 HDInsight 商務持續性文件。
使用企業安全性套件的 Hive 複寫
如果在使用企業安全性套件的 HDInsight Hadoop 叢集上規劃 Hive 複寫,您必須考量 Ranger 中繼存放區和 Microsoft Entra Domain Services 的複寫機制。
使用 Microsoft Entra Domain Services 複本集功能,為每個跨多個區域的 Microsoft Entra 租用戶建立多個 Microsoft Entra Domain Services 複本集。 每個個別的複本集都必須與其各自區域中的 HDInsight VNet 對等互連。 在此設定中,會使用 Microsoft Entra Domain Services 複寫,將對 Microsoft Entra Domain Service 的變更 (包括設定、使用者識別和認證、群組、群組原則物件、電腦物件和其他變更) 套用至受控網域中的所有複本集。
Ranger 原則可以定期備份,並使用 Ranger 匯入-匯出功能從主要叢集複寫到次要叢集。 您可以根據您想要在次要叢集上實作的授權層級,選擇複寫所有或一部分的 Ranger 原則。
範例指令碼
下列程式碼序列提供了範例,說明如何在名為 tpcds_orc
的範例資料表上實作啟動載入和累加複寫。
將資料表設定為複寫原則的來源。
ALTER DATABASE tpcds_orc SET DBPROPERTIES ('repl.source. for'='replpolicy1');
主要叢集上的啟動程序傾印。
repl dump tpcds_orc with ('hive.repl.rootdir'='/tmpag/hiveag/replag');
範例輸出︰
dump_dir last_repl_id /tmpag/hiveag/replag/675d1bea-2361-4cad-bcbf-8680d305a27a 2925 次要叢集上的啟動程序載入。
repl load tpcds_orc from '/tmpag/hiveag/replag 675d1bea-2361-4cad-bcbf-8680d305a27a';
檢查次要叢集上的
REPL
狀態。repl status tpcds_orc;
last_repl_id 2925 主要叢集上的累加傾印。
repl dump tpcds_orc from 2925 with ('hive.repl.rootdir'='/tmpag/hiveag/ replag');
範例輸出︰
dump_dir last_repl_id /tmpag/hiveag/replag/31177ff7-a40f-4f67-a613-3b64ebe3bb31 2960 次要叢集的累加載入。
repl load tpcds_orc from '/tmpag/hiveag/replag/31177ff7-a40f-4f67-a613-3b64ebe3bb31';
檢查次要叢集上的
REPL
狀態。repl status tpcds_orc;
last_repl_id 2960
下一步
若要深入了解本文中討論的項目,請參閱: