從 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 (以換行符號分隔) 格式儲存,您可以將資料複製到 Avro 格式的 Hive 資料表,也可以將資料表結構定義轉換為 BigQuery JSON 結構定義,以便在擷取時提供。

收集 Hive 存取控管設定

Hive 和 BigQuery 的存取權控管機制不同。 收集所有 Hive 存取權控管設定,例如角色、群組、成員,以及授予的權限。在 BigQuery 中,以資料集為單位規劃安全防護模型,並實作精細的存取控制清單。舉例來說,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 單一地區 bucket 來存放資料。

選取 Cloud Storage bucket 位置後,您可以使用下列指令列出 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 會在將資料載入資料表時,採用「全有或全無」方法。您可以嘗試解決錯誤,然後安全地重新建立其他載入工作。詳情請參閱排解錯誤

請確認每個資料表和專案有足夠的載入工作配額。如果超出配額,載入工作就會失敗,並傳回 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

上述輸出內容顯示員工資料表有兩個分區,以及每個分區中遞增資料欄的最小值和最大值。下表是追蹤表格的簡化版,說明如何儲存這項資訊。

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 帳戶
  • 依電子郵件指定的群組:將資料集的存取權授予 Google 群組的所有成員
  • 網域:將資料集的存取權授予特定 Google 網域中的所有使用者和群組
  • 所有已驗證的使用者:將資料集的存取權授予所有 Google 帳戶持有人 (公開資料集)
  • 專案擁有者:將資料集的存取權授予所有專案擁有者
  • 專案檢視者:將資料集的存取權授予所有專案檢視者
  • 專案編輯者:將資料集的存取權授予所有專案編輯者
  • 已授權的檢視表:將資料集的存取權授予某個檢視表

資料管道變更

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

Sqoop

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

如要將資料匯入 HDFS,請選擇下列其中一種方式:

如要讓 Sqoop 將資料匯入Google Cloud上執行的 Hive,請直接指向 Hive 資料表,並使用 Cloud Storage 做為 Hive 倉庫,而非 HDFS。只要將 hive.metastore.warehouse.dir 屬性設為 Cloud Storage bucket,就能指定範圍。

您可以使用 Dataproc 提交 Sqoop 工作,將資料匯入 BigQuery,不必管理 Hadoop 叢集即可執行 Sqoop 工作。

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 讀取資料,以及將資料寫入 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 的陳述式處理資料。