從 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 有兩個步驟:
- 將資料從來源叢集複製到 Cloud Storage
- 將資料從 Cloud Storage 載入至 BigQuery
以下各節將說明如何遷移 Hive 資料、驗證已遷移的資料,以及處理持續攝入資料的遷移作業。這些範例是針對非 ACID 資料表編寫。
分割欄資料
在 Hive 中,分區資料表中的資料會儲存在目錄結構中。資料表的每個分區都會與分區欄的特定值相關聯。資料檔案本身不含任何分割欄資料。使用 SHOW PARTITIONS
指令,即可列出分區資料表中的不同分區。
以下範例顯示來源 Hive 資料表是以 joining_date
和 department
資料欄分區。這個表格底下的資料檔案不含任何與這兩個資料欄相關的資料。
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:
- 建立結構定義類似分區資料表的非分區資料表。
- 將資料從來源分區資料表載入至非分區資料表。
- 將處於暫存狀態的非分區資料表下方的這些資料檔案複製到 Cloud Storage。
- 使用
bq load
指令將資料載入 BigQuery,並提供TIMESTAMP
或DATE
類型分區欄 (如有) 的名稱做為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。
選取 INT64
、TIMESTAMP
或 DATE
類型的 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,請選擇下列任一選項:
- 使用 Hadoop DistCp 將 Sqoop 輸出檔案複製到 Cloud Storage。
- 使用 Cloud Storage 連接器,直接將檔案輸出至 Cloud Storage。Cloud Storage 連接器是一種開放原始碼 Java 程式庫,可讓您對儲存在 Cloud Storage 中的資料直接執行 Apache Hadoop 或 Apache Spark 工作。詳情請參閱「安裝 Cloud Storage 連接器」。
如果您希望 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 的陳述式處理資料。