从 HDFS 传输到 Cloud Storage

Storage Transfer Service 支持从云端和本地的 Hadoop 分布式文件系统 (HDFS) 来源转移数据。

从 HDFS 进行的传输必须使用 Cloud Storage 作为目标。

应用场景包括从本地存储迁移到 Cloud Storage、归档数据以释放本地存储空间、将数据复制到 Google Cloud 以确保业务连续性,或将数据转移到 Google Cloud 以进行分析和处理。

配置权限

在创建转移作业之前,您必须为以下各项配置权限 实体:

用于创建转移作业的用户账号。这是登录 Google Cloud 控制台的账号,或在对 `gcloud` CLI 进行身份验证时指定的账号。用户账号可以是普通用户账号,也可以是用户管理的服务账号。
Storage Transfer Service 使用的 Google 管理的服务账号(也称为服务代理)。此账号通常由其电子邮件地址标识,该地址采用 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com 格式。
用于向转移代理提供 Google Cloud 权限的转移代理账号。转移代理账号使用安装它们的用户的凭据或用户管理的服务账号的凭据进行身份验证。

请参阅 基于代理的转移权限 了解相关说明。

将代理安装到代理池中

基于代理的转移会使用软件代理来编排转移。这些代理必须安装在有权访问文件系统的一个或多个机器上。代理必须有权访问名称节点、所有数据节点 Hadoop 密钥管理服务器 (KMS) 和 Kerberos 密钥分发中心 (KDC)。

转移代理在代理池中协同工作。增加代理数量可以提高总体作业效果,但具体取决于多个因素。

  • 添加更多代理可能会有所帮助,最多可达到 HDFS 集群中节点数量的一半。例如,对于具有 30 个节点的集群,从 5 个代理增加到 15 个代理应该会提升效果,但超过 15 个代理不太可能产生多大的差异。

  • 对于小型 HDFS 集群,一个代理可能就已足够。

  • 当转移作业包含大量小型文件时,其他代理往往会对效果产生更大的影响。Storage Transfer Service 通过在多个代理之间并行执行传输任务来实现高吞吐量。工作负载中的文件越多,添加更多代理的好处就越大。

请勿在代理池名称或代理 ID 前缀中包含敏感信息,例如个人身份信息 (PII) 或安全数据。资源名称可能会传播到其他 Google Cloud 资源的名称,并且可能会向您项目之外的 Google 内部系统公开。

创建代理池

创建代理池。使用您的 用户账号 用户账号符号 执行此操作。

安装代理

将代理安装到代理池中。请使用您的转移代理账号 执行此操作。

Google Cloud 控制台

  1. 在 Google Cloud 控制台中,转到代理池页面。

    转到“代理池”

  2. 选择要向其添加新代理的代理池。

  3. 点击安装代理

  4. 按照相关说明安装并运行代理。

    如需详细了解代理的命令行选项,请参阅代理命令行选项

gcloud CLI

如需使用 gcloud CLI 安装一个或多个代理,请运行 gcloud transfer agents install

gcloud transfer agents install --pool=POOL_NAME \
  --count=NUM_AGENTS \
  --mount-directories=MOUNT_DIRECTORIES \
  --hdfs-namenode-uri=HDFS_NAMENODE_URI \
  --hdfs-username=HDFS_USERNAME \
  --hdfs-data-transfer-protection=HDFS_DATA_TRANSFER_PROTECTION \
  --kerberos-config-file=KERBEROS_CONFIG_FILE \
  --kerberos-keytab-file=KERBEROS_KEYTAB_FILE \
  --kerberos-user-principal=KERBEROS_USER_PRINCIPAL \
  --kerberos-service-principal=KERBEROS_SERVICE_PRINCIPAL \

