本文介绍如何使用 S3DistCp 结合 AWS Direct Connect 将大量数据从本地 Apache Hadoop 环境迁移到 Amazon Simple Storage Service (Amazon S3)。通过这种方式,用户可以有效地将数据迁移至云端而不会对源集群造成负担。
这篇文章展示了如何通过在 Amazon EMR上运行的 S3DistCp,以及配合 AWS Direct Connect的使用,将几乎任何量的数据从本地 Apache Hadoop 环境迁移到 Amazon S3。
与传统的 Hadoop DistCp 不同,S3DistCp 可以在目标 EMR 集群上运行,从而减少对源集群的负担。Hadoop DistCp 会在源集群上运行 MapReduce 作业,并可能消耗大量资源,而使用 S3DistCp 可以将数据直接迁移至 S3,从而有效减少源集群的负荷。
本文提供了如何使用 S3DistCp 在 AWS 云中迁移数据的具体说明。Apache DistCp 是一个开源工具,可用于复制大量数据,而 S3DistCp 经过优化,更适合 AWS 环境,尤其是 Amazon S3。与 Hadoop DistCp 相比,S3DistCp 在可扩展性、吞吐量和高效性方面具有更大的优势。
该解决方案的架构包括以下组件:
源技术栈通过 Direct Connect 连接的 Hadoop 集群目标技术栈Amazon Virtual Private Cloud (Amazon VPC)EMR 集群Direct ConnectAmazon S3以下的架构示意图展示了如何通过私有网络连接,比如 Direct Connect,使用 S3DistCp 从本地 Hadoop 环境迁移大量数据到 Amazon S3。
该迁移方式使用以下工具来实施:
S3DistCp S3DistCp 与 DistCp 类似,但经过优化,专为 AWS 设计,尤其是针对 Amazon S3。可以高效地在 Amazon S3 和 Hadoop 分布式文件系统 (HDFS) 之间复制数据。Amazon S3 Amazon S3 是一个对象存储服务,可以存储和检索任意数量的数据。Amazon VPC Amazon VPC 创建 AWS 云中逻辑隔离的部分,用于启动定义的 AWS 资源。AWS Identity and Access Management (IAM) IAM 是一种可安全控制访问 AWS 服务的网页服务。Direct Connect Direct Connect 将您的内部网络通过标准以太网光纤电缆连接到 Direct Connect 位置。接下来的部分我们将讨论使用 S3DistCp 执行数据迁移的步骤。
在开始之前,您需要满足以下前提条件:
Amazon EMR 版本 40 或更高版本。请参考 计划和配置 Amazon EMR 集群。在目标 EMR 集群上安装 S3DistCp默认安装。有一个活跃的 AWS 账户,并且在本地数据中心与 AWS 云之间存在私有网络连接。具有访问 HDFS 中迁移数据权限的 Hadoop 用户。安装并配置AWS 命令行界面AWS CLI。拥有将对象放入 S3 桶的 IAM 权限。登录源集群的任意节点并在 bash 中运行以下命令以获取活动的 NameNode:
在更新版本的 Hadoop 上,使用以下命令获取服务状态,以列出活动的 NameNode:
bash[hadoop@hadoopcluster01 ] hdfs haadmin getAllServiceStatehadoopcluster01testamazonlocal8020 activehadoopcluster02testamazonlocal8020 standbyhadoopcluster03testamazonlocal8020 standby
在较旧版本的 Hadoop 上,运行以下方法获取活动 NameNode:
bash[hadoop@hadoopcluster01 ] getActiveNameNode(){ nameservice=(hdfs getconf confKey dfsnameservices) ns=(hdfs getconf confKey dfshanamenodes{nameservice}) IFS= read ra ADDR ltltlt ns activeNode= for n in {ADDR[@]} do state=(hdfs haadmin getServiceState n) if [ state = active ] then echo state ==gtn activeNode=n fi done activeNodeFQDN=(hdfs getconf confKey dfsnamenoderpcaddress{nameservice}{activeNode}) echo activeNodeFQDN}
[hadoop@hadoopcluster01 ] getActiveNameNodeactive ==gtnamenode863hadoopcluster01testamazonlocal8020
如前提条件中所述,您应该具备一个 EMR 集群并附加一个自定义 IAM 角色给 Amazon EMR。运行以下命令以验证从目标 EMR 集群到源 Hadoop 集群的连接性:
bash[hadoop@emrcluster01 ] telnet hadoopcluster01testamazonlocal 8020Trying 19216801Connected to hadoopcluster01testamazonlocalEscape character is ]]
一元机场官网推荐或者,您也可以运行以下命令:
bash[hadoop@emrcluster01 ] curl v telnet//hadoopcluster01testamazonlocal8020 Trying 192168018020 Connected to hadoopcluster01testamazonlocal (19216801) port 8020 (#0)
检查源 HDFS 路径是否有效。如果以下命令返回 0,表明路径有效,您可以进行下一步:
bash[hadoop@emrcluster01 ] hdfs dfs test d hdfs//hadoopcluster01testamazonlocal/user/hive/warehouse/testdb/testtable01[hadoop@emrcluster01 ] echo 0
使用以下命令将源 HDFS 文件夹传输至目标 S3 桶:
bashs3distcp src hdfs//hadoopcluster01testamazonlocal/user/hive/warehouse/testdb/testtable01 dest s3//ltBUCKETNAMEgt/user/hive/warehouse/testdb/testtable01
要以多部分块转移大文件,请使用以下命令设置块大小:
bashs3distcp src hdfs//hadoopcluster01testamazonlocal/user/hive/warehouse/testdb/testtable01 dest s3//ltBUCKETNAMEgt/user/hive/warehouse/testdb/testtable01 multipartUploadChunkSize=1024
这将对目标 EMR 集群进行 MapReduce 作业。根据数据量和带宽速度,该作业的完成可能需要几分钟到几小时不等。
要获取集群上正在运行的 YARN 应用程序的列表,请运行以下命令:
bashyarn application list
在先前的 MapReduce 作业成功完成后,使用以下步骤验证复制的数据:

