從 Apache Hive 遷移結構定義與資料

本文件說明如何將資料、安全性設定和管道從 Apache Hive 遷移至 BigQuery。

您也可以使用批次 SQL 翻譯大量遷移 SQL 指令碼,或是使用互動式 SQL 翻譯翻譯臨時查詢。這兩項 SQL 轉譯服務都全面支援 Apache HiveQL。

準備遷移

以下各節將說明如何收集表格統計資料、中繼資料和安全性設定的相關資訊,協助您將資料倉儲從 Hive 遷移至 BigQuery。

收集來源資料表資訊

收集來源 Hive 資料表的相關資訊,例如資料表的列數、欄數、資料欄類型、大小、資料輸入格式和位置。這項資訊可用於遷移程序,也可以驗證資料遷移作業。如果您在名為 corp 的資料庫中擁有名為 employees 的 Hive 資料表,請使用下列指令收集資料表資訊:

# Find the number of rows in the table
hive> SELECT COUNT(*) FROM corp.employees;

# Output all the columns and their data types
hive> DESCRIBE corp.employees;

# Output the input format and location of the table
hive> SHOW CREATE TABLE corp.employees;
Output:
…
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION
  'hdfs://demo_cluster/user/hive/warehouse/corp/employees'
TBLPROPERTIES (# Get the total size of the table data in bytes
shell> hdfs dfs -du -s TABLE_LOCATION

來源表格格式轉換

部分 Hive 支援的格式無法直接擷取至 BigQuery。

Hive 支援以下格式的資料儲存:

  • 文字檔
  • RC 檔案
  • 序列檔案
  • Avro 檔案
  • ORC 檔案
  • Parquet 檔案

BigQuery 支援使用下列任何一種檔案格式,從 Cloud Storage 載入資料:

  • CSV
  • JSON (以換行符號分隔)
  • Avro
  • ORC
  • Parquet

BigQuery 可直接載入 Avro、ORC 和 Parquet 格式的資料檔案,不必使用結構定義檔。如果文字檔案的格式不是 CSV 或 JSON (以換行符號分隔),您可以將資料複製到 Hive 資料表的 Avro 格式,也可以將資料表結構轉換為 BigQuery JSON 結構,以便在擷取時提供。

收集 Hive 存取權控管設定

Hive 和 BigQuery 採用不同的存取權控管機制。收集所有 Hive 存取權控制設定,例如角色、群組、成員,以及授予這些項目的權限。在 BigQuery 中依資料集層級對應安全性模型,並導入精細的 ACL。舉例來說,Hive 使用者可以對應至 Google 帳戶,而 HDFS 群組則可對應至 Google 群組。您可以在資料集層級設定存取權。使用下列指令收集 Hive 中的存取控制設定:

# List all the users
> hdfs dfs -ls /user/ | cut -d/ -f3

# Show all the groups that a specific user belongs to
> hdfs groups user_name

# List all the roles
hive> SHOW ROLES;

# Show all the roles assigned to a specific group
hive> SHOW ROLE GRANT GROUP group_name

# Show all the grants for a specific role
hive> SHOW GRANT ROLE role_name;

# Show all the grants for a specific role on a specific object
hive> SHOW GRANT ROLE role_name on object_type object_name;

在 Hive 中,如果您具備必要權限,即可直接存取資料表後方的 HDFS 檔案。在標準 BigQuery 資料表中,資料載入資料表後,就會儲存在 BigQuery 儲存空間中。您可以使用 BigQuery Storage Read API 讀取資料,但仍會強制執行所有 IAM、資料列和資料欄層級安全性。如果您使用 BigQuery 外部資料表查詢 Cloud Storage 中的資料,Cloud Storage 的存取權也會受到 IAM 控制。

您可以建立 BigLake 資料表,讓您使用連接器,透過 Apache Spark、Trino 或 Apache Hive 查詢資料。BigQuery Storage API 會針對 Cloud Storage 或 BigQuery 中的所有 BigLake 資料表,強制執行資料列和資料欄層級的管理政策。

資料遷移

將 Hive 資料從內部部署或其他雲端來源叢集遷移至 BigQuery 有兩個步驟:

  1. 將資料從來源叢集複製到 Cloud Storage
  2. 將資料從 Cloud Storage 載入至 BigQuery

以下各節將說明如何遷移 Hive 資料、驗證已遷移的資料,以及處理持續攝入資料的遷移作業。這些範例是針對非 ACID 資料表編寫。

分割欄資料

在 Hive 中,分區資料表中的資料會儲存在目錄結構中。資料表的每個分區都會與分區欄的特定值相關聯。資料檔案本身不含任何分割欄資料。使用 SHOW PARTITIONS 指令,即可列出分區資料表中的不同分區。

以下範例顯示來源 Hive 資料表是以 joining_datedepartment 資料欄分區。這個表格底下的資料檔案不含任何與這兩個資料欄相關的資料。

hive> SHOW PARTITIONS corp.employees_partitioned
joining_date="2018-10-01"/department="HR"
joining_date="2018-10-01"/department="Analyst"
joining_date="2018-11-01"/department="HR"

複製這些欄的方法之一,是在將分區資料表轉換為非分區資料表後,再將其載入至 BigQuery:

  1. 建立結構定義類似分區資料表的非分區資料表。
  2. 將資料從來源分區資料表載入至非分區資料表。
  3. 將處於暫存狀態的非分區資料表下方的這些資料檔案複製到 Cloud Storage。
  4. 使用 bq load 指令將資料載入 BigQuery,並提供 TIMESTAMPDATE 類型分區欄 (如有) 的名稱做為 time_partitioning_field 引數。

將資料複製到 Cloud Storage

資料遷移的第一步是將資料複製到 Cloud Storage。使用 Hadoop DistCp,將資料從內部部署或其他雲端叢集複製到 Cloud Storage。將資料儲存在與 BigQuery 資料集相同的地區或多地區值區中。舉例來說,如果您想使用位於東京地區的現有 BigQuery 資料集做為目的地,就必須選擇位於東京的 Cloud Storage 區域值區來儲存資料。

選取 Cloud Storage 值區位置後,您可以使用下列指令,列出 employees Hive 資料表位置的所有資料檔案:

> hdfs dfs -ls hdfs://demo_cluster/user/hive/warehouse/corp/employees
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000000_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000001_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000002_0

將上述所有檔案複製到 Cloud Storage:

> hadoop distcp
hdfs://demo_cluster/user/hive/warehouse/corp/employees
gs://hive_data/corp/employees

請注意,您必須依據資料儲存空間定價付費,才能在 Cloud Storage 中儲存資料。

暫存目錄可能會保存為查詢工作建立的中繼檔案。請務必先刪除所有這類目錄,再執行 bq load 指令。

正在載入資料

BigQuery 支援以多種格式批次載入資料,這些資料來自 Cloud Storage。請先確認要將資料載入的 BigQuery 資料集已存在,再建立載入工作。

下列指令會顯示從 Hive 複製的非 ACID 資料表資料:

> gcloud storage ls gs://hive_data/corp/employees/
gs://hive-migration/corp/employees/
gs://hive-migration/corp/employees/000000_0
gs://hive-migration/corp/employees/000001_0
gs://hive-migration/corp/employees/000002_0

如要將 Hive 資料載入 BigQuery,請使用 bq load 指令。您可以在網址中使用萬用字元 *,從共用相同物件前置字元的多個檔案載入資料。舉例來說,您可以使用下列指令載入共用前置字串 gs://hive_data/corp/employees/ 的所有檔案:

bq load --source_format=AVRO corp.employees gs://hive_data/corp/employees/*

由於工作可能需要很長的時間才能完成,因此您可以將 --sync 旗標設為 False,以非同步方式執行工作。執行 bq load 指令會輸出已建立的載入工作的工作 ID,因此您可以使用此指令輪詢工作狀態。這項資料包括工作類型、工作狀態、執行該工作的使用者等詳細資料。

使用各自的工作 ID 輪詢每個載入工作狀態,並檢查是否有任何工作因錯誤而失敗。如果失敗,BigQuery 會在將資料載入資料表時採用「All or None」方法。您可以嘗試解決錯誤,並安全地重新建立其他載入工作。詳情請參閱排解錯誤

請確認每個資料表和專案都有足夠的負載工作配額。如果您超出配額,載入工作就會失敗,並傳回 quotaExceeded 錯誤。

請注意,從 Cloud Storage 將資料載入 BigQuery 的載入作業不需支付費用。資料載入至 BigQuery 後,將適用 BigQuery 的儲存空間定價。載入工作順利完成後,您可以刪除 Cloud Storage 中的任何剩餘檔案,避免因儲存多餘資料而產生費用。

驗證

資料載入成功後,您可以比較 Hive 和 BigQuery 資料表中的資料列數,驗證遷移的資料。查看資料表資訊,瞭解 BigQuery 資料表的詳細資料,例如資料列數、欄數、分區欄位或叢集欄位。如需其他驗證方式,不妨試試資料驗證工具

持續攝入

如果您持續將資料擷取至 Hive 資料表,請執行初始遷移作業,然後只將增量資料變更遷移至 BigQuery。您通常會建立可重複執行的指令碼,用來尋找及載入新資料。這麼做的方法有很多種,以下幾節將說明其中一種可能的方法。

您可以在 Cloud SQL 資料庫表格中追蹤遷移進度,在後續章節中,我們將這稱為追蹤表格。在第一次執行遷移作業時,請將進度儲存在追蹤表格中。在後續執行遷移作業時,請使用追蹤表格資訊,偵測是否有任何額外資料已擷取,且可遷移至 BigQuery。

選取 INT64TIMESTAMPDATE 類型的 ID 欄,以區分增量資料。這稱為「增量資料欄」。

以下是無分區的資料表範例,其漸進資料欄使用 TIMESTAMP 類型:

+-----------------------------+-----------+-----------+-----------+-----------+
| timestamp_identifier        | column_2  | column_3  | column_4  | column_5  |
+-----------------------------+-----------+-----------+-----------+-----------+
| 2018-10-10 21\:56\:41       |           |           |           |           |
| 2018-10-11 03\:13\:25       |           |           |           |           |
| 2018-10-11 08\:25\:32       |           |           |           |           |
| 2018-10-12 05\:02\:16       |           |           |           |           |
| 2018-10-12 15\:21\:45       |           |           |           |           |
+-----------------------------+-----------+-----------+-----------+-----------+

下表為依據 DATE 類型資料欄 partition_column 分區的資料表範例。在每個分區中,它都有一個整數類型的遞增資料欄 int_identifier

+---------------------+---------------------+----------+----------+-----------+
| partition_column    | int_identifier      | column_3 | column_4 | column_5  |
+---------------------+---------------------+----------+----------+-----------+
| 2018-10-01          | 1                   |          |          |           |
| 2018-10-01          | 2                   |          |          |           |
| ...                 | ...                 |          |          |           |
| 2018-10-01          | 1000                |          |          |           |
| 2018-11-01          | 1                   |          |          |           |
| 2018-11-01          | 2                   |          |          |           |
| ...                 | ...                 |          |          |           |
| 2018-11-01          | 2000                |          |          |           |
+---------------------+---------------------+----------+----------+-----------+

以下各節將說明如何根據 Hive 資料是否已分區,以及是否含有遞增資料欄來遷移資料。

非分區資料表 (沒有漸進式資料欄)

假設 Hive 中沒有任何檔案精簡作業,則在擷取新資料時,Hive 會建立新的資料檔案。在第一次執行時,請將檔案清單儲存在追蹤表格中,並將這些檔案複製到 Cloud Storage 並載入至 BigQuery,完成 Hive 表格的初始遷移作業。

> hdfs dfs -ls hdfs://demo_cluster/user/hive/warehouse/corp/employees
Found 3 items
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000000_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000001_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000002_0

初次遷移完成後,系統會在 Hive 中擷取部分資料。您只需將這類增量資料遷移至 BigQuery。在後續的遷移作業中,請再次列出資料檔案,並與追蹤表中的資訊進行比對,以偵測尚未遷移的新資料檔案。

> hdfs dfs -ls hdfs://demo_cluster/user/hive/warehouse/corp/employees
Found 5 items
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000000_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000001_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000002_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000003_0
hdfs://demo_cluster/user/hive/warehouse/corp/employees/000004_0

在這個範例中,表格位置會顯示兩個新檔案。將這些新資料檔案複製到 Cloud Storage,然後載入至現有的 BigQuery 資料表,即可遷移資料。

含有漸進式資料欄的非分區資料表

在這種情況下,您可以使用增量資料欄的最大值,判斷是否有任何新資料已新增。執行初始遷移作業時,請查詢 Hive 資料表,擷取增量資料欄的最大值,並儲存在追蹤資料表中:

hive> SELECT MAX(timestamp_identifier) FROM corp.employees;
2018-12-31 22:15:04

在後續的遷移作業中,請再次執行相同的查詢,擷取增量資料欄的目前最大值,並與追蹤表中的先前最大值進行比較,以檢查是否存在增量資料:

hive> SELECT MAX(timestamp_identifier) FROM corp.employees;
2019-01-04 07:21:16

如果目前的最大值大於先前的最大值,表示增量資料已匯入 Hive 資料表,如範例所示。如要遷移增量資料,請建立暫存資料表,並只將增量資料載入其中。

hive> CREATE TABLE stage_employees LIKE corp.employees;
hive> INSERT INTO TABLE stage_employees SELECT * FROM corp.employees WHERE timestamp_identifier>"2018-12-31 22:15:04" and timestamp_identifier<="2019-01-04 07:21:16"

列出 HDFS 資料檔案、將檔案複製到 Cloud Storage,然後將檔案載入現有的 BigQuery 資料表,即可遷移待用表。

沒有漸進式資料欄的分區資料表

將資料擷取至分區資料表時,系統可能會建立新分區,或將增量資料附加至現有分區,甚至同時執行這兩項作業。在這種情況下,您可以辨識更新的分區,但無法輕易辨識這些現有分區新增了哪些資料,因為沒有可用來區分的增量資料欄。另一個做法是擷取及維護 HDFS 快照,但快照會對 Hive 造成效能問題,因此通常會停用。

首次遷移資料表時,請執行 SHOW PARTITIONS 指令,並將不同分區的相關資訊儲存在追蹤表中。

hive> SHOW PARTITIONS corp.employees
partition_column=2018-10-01
partition_column=2018-11-01

上述輸出結果顯示資料表 employees 有兩個區隔。下方提供簡化的追蹤表格,說明如何儲存這項資訊。

partition_information file_path gcs_copy_status gcs_file_path bq_job_id ...
partition_column =2018-10-01
partition_column =2018-11-01

在後續的遷移作業中,請再次執行 SHOW PARTITIONS 指令,列出所有分區,並與追蹤表中的分區資訊進行比較,以檢查是否有任何尚未遷移的新分區。

hive> SHOW PARTITIONS corp.employees
partition_column=2018-10-01
partition_column=2018-11-01
partition_column=2018-12-01
partition_column=2019-01-01

如果系統識別出任何新分區 (如範例所示),請建立暫存資料表,並只從來源資料表載入新分區。將檔案複製到 Cloud Storage,然後載入至現有的 BigQuery 資料表,即可遷移暫存資料表。

分區資料表 (含有累加資料欄)

在這種情況下,Hive 資料表會進行分區,每個分區都會顯示增量資料欄。持續攝入的資料會依據這個欄位值遞增。您可以按照上一節所述,遷移新分區,也可以遷移已擷取至現有分區的增量資料。

第一次遷移資料表時,請在每個分區中儲存增量資料欄的最小值和最大值,以及追蹤表中的資料表分區資訊。

hive> SHOW PARTITIONS corp.employees
partition_column=2018-10-01
partition_column=2018-11-01

hive> SELECT MIN(int_identifier),MAX(int_identifier) FROM corp.employees WHERE partition_column="2018-10-01";
1 1000

hive> SELECT MIN(int_identifier),MAX(int_identifier) FROM corp.employees WHERE partition_column="2018-11-01";
1 2000

上述輸出結果顯示,資料表 employees 有兩個分區,以及每個分區中遞增資料欄的最小值和最大值。下方提供簡化的追蹤表格,說明如何儲存這項資訊。

partition_information inc_col_min inc_col_max file_path gcs_copy_status ...
partition_column =2018-10-01 1 1000
partition_column =2018-11-01 1 2000

在後續執行作業中,請執行相同的查詢,擷取每個分區的目前最大值,並與追蹤表中的先前最大值進行比較。

hive> SHOW PARTITIONS corp.employees
partition_column=2018-10-01
partition_column=2018-11-01
partition_column=2018-12-01
partition_column=2019-01-01

hive> SELECT MIN(int_identifier),MAX(int_identifier) FROM corp.employees WHERE partition_column="2018-10-01";

在這個範例中,系統已識別出兩個新分區,並在現有分區 partition_column=2018-10-01 中擷取部分增量資料。如果有任何增量資料,請建立暫存資料表,只將增量資料載入暫存資料表,將資料複製到 Cloud Storage,然後將資料載入現有的 BigQuery 資料表。

安全性設定

BigQuery 會使用 IAM 管理資源存取權。BigQuery 的預先定義角色:針對特定服務提供精細的存取權,且旨在支援常見的用途和存取權控管模式。您可以使用自訂角色,自訂一組權限,進一步提供更精細的存取權。

資料表和資料集的存取權控制可指定使用者、群組和服務帳戶可在資料表、檢視畫面和資料集上執行哪些作業。授權檢視表可讓您與特定使用者和群組分享查詢結果,而不用為他們提供基礎來源資料的存取權。透過資料列層級安全防護機制資料欄層級安全防護機制,您可以限制哪些使用者可存取資料表中的哪些資料列或資料欄。資料遮罩功能可讓您針對群組使用者選擇性隱藏資料欄資料,同時仍允許存取資料欄。

套用存取權控管時,您可以將存取權授予下列使用者和群組:

  • 依電子郵件指定的使用者:將資料集的存取權授予個別 Google 帳戶
  • 「Group by e-mail」(依電子郵件指定的群組):將資料集的存取權授予 Google 群組的所有成員
  • 網域:將資料集的存取權授予特定 Google 網域中的所有使用者和群組
  • 所有已驗證的使用者:將資料集的存取權授予所有 Google 帳戶持有人 (公開資料集)
  • 專案擁有者:將資料集的存取權授予所有專案擁有者
  • 「專案檢視者」:將資料集的存取權授予所有專案檢視者
  • 專案編輯者:將資料集的存取權授予所有專案編輯者
  • 已授權的檢視表:將資料集的存取權授予檢視表

資料管道變更

以下各節將說明如何在從 Hive 遷移至 BigQuery 時變更資料管道。

Sqoop

如果現有的管道會使用 Sqoop 將資料匯入 HDFS 或 Hive 進行處理,請修改工作,將資料匯入 Cloud Storage。

如果您要將資料匯入 HDFS,請選擇下列任一選項:

如果您希望 Sqoop 將資料匯入在Trusted Cloud上執行的 Hive,請直接將其指向 Hive 資料表,並使用 Cloud Storage 做為 Hive 倉儲,而非 HDFS。如要這樣做,請將 hive.metastore.warehouse.dir 屬性設為 Cloud Storage 值區。

您可以使用 Dataproc 提交 Sqoop 工作,將資料匯入 BigQuery,這樣一來,您就能執行 Sqoop 工作,而無須管理 Hadoop 叢集。

Spark SQL 和 HiveQL

批次 SQL 翻譯器互動式 SQL 翻譯器可自動將 Spark SQL 或 HiveQL 翻譯成 GoogleSQL。

如果您不想將 Spark SQL 或 HiveQL 遷移至 BigQuery,可以使用 Dataproc 或搭配 Apache Spark 的 BigQuery 連接器

Hive ETL

如果 Hive 中有任何現有的 ETL 工作,您可以透過下列方式修改這些工作,從 Hive 遷移這些工作:

  • 使用批次 SQL 翻譯器,將 Hive ETL 工作轉換為 BigQuery 工作。
  • 使用 BigQuery 連接器,搭配 Apache Spark 讀取及寫入 BigQuery。您可以使用 Dataproc 搭配暫時叢集,以經濟實惠的方式執行 Spark 工作。
  • 使用 Apache Beam SDK 重寫管道,並在 Dataflow 上執行這些管道。
  • 使用 Apache Beam SQL 重新撰寫管道。

如要管理 ETL 管道,您可以使用 Cloud Composer (Apache Airflow) 和 Dataproc 工作流程範本。Cloud Composer 提供工具,可將 Oozie 工作流程轉換為 Cloud Composer 工作流程。

Dataflow

如果您想將 Hive ETL 管道移至全代管的雲端服務,建議您使用 Apache Beam SDK 編寫資料管道,並在 Dataflow 上執行這些管道。

Dataflow 是可用於執行資料處理管道的代管服務。執行使用開放原始碼架構 Apache Beam 編寫的程式。Apache Beam 是一種整合式程式設計模型,可讓您開發批次和串流管道。

如果資料管道是標準資料移動作業,您可以使用 Dataflow 範本快速建立 Dataflow 管道,而無需編寫程式碼。您可以參考這個 Google 提供的範本,從 Cloud Storage 讀取文字檔案、套用轉換,並將結果寫入 BigQuery 資料表。

如要進一步簡化資料處理作業,您也可以試試 Beam SQL,這項工具可讓您使用類似 SQL 的陳述式處理資料。