从 HDFS 数据湖迁移表
本文档介绍了如何将 Apache Hadoop 分布式文件系统 (HDFS) 数据湖表迁移到 Google Cloud。
您可以使用 BigQuery Data Transfer Service 中的 HDFS 数据湖迁移连接器,将 Hive 和 Iceberg 表从各种 Hadoop 发行版(包括本地环境和云环境)迁移到 Google Cloud。
借助 HDFS 数据湖连接器,您可以向 Dataproc Metastore 和 BigLake metastore 注册 HDFS 数据湖表,同时使用 Cloud Storage 作为文件的底层存储。
下图提供了从 Hadoop 集群迁移表的过程概览。
限制
HDFS 数据湖转移作业受到以下限制:
- 如需迁移 Iceberg 表,您必须向 BigLake metastore 注册这些表,以允许开源引擎(例如 Spark 或 Flink)进行写入访问,并允许 BigQuery 进行读取访问。
- 如需迁移 Hive 表,您必须向 Dataproc Metastore 注册这些表,以允许开源引擎进行写入访问,并允许 BigQuery 进行读取访问。
- 您必须使用 bq 命令行工具将 HDFS 数据湖表迁移到 BigQuery。
准备工作
在安排 HDFS 数据湖转移作业之前,您必须执行以下操作:
为迁移的文件创建 Cloud Storage 存储桶
创建 Cloud Storage 存储桶,以作为迁移的数据湖文件的目标位置。本文档中将此存储桶称为 MIGRATION_BUCKET
。
为 Apache Hive 生成元数据文件
运行 dwh-migration-dumper
工具以提取元数据(针对 Apache Hive)。该工具会生成一个名为 hive-dumper-output.zip
的文件,并将其保存到 Cloud Storage 存储桶(在本文档中称为 DUMPER_BUCKET
)。
启用 API
在Google Cloud 项目中启用以下 API:
- Data Transfer API
- Storage Transfer API
启用 Data Transfer API 后,系统会创建一个服务代理。
配置权限
- 创建一个服务账号,并向其授予 BigQuery Admin 角色 (
roles/bigquery.admin
)。此服务账号用于创建转移作业配置。 - 启用 Data Transfer API 后,系统会创建一个服务代理 (P4SA)。向其授予以下角色:
roles/metastore.metadataOwner
roles/storagetransfer.admin
roles/serviceusage.serviceUsageConsumer
roles/storage.objectViewer
- 如果您要迁移 BigLake Iceberg 表的元数据,请向其授予
roles/storage.objectAdmin
和roles/bigquery.admin
角色,而不是roles/storage.objectViewer
角色。
- 如果您要迁移 BigLake Iceberg 表的元数据,请向其授予
使用以下命令向服务代理授予
roles/iam.serviceAccountTokenCreator
角色:gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com --role roles/iam.serviceAccountTokenCreator
配置存储转移代理
如需设置 HDFS 数据湖转移作业所需的存储转移代理,请执行以下操作:
- 配置权限,以便在 Hadoop 集群上运行存储转移代理。
- 在本地代理机器上安装 Docker。
- 在 Google Cloud 项目中创建 Storage Transfer Service 代理池。
- 在本地代理机器上安装代理。
安排 HDFS 数据湖转移作业
如需安排 HDFS 数据湖转移作业,请输入 bq mk
命令并提供转移作业创建标志 --transfer_config
:
bq mk --transfer_config --data_source=hadoop --display_name='TRANSFER_NAME' --service_account_name='SERVICE_ACCOUNT' --project_id='PROJECT_ID' --location='REGION' --params='{"table_name_patterns":"LIST_OF_TABLES", "agent_pool_name":"AGENT_POOL_NAME", "table_metadata_path":"gs://DUMPER_BUCKET/hive-dumper-output.zip", "target_gcs_file_path":"gs://MIGRATION_BUCKET", "destination_dataproc_metastore":"DATAPROC_METASTORE", "destination_bigquery_dataset":"BIGLAKE_METASTORE", "translation_output_gcs_path":"gs://TRANSLATION_OUTPUT_BUCKET/metadata/config/default_database/" }'
替换以下内容:
TRANSFER_NAME
:此标志表示转移配置的显示名称。转移作业名称可以是任何易于识别该作业的值,以便您以后在需要修改时找到作业。SERVICE_ACCOUNT
:用于对转移作业进行身份验证的服务账号名称。该服务账号应属于用于创建转移作业的同一project_id
,并且应具有所有所需的权限。PROJECT_ID
:您的 Google Cloud 项目 ID。 如果未提供--project_id
来指定具体项目,则系统会使用默认项目。REGION
:此转移作业配置的位置。LIST_OF_TABLES
:要转移的实体列表。使用分层命名规范 -database.table
。此字段支持使用 RE2 正则表达式指定表。例如:db1..*
:指定数据库中的所有表db1.table1;db2.table2
:表的列表
AGENT_POOL_NAME
:用于创建代理的代理池的名称。DUMPER_BUCKET
:包含hive-dumper-output.zip
文件的 Cloud Storage 存储桶。MIGRATION_BUCKET
:所有底层文件将加载到的目标 GCS 路径。元数据可以迁移到 Dataproc Metastore 或 BigLake Metastore,而底层数据存储在 Cloud Storage 中。您可以使用以下某个参数指定目的地:
- 如需将元数据转移到 Dataproc Metastore,请使用
destination_dataproc_metastore
参数,并在DATAPROC_METASTORE
中指定 metastore 的网址。 - 如需将元数据转移到 BigLake metastore,请使用
destination_bigquery_dataset
参数并在BIGLAKE_METASTORE
中指定 BigQuery 数据集。
- 如需将元数据转移到 Dataproc Metastore,请使用
TRANSLATION_OUTPUT_BUCKET
:(可选)指定用于存储翻译输出的 Cloud Storage 存储分区。如需了解详情,请参阅使用翻译输出。
运行此命令以创建转移作业配置并启动 HDFS 数据湖转移作业。默认情况下,转移作业安排为每 24 小时运行一次,但可以通过转移作业安排选项进行配置。
转移作业完成后,Hadoop 集群中的表将迁移到 MIGRATION_BUCKET
。
数据注入选项
以下部分详细介绍了如何配置 HDFS 数据湖转移作业。
增量转移
如果转移作业配置是按周期性时间表设置的,则每个后续转移作业都会使用对源表进行的最新更新来更新 Google Cloud 上的表。例如在每个转移作业中,所有包含架构更改的插入、删除或更新操作都会在 Google Cloud 中得到反映。
转移作业安排选项
默认情况下,转移作业安排为每 24 小时运行一次。如需配置转移作业的运行频率,请将 --schedule
标志添加到转移作业配置中,并使用 schedule
语法指定转移作业时间表。HDFS 数据湖转移作业的运行间隔时间必须至少为 24 小时。
对于一次性转移作业,您可以向转移作业配置添加 end_time
标志,以便仅运行一次转移作业。
配置翻译输出
您可以为每个迁移的表配置唯一的 Cloud Storage 路径和数据库。为此,请执行以下步骤来生成表映射 YAML 文件,以便在迁移配置中使用。
在
DUMPER_BUCKET
中创建一个配置 YAML 文件(以config.yaml
为后缀),其中包含以下内容:type: object_rewriter relation: - match: relationRegex: ".*" external: location_expression: "'gs://MIGRATION_BUCKET/' + table.schema + '/' + table.name"
- 将
MIGRATION_BUCKET
替换为所迁移表格文件的目标 Cloud Storage 存储桶的名称。location_expression
字段是一个通用表达式语言 (CEL) 表达式。
- 将
在
DUMPER_BUCKET
中创建另一个配置 YAML 文件(以config.yaml
为后缀),其中包含以下内容:type: experimental_object_rewriter relation: - match: schema: SOURCE_DATABASE outputName: database: null schema: TARGET_DATABASE
- 将
SOURCE_DATABASE
和TARGET_DATABASE
替换为源数据库名称和 Dataproc Metastore 数据库或 BigQuery 数据集(具体取决于所选的元数据存储区)。如果您要为 BigLake Metastore 配置数据库,请确保 BigQuery 数据集存在。
如需详细了解这些配置 YAML,请参阅创建配置 YAML 文件的指南。
- 将
使用以下命令生成表映射 YAML 文件:
curl -d '{ "tasks": { "string": { "type": "HiveQL2BigQuery_Translation", "translation_details": { "target_base_uri": "TRANSLATION_OUTPUT_BUCKET", "source_target_mapping": { "source_spec": { "base_uri": "DUMPER_BUCKET" } }, "target_types": ["metadata"] } } } }' \ -H "Content-Type:application/json" \ -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/PROJECT_ID/locations/LOCATION/workflows
替换以下内容:
TRANSLATION_OUTPUT_BUCKET
:(可选)指定用于存储翻译输出内容的 Cloud Storage 存储分区。如需了解详情,请参阅使用翻译输出。DUMPER_BUCKET
:包含hive-dumper-output.zip
和配置 YAML 文件的 Cloud Storage 存储桶的基本 URI。TOKEN
:OAuth 令牌。您可以在命令行中使用gcloud auth print-access-token
命令生成此项。PROJECT_ID
:处理转换的项目。LOCATION
:处理作业的位置。例如eu
或us
。
监控此作业的状态。完成后,系统会为数据库中的每个表在
TRANSLATION_OUTPUT_BUCKET
的预定义路径中生成一个映射文件。
监控 HDFS 数据湖转移作业
在您安排 HDFS 数据湖转移作业后,可以使用 bq 命令行工具命令监控转移作业。如需了解如何监控转移作业,请参阅查看转移作业。
跟踪表迁移状态
您还可以运行 dwh-dts-status
工具来监控转移作业配置或特定数据库中所有转移的表的状态。您还可以使用 dwh-dts-status
工具列出项目中的所有转移作业配置。
准备工作
在使用 dwh-dts-status
工具之前,请执行以下操作:
通过从
dwh-migration-tools
GitHub 仓库下载dwh-migration-tool
软件包来获取dwh-dts-status
工具。使用以下命令向 Google Cloud 验证您的账号身份:
gcloud auth application-default login
如需了解详情,请参阅应用默认凭证的工作原理。
验证用户是否具有
bigquery.admin
和logging.viewer
角色。如需详细了解 IAM 角色,请参阅访问权限控制参考文档。
列出项目中的所有转移作业配置
如需列出项目中的所有转移作业配置,请使用以下命令:
./dwh-dts-status --list-transfer-configs --project-id=[PROJECT_ID] --location=[LOCATION]
替换以下内容:
PROJECT_ID
:运行转移作业的 Google Cloud 项目 ID。LOCATION
:创建转移作业配置的位置。
此命令会输出一个表,其中包含转移作业配置名称和 ID 的列表。
查看配置中所有表的状态
如需查看转移作业配置中包含的所有表的状态,请使用以下命令:
./dwh-dts-status --list-status-for-config --project-id=[PROJECT_ID] --config-id=[CONFIG_ID] --location=[LOCATION]
替换以下内容:
PROJECT_ID
:运行转移作业的 Google Cloud 项目 ID。LOCATION
:创建转移作业配置的位置。CONFIG_ID
:指定转移作业配置的 ID。
此命令会输出一个表,其中包含指定转移作业配置中的表的列表以及这些表的转移状态。转移状态可以是以下值之一:PENDING
、RUNNING
、SUCCEEDED
、FAILED
、CANCELLED
。
查看数据库中所有表的状态
如需查看从特定数据库转移的所有表的状态,请使用以下命令:
./dwh-dts-status --list-status-for-database --project-id=[PROJECT_ID] --database=[DATABASE]
替换以下内容:
PROJECT_ID
:运行转移作业的 Google Cloud 项目 ID。DATABASE
:指定数据库的名称。
此命令会输出一个表,其中包含指定数据库中的表的列表以及这些表的转移状态。转移状态可以是以下值之一:PENDING
、RUNNING
、SUCCEEDED
、FAILED
、CANCELLED
。