bashsourcesize=(hdfs dfs du s hdfs//hadoopcluster01testamazonlocal/user/hive/warehouse/testdb/testtable01 awk F {print 1})targetsize=(aws s3 ls summarize recursive s3///user/hive/warehouse/testdb/testtable01 grep Total Size awk F {print 3})
printf Source HDFS folder Size in bytes sourcesizenprintf Target S3 folder Size in bytes targetsizen
如果源和目标的大小不相等,请进行下一节的清理步骤,并重复前面的 S3DistCp 步骤。
如果 S3DistCp 在复制时失败,它不会清理部分复制的文件和分区。在重新启动 S3DistCp 过程之前,需先清理这些对象。使用以下 AWS CLI 命令进行删除操作:
bashaws s3 rm s3//ltBUCKETNAMEgt/path/to/the/object recursive
为避免在使用 S3DistCP 复制单个文件而非目录时出现错误,请使用 Amazon EMR 5330 或更高版本,或 Amazon EMR 630 或更高版本。
以下是该方法的限制:
如果 S3DistCp 无法复制部分或所有指定文件,则集群步骤失败并返回非零错误代码。这种情况下,S3DistCp 不会清理部分复制的文件。S3DistCp 不支持对于 Parquet 文件的连接操作。请改用 PySpark。有关详细信息,请参见 在 Amazon EMR 中连接 Parquet 文件。VPC 限制适用于 Amazon S3 的 Direct Connect。更多信息请参见 AWS Direct Connect 配额。本文展示了 S3DistCp 在将大量数据从源 Hadoop 集群迁移到目标 S3 桶或 EMR 集群的 HDFS 中的强大功能。使用 S3DistCp,您可以在不影响源集群计算资源的情况下迁移 TB 级别的数据,从而优化了数据迁移过程。
有关使用 S3DistCp 的更多信息,请参阅以下资源:
S3DistCp (s3distcp)在 Amazon EMR 中使用 S3DistCp 高效迁移数据的七个技巧Vicky Wilson Jacob 是 AWS 专业服务分析实践的高级数据架构师,专注于大数据、数据工程、机器学习、数据科学和生成式 AI。他热爱技术,乐于解决客户面临的挑战,致力于帮助客户在云中实施大数据、机器学习、分析及生成式 AI 解决方案。业余时间,他喜欢与家人共度时光,唱歌和弹吉他。
标签 Amazon EMR Amazon S3 S3DistCp