其中:

  • --hdfs-namenode-uri 指定包含架构的 HDFS 集群。 namenode 和端口,采用 URI 格式例如:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

    对 WebHDFS 使用 HTTP 或 HTTPS。如果未提供架构,我们会假定 RPC。如果未提供端口,则默认值为:对于 RPC 为 8020,对于 HTTP 为 9870,对于 HTTPS 为 9871。例如,输入 my-namenode 会变为 rpc://my-namenode:8020

    如果您的集群配置了多个名称节点,请指定 当前主要节点如需了解详情,请参阅具有多个名称节点的集群

  • --hdfs-username 是用于使用简单身份验证连接到 HDFS 集群的用户名。如果您使用 Kerberos 进行身份验证,或者如果 无需进行身份验证即可连接

  • --hdfs-data-transfer-protection(可选)是 保护 (QOP) 设置。此值不得比服务器端 QOP 值更严格。有效值包括:authenticationintegrityprivacy

如果您使用 Kerberos 进行身份验证,还应添加以下标志:

  • --kerberos-config-file 是 Kerberos 配置文件的路径。例如 --kerberos-config-file=/etc/krb5.conf

  • --kerberos-user-principal 是要使用的 Kerberos 用户正文。例如 --kerberos-user-principal=user1

  • --kerberos-keytab-file 是包含使用 --kerberos-user-principal 标志指定的用户主体的 Keytab 文件的路径。例如 --kerberos-keytab-file=/home/me/kerberos/user1.keytab

  • --kerberos-service-principal 是要使用的 Kerberos 服务正文。 采用 <primary>/<instance> 格式。领域是从您的 Kerberos 映射的 配置文件;提供的任何领域都将被忽略。如果未指定此标志,则默认为 hdfs/<namenode_fqdn>,其中 <namenode_fqdn> 是配置文件中指定的完全限定域名。

    例如 --kerberos-service-principal=hdfs/my-namenode.a.example.com

该工具将引导您完成安装代理所需的所有步骤。此命令会在您的机器上安装 NUM_AGENTS 个代理,将这些代理映射到指定为 POOL_NAME 的池名称,并使用您的 gcloud 凭据对这些代理进行身份验证。池名称必须存在,否则会返回错误。

--mount-directories 标志是可选的,但强烈建议使用。它的值是文件系统上的目录的逗号分隔列表,您将向代理授予这些目录的访问权限。如果省略此标志,系统会将整个文件系统装载到代理容器。如需了解详情,请参阅 gcloud 参考文档。

docker run

在使用 docker run 安装代理之前,请先按照相关说明安装 Docker

docker run 命令会安装一个代理。如需增加池中的代理数量,请根据需要重复运行此命令数次。

所需的命令标志取决于您要执行的身份验证类型 使用。

Kerberos

如需使用 Kerberos 向文件系统进行身份验证,请使用以下命令:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="service_account.json" \
  --agent-pool=${AGENT_POOL_NAME} \
  --hdfs-namenode-uri=cluster-namenode \
  --kerberos-config-file=/etc/krb5.conf \
  --kerberos-user-principal=user \
  --kerberos-keytab-file=/path/to/folder.keytab

其中:

  • 如果您运行多个代理,则应省略 --network=host
  • --hdfs-namenode-uri:架构、名称节点和端口(采用 URI 格式),表示 HDFS 集群。例如:

    • rpc://my-namenode:8020
    • http://my-namenode:9870

对 WebHDFS 使用 HTTP 或 HTTPS。如果未提供架构,我们会假定 RPC。如果未提供端口,则默认值为:对于 RPC 为 8020,对于 HTTP 为 9870,对于 HTTPS 为 9871。例如,输入 my-namenode 会变为 rpc://my-namenode:8020

如果您的集群配置了多个名称节点,请指定 当前主要节点如需了解详情,请参阅具有多个名称节点的集群

  • --kerberos-config-file:Kerberos 配置文件的路径。默认值为 /etc/krb5.conf
  • --kerberos-user-principal:Kerberos 用户正文。
  • --kerberos-keytab-file:包含使用 --kerberos-user-principal 指定的用户主账号的 Keytab 文件的路径。
  • --kerberos-service-principal:要使用的 Kerberos 服务主账号,采用“服务/实例”形式。领域是根据您的 Kerberos 配置映射的 file;提供的任何领域都将被忽略。如果未指定此标记,则 默认值为 hdfs/<namenode_fqdn>,其中 fqdn 表示完全限定 域名。

