从 HDFS 转移到 Cloud Storage

Storage Transfer Service 支持从云端和本地 Hadoop 分布式文件系统 (HDFS) 源进行传输。

来自 HDFS 的转移作业必须使用 Cloud Storage 作为目标位置。

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

配置权限

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

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

如需查看说明,请参阅基于代理的转移权限

将代理安装到代理池中

基于代理的转移作业使用软件代理来编排转移作业。这些代理必须安装在可以访问您文件系统的一台或多台机器上。代理必须有权访问 namenode、所有数据节点、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 以 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

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

  • --hdfs-username 是用于通过简单身份验证连接到 HDFS 集群的用户名。如果您使用 Kerberos 进行身份验证,或者要在不进行任何身份验证的情况下进行连接,请省略此标志。

  • --hdfs-data-transfer-protection(可选)是 Kerberos 化集群的客户端保护质量 (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 是 Keytab 文件的路径,该文件包含使用 --kerberos-user-principal 标志指定的用户主帐号。例如 --kerberos-keytab-file=/home/me/kerberos/user1.keytab

  • --kerberos-service-principal 是要使用的 Kerberos 服务主帐号,格式为 <primary>/<instance>。Realm 通过 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。如果未提供端口,则默认为 8020(对于 RPC)、9870(对于 HTTP)和 9871(对于 HTTPS)。例如,输入 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 服务主账号,采用“服务/实例”形式。Realm 从 Kerberos 配置文件进行映射;任何提供的领域都会被忽略。如果未指定此标志,则默认值为 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 Distributed File System 作为来源类型。目标位置必须是 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 代理只能配置一个 namenode。如果您的 HDFS 集群配置了多个名称节点(“高可用性”),并且存在导致新的主要名称节点的故障切换事件,则您必须使用正确的名称节点重新安装代理。

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

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

hdfs haadmin -getAllServiceState