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 通过在多个代理之间并行执行传输任务来实现高吞吐量。工作负载中的文件越多,添加更多代理的好处就越大。
创建代理池
创建代理池。请使用您的用户账号 执行此操作。
安装代理
将代理安装到代理池中。请使用您的转移代理账号 执行此操作。
Google Cloud 控制台
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 集群,包括架构、名称节点和端口(采用 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
(可选)是 Kerberized 集群的客户端保护质量 (QOP) 设置。此值不得比服务器端 QOP 值更严格。有效值包括:authentication
、integrity
和privacy
。
如果您使用 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 配置文件中映射出 Realm;系统会忽略任何提供的 Realm。如果未指定此标志,则默认为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 配置文件映射的;系统会忽略任何提供的大区。如果未指定此标志,则默认值为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 控制台
转到 Google Cloud 控制台中的 Storage Transfer Service 页面。
点击创建转移作业。 系统随即会显示创建转移作业页面。
选择 Hadoop 分布式文件系统作为来源类型。目标位置必须是 Google Cloud Storage。
点击下一步。
配置来源
配置接收器
在存储桶或文件夹字段中,输入目标存储桶以及(可选)文件夹名称,或点击浏览从当前项目的现有存储桶列表中选择一个存储桶。如需创建新存储桶,请点击 创建新存储桶。
点击下一步。
安排转移作业
您可以安排转移作业仅运行一次,也可以配置周期性转移作业。
点击下一步。
选择转移作业设置
在说明字段中,输入转移作业的说明。最佳做法是输入有意义且唯一的说明,以便区分作业。
在元数据选项下,选择您的 Cloud Storage 存储类别,以及是否要保存每个对象的创建时间。如需了解详情,请参阅元数据保留。
在何时覆盖下,选择以下选项之一:
永不:请勿覆盖目标文件。如果存在同名文件,则不会进行传输。
如果不同:如果同名的源文件具有不同的 ETag 或校验和值,则覆盖目标文件。
始终:当源文件同名时,即使源文件相同,也始终覆盖目标文件。
在何时删除下,选择以下选项之一:
永不:永不从源或目标中删除文件。
如果文件不在数据源中则从目标位置删除文件:如果目标 Cloud Storage 存储桶中的文件也不在数据源中,则从 Cloud Storage 存储桶中删除文件。
此选项可确保目标 Cloud Storage 存储桶与您的数据源完全匹配。
选择是否启用转移日志记录和/或 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=different
或always
),以及是否要在转移过程中或之后删除某些文件(--delete-from=destination-if-unique
或source-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 集群配置了多个名称节点(“高可用性”),并且发生了导致出现新主名称节点的故障切换事件,您必须使用正确的名称节点重新安装代理。
如需删除旧代理,请参阅删除代理。
您可以通过运行以下命令检索集群的活动名称节点:
hdfs haadmin -getAllServiceState