简单身份验证

如需使用简单身份验证向文件系统进行身份验证,请使用以下命令:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \
  --hdfs-username="${USERNAME}"

其中:

  • --hdfs-username:使用简单身份验证连接到 HDFS 集群时使用的用户名。
  • --hdfs-namenode-uri:架构、名称节点和端口(采用 URI 格式),表示 HDFS 集群。例如:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

针对 WebHDFS 使用 HTTP 或 HTTPS。如果未提供架构,我们会假定 RPC。 如果未提供端口,则默认为 8020(对于 RPC)、9870(对于 HTTP) 9871 表示 HTTPS。例如,输入 my-namenode 会变为 rpc://my-namenode:8020

如果您的集群配置了多个名称节点,请指定当前的主节点。请参阅 具有多个名称节点的集群了解详情 信息。

无需授权

如需在不进行任何身份验证的情况下连接到您的文件系统,请执行以下操作:

sudo docker run -d --ulimit memlock=64000000 --rm \
  --network=host \
  -v /:/transfer_root \
  gcr.io/cloud-ingest/tsop-agent:latest \
  --enable-mount-directory \
  --project-id=${PROJECT_ID} \
  --hostname=$(hostname) \
  --creds-file="${CREDS_FILE}" \
  --agent-pool="${AGENT_POOL_NAME}" \
  --hdfs-namenode-uri=cluster-namenode \

其中:

  • --hdfs-namenode-uri:架构、名称节点和端口(采用 URI 格式),表示 HDFS 集群。例如:
    • rpc://my-namenode:8020
    • http://my-namenode:9870

针对 WebHDFS 使用 HTTP 或 HTTPS。如果未提供架构,我们会假定 RPC。 如果未提供端口,则默认为 8020(对于 RPC)、9870(对于 HTTP) 9871 表示 HTTPS。例如,输入 my-namenode 会变为 rpc://my-namenode:8020

如果您的集群配置了多个名称节点,请指定当前的主节点。请参阅 具有多个名称节点的集群了解详情 信息。

转移选项

以下 Storage Transfer Service 功能适用于从 HDFS 到 Cloud Storage。

从 HDFS 转移的文件不会保留其元数据

创建转移作业

请勿在转移作业名称中包含敏感信息,例如个人身份信息 (PII) 或安全数据。资源名称可能会传播到其他 Google Cloud 资源的名称,并且可能会向您项目之外的 Google 内部系统公开。

Storage Transfer Service 提供了多种接口,通过这些接口 。

Google Cloud 控制台

  1. 转到 Google Cloud 控制台中的 Storage Transfer Service 页面。

    转到 Storage Transfer Service

  2. 点击创建转移作业。 系统随即会显示创建转移作业页面。

  3. 选择 Hadoop 分布式文件系统作为来源类型。目标位置必须是 Google Cloud Storage

    点击下一步

配置来源

  1. 指定此转移作业所需的信息:

    1. 选择您为此转移作业配置的代理池

    2. 输入要从中传输的路径(相对于根目录)。

  2. (可选)指定要应用于来源数据的任何过滤条件

  3. 点击下一步

配置接收器

  1. 存储桶或文件夹字段中,输入目标存储桶以及(可选)文件夹名称,或点击浏览从当前项目的现有存储桶列表中选择一个存储桶。如需创建新存储桶,请点击 存储桶图标 创建新存储桶

  2. 点击下一步

安排转移作业

您可以安排转移作业仅运行一次,也可以配置周期性转移作业。

点击下一步

选择转移作业设置

  1. 说明字段中,输入转移作业的说明。最佳做法是输入有意义且唯一的说明,以便区分作业。

  2. 元数据选项下,选择您的 Cloud Storage 存储类别,以及是否要保存每个对象的创建时间。如需了解详情,请参阅元数据保留

  3. 何时覆盖下,选择以下选项之一:

    • 永不:请勿覆盖目标文件。如果存在同名文件,则不会进行传输。

    • 如果不同:如果同名的源文件具有不同的 ETag 或校验和值,则覆盖目标文件。

    • 始终:当源文件同名时,即使源文件相同,也始终覆盖目标文件。

  4. 何时删除下,选择以下选项之一:

    • 永不:永不从源或目标中删除文件。

    • 如果文件不在数据源中则从目标位置删除文件:如果目标 Cloud Storage 存储桶中的文件也不在数据源中,则从 Cloud Storage 存储桶中删除文件。

      此选项可确保目标 Cloud Storage 存储桶与您的数据源完全匹配。

  5. 选择是否启用转移日志记录和/或 Pub/Sub 通知

点击创建以创建转移作业。

gcloud CLI

如需创建新的转移作业,请使用 gcloud transfer jobs create 命令。除非指定了时间表或 --do-not-run,否则创建新作业时会启动指定的转移作业。

gcloud transfer jobs create \
  hdfs:///PATH/ gs://BUCKET_NAME/PATH/
  --source-agent-pool=AGENT_POOL_NAME

其中:

  • PATH 是 HDFS 集群根目录中的绝对路径。集群名称节点和端口是在代理级别配置的,因此作业创建命令只需指定路径(可选)和代理池。

  • --source-agent-pool 指定要用于此操作的来源代理池 。

其他选项包括:

  • --do-not-run 可阻止 Storage Transfer Service 在提交命令后运行作业。如需运行作业,请更新作业以添加时间表,或使用 jobs run手动启动作业

  • --manifest-file 指定 Cloud Storage 中 CSV 文件的路径,该文件包含要从来源转移的文件的列表。如需了解清单文件的格式,请参阅使用清单转移特定文件或对象

  • 作业信息:您可以指定 --name--description

  • 时间表:您可以指定 --schedule-starts--schedule-repeats-every--schedule-repeats-until--do-not-run

  • 对象条件:您可以使用条件确定要转移的对象。这些条件包括 --include-prefixes--exclude-prefixes 以及 --include-modified-[before | after]-[absolute | relative] 中基于时间的条件。 如果您 则前缀过滤条件是相对于该文件夹的 文件夹中。如需了解详情,请参阅按前缀过滤源对象

  • 传输选项:指定是否覆盖目标位置 文件(--overwrite-when=differentalways)以及是否 在转移期间或转移之后删除特定文件 (--delete-from=destination-if-uniquesource-after-transfer);和 (可选)为传输的对象设置存储类别 (--custom-storage-class).

  • 通知:使用 --notification-pubsub-topic--notification-event-types--notification-payload-format 为转移作业配置 Pub/Sub 通知

如需查看所有选项,请运行 gcloud transfer jobs create --help 或参阅 gcloud 参考文档

REST API

如需使用 REST API 创建从 HDFS 来源的转移作业,请创建一个类似于以下示例的 JSON 对象。

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  ...
  "transferSpec": {
    "source_agent_pool_name":"POOL_NAME",
    "hdfsDataSource": {
      "path": "/mount"
    },
    "gcsDataSink": {
      "bucketName": "SINK_NAME"
    },
    "transferOptions": {
      "deleteObjectsFromSourceAfterTransfer": false
    }
  }
}

如需详细了解其他受支持的字段,请参阅 transferJobs.create 参考文档。

具有多个名称节点的集群

只能使用单个名称节点配置 Storage Transfer Service 代理。如果您的 HDFS 集群配置了多个名称节点(“高可用性”),以及 如果发生故障切换事件,导致出现新的主 namenode,则必须 请使用正确的 namenode 重新安装代理。

如需删除旧代理,请参阅 删除代理

可以通过运行以下命令来检索集群的活跃名称节点:

hdfs haadmin -getAllServiceState