searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

DistCp架构及内核机制

2023-07-27 10:18:20
29
0

引言

DistCp是Hadoop的一个核心工具,主要用于解决数据复制和迁移的需求。在大规模数据处理场景中,高效的数据复制和迁移是非常重要的,这使得DistCp成为了Hadoop生态系统中不可或缺的组件之一。

DistCp架构概述

DistCp的架构可以简要概括为以下几个关键组件:

  • 客户端:负责发起DistCp任务,并向ResourceManager提交MapReduce作业
  • ResourceManager:负责集中管理Hadoop集群的资源和调度作业
  • MapReduce作业:DistCp利用MapReduce进行数据复制。作业的Mapper执行数据复制的实际过程
  • 源数据存储:DistCp的输入,即源文件或目录,存储在HDFS或其他支持Hadoop文件系统的位置
  • 目标数据存储:DistCp的输出,即目标文件或目录,存储在HDFS或其他支持Hadoop文件系统的位置

关键组件

DistCp Driver

  1. 解析传递给命令行上的 DistCp 命令的参数
  • OptionsParser
  • DistCpOptionsSwitch
  1. 将命令参数组装到适当的 DistCpOptions 对象中,并初始化 DistCp
  • 源路径
  • 目标位置
  • 复制选项(例如是否更新复制、覆盖、保留哪些文件属性等)
  1. 编排复制操作
  • 调用复制列表生成器(Copy-listing Generator)来创建要复制的文件列表
  • 设置并启动 Hadoop MapReduce 作业以执行复制
  • 根据选项参数,立即返回 Hadoop MapReduce 作业的句柄,或等待完成

解析器元素仅从命令行执行(或者如果 DistCp::run() 被调用)。DistCp类也可以通过构造DistCpOptions对象并适当地初始化 DistCp 对象来编程使用

Copy-listing生成器

Copy-listing生成器创建要从源复制的文件/目录列表,会检查源路径(文件/目录,包括通配符)的内容,并将需要复制的所有路径记录到 SequenceFile 中以供 DistCp Hadoop 作业使用。该模块中的主要类包括:

  • CopyListing:应该由任何复制列表生成器实现(copy-listing generator implementation)实现的接口。还提供用于选择具体 CopyListing 实现的工厂方法(factory method)。
  • SimpleCopyListing:CopyListing 的一种实现,它接受多个源路径(文件/目录),并递归地列出每个文件和目录下的所有文件和目录以供复制。
  • GlobbedCopyListing:CopyListing 的另一种实现,它扩展了源路径中的通配符。
  • FileBasedCopyListing:CopyListing 的实现,它从指定文件中读取源路径列表。

版本优化:旧版接口实现中,仅列出了必须要复制到目标的路径,这步需要比较文件大小和校验和,可能耗时较高;新版本这步推迟到了MapReduce作业中,减少了这步耗时,由于多个map并行执行,性能也得到了进一步提升

InputFormats 和 MapReduce 组件

将文件和目录从源路径实际复制到目标路径

  • UniformSizeInputFormat: org.apache.hadoop.mapreduce.InputFormat 的这个实现提供了与 Legacy DistCp 在跨映射负载平衡方面的等效性。UniformSizeInputFormat 的目的是使每个映射副本的字节数大致相同。因此,列表文件被分成多组路径,这样每个 InputSplit 中的文件大小总和几乎等于所有其他映射。拆分并不总是完美的,但其简单的实现使设置时间很短。
  • DynamicInputFormat 和 DynamicRecordReader: DynamicInputFormat 实现了 org.apache.hadoop.mapreduce.InputFormat,是DistCp新增接口。列表文件被分成几个“块文件”(chunk files),块文件的确切数量是Hadoop作业中请求的map数量的倍数。在启动作业之前,每个map任务都“分配”了一个块文件(通过将块重命名为任务的 id)。使用 DynamicRecordReader 从每个块中读取路径,并在 CopyMapper 中进行处理。处理完一个chunk中的所有路径后,删除当前chunk,获取新的chunk。该过程一直持续到没有更多块可用为止。这种“动态”方法允许较快的map任务比较慢的map任务消耗更多的路径,从而加快 DistCp 作业的整体速度。
  • CopyMapper:该类实现了物理文件拷贝。根据输入选项(在作业配置中指定)检查输入路径,以确定是否需要复制文件。只有满足以下至少一项条件时,才会复制文件:
    • 目标文件夹中不存在同名文件。
    • 目标文件夹中存在同名文件,但文件大小不同。
    • 目标文件夹中存在同名文件,但具有不同的校验和,并且未提及 -skipcrccheck。
    • 目标文件夹中存在同名文件,但指定了 -overwrite。
    • 目标文件夹中存在同名文件,但块大小不同(需要保留块大小)。
  • CopyCommitter:该类负责DistCp作业的commit阶段,包括:
    • 保留目录权限(如果在选项中指定)
    • 清理临时文件、工作目录等。

DistCp内核机制

关键步骤

DistCp的内核机制包括以下关键步骤:

  • 输入划分:根据输入的源数据大小和目标数据存储的容量,将输入数据划分为多个分片,以便并行处理
  • Map阶段:每个Map任务负责复制一个数据分片,Mapper执行文件的复制和写入操作
  • 进度监控:客户端定期从ResourceManager获取MapReduce作业的进度信息,并展示给用户
  • 容错处理:DistCp具有容错机制,当某个Map任务失败时,会重新启动失败的任务,保证数据的完整性和一致性
  • 输出合并:在Map阶段完成后,DistCp将所有数据分片合并为最终的输出目标

 

执行流程

  1. 解析输入参数:解析用户通过命令行或其他方式传入的输入参数,包括源路径、目标路径以及其他选项参数,如覆盖现有文件、保留文件权限等。
  2. 创建源和目标文件系统的对象:distcp会使用解析到的源路径和目标路径信息,创建源文件系统(例如HDFS)和目标文件系统(例如HDFS或S3)的对象,以便后续的文件操作可以在这些文件系统上执行。
  3. 检查权限和设置选项:distcp会检查用户是否具有足够的权限来复制文件或目录,并根据用户指定的选项参数进行设置,如是否覆盖现有文件、是否保留文件权限等。
  4. 获取源路径上的文件列表:distcp会通过源文件系统的对象,获取源路径上的文件列表,包括文件和目录。
  5. 创建目标路径上的目录:distcp会通过目标文件系统的对象,根据源路径上的目录结构,在目标路径上创建相应的目录。
  6. 提交复制任务:distcp会根据用户指定的并行度,将源路径上的文件列表切分成多个文件切片,并为每个文件切片创建一个复制任务。这些任务将被提交到Hadoop集群中的任务调度器(如YARN)进行执行。
  7. 并行复制:在任务调度器中,distcp的复制任务将在不同的节点上并行执行,从源文件系统读取文件切片的内容,并将其写入目标文件系统。这样可以加快复制速度,提高效率。
  8. 容错处理:如果在复制过程中发生错误,如网络故障、权限不足等,distcp会进行容错处理,例如重试、跳过错误文件等,以确保复制过程的可靠性。
  9. 进度监控:distcp会定期汇报复制的进度信息,包括已复制的文件数量、大小等,以便用户可以实时了解复制的状态。
  10. 完成复制:一旦所有的复制任务都完成,distcp会生成复制的总体摘要信息,包括复制的文件数量、大小等,并输出给用户。

数据一致性保证

DistCp复制过程中,确保数据的一致性和完整性是非常重要的。DistCp通过采用数据检验和校验的方式来保证数据一致性。在复制完成后,会对源数据和目标数据进行校验和比较,以确保数据的准确复制

并行性和性能优化

DistCp支持多个Map任务并行执行,通过这种方式提高了数据复制的速度和性能。同时,DistCp还可以使用多线程来加速文件的复制过程,从而更好地利用系统资源。

 

参考文献:

https://hadoop.apache.org/docs/r3.3.3/hadoop-distcp/DistCp.html

https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.5/administration/content/distcp_architecture.html

0条评论
0 / 1000
j****n
4文章数
0粉丝数
j****n
4 文章 | 0 粉丝
j****n
4文章数
0粉丝数
j****n
4 文章 | 0 粉丝
原创

DistCp架构及内核机制

2023-07-27 10:18:20
29
0

引言

DistCp是Hadoop的一个核心工具,主要用于解决数据复制和迁移的需求。在大规模数据处理场景中,高效的数据复制和迁移是非常重要的,这使得DistCp成为了Hadoop生态系统中不可或缺的组件之一。

DistCp架构概述

DistCp的架构可以简要概括为以下几个关键组件:

  • 客户端:负责发起DistCp任务,并向ResourceManager提交MapReduce作业
  • ResourceManager:负责集中管理Hadoop集群的资源和调度作业
  • MapReduce作业:DistCp利用MapReduce进行数据复制。作业的Mapper执行数据复制的实际过程
  • 源数据存储:DistCp的输入,即源文件或目录,存储在HDFS或其他支持Hadoop文件系统的位置
  • 目标数据存储:DistCp的输出,即目标文件或目录,存储在HDFS或其他支持Hadoop文件系统的位置

关键组件

DistCp Driver

  1. 解析传递给命令行上的 DistCp 命令的参数
  • OptionsParser
  • DistCpOptionsSwitch
  1. 将命令参数组装到适当的 DistCpOptions 对象中,并初始化 DistCp
  • 源路径
  • 目标位置
  • 复制选项(例如是否更新复制、覆盖、保留哪些文件属性等)
  1. 编排复制操作
  • 调用复制列表生成器(Copy-listing Generator)来创建要复制的文件列表
  • 设置并启动 Hadoop MapReduce 作业以执行复制
  • 根据选项参数,立即返回 Hadoop MapReduce 作业的句柄,或等待完成

解析器元素仅从命令行执行(或者如果 DistCp::run() 被调用)。DistCp类也可以通过构造DistCpOptions对象并适当地初始化 DistCp 对象来编程使用

Copy-listing生成器

Copy-listing生成器创建要从源复制的文件/目录列表,会检查源路径(文件/目录,包括通配符)的内容,并将需要复制的所有路径记录到 SequenceFile 中以供 DistCp Hadoop 作业使用。该模块中的主要类包括:

  • CopyListing:应该由任何复制列表生成器实现(copy-listing generator implementation)实现的接口。还提供用于选择具体 CopyListing 实现的工厂方法(factory method)。
  • SimpleCopyListing:CopyListing 的一种实现,它接受多个源路径(文件/目录),并递归地列出每个文件和目录下的所有文件和目录以供复制。
  • GlobbedCopyListing:CopyListing 的另一种实现,它扩展了源路径中的通配符。
  • FileBasedCopyListing:CopyListing 的实现,它从指定文件中读取源路径列表。

版本优化:旧版接口实现中,仅列出了必须要复制到目标的路径,这步需要比较文件大小和校验和,可能耗时较高;新版本这步推迟到了MapReduce作业中,减少了这步耗时,由于多个map并行执行,性能也得到了进一步提升

InputFormats 和 MapReduce 组件

将文件和目录从源路径实际复制到目标路径

  • UniformSizeInputFormat: org.apache.hadoop.mapreduce.InputFormat 的这个实现提供了与 Legacy DistCp 在跨映射负载平衡方面的等效性。UniformSizeInputFormat 的目的是使每个映射副本的字节数大致相同。因此,列表文件被分成多组路径,这样每个 InputSplit 中的文件大小总和几乎等于所有其他映射。拆分并不总是完美的,但其简单的实现使设置时间很短。
  • DynamicInputFormat 和 DynamicRecordReader: DynamicInputFormat 实现了 org.apache.hadoop.mapreduce.InputFormat,是DistCp新增接口。列表文件被分成几个“块文件”(chunk files),块文件的确切数量是Hadoop作业中请求的map数量的倍数。在启动作业之前,每个map任务都“分配”了一个块文件(通过将块重命名为任务的 id)。使用 DynamicRecordReader 从每个块中读取路径,并在 CopyMapper 中进行处理。处理完一个chunk中的所有路径后,删除当前chunk,获取新的chunk。该过程一直持续到没有更多块可用为止。这种“动态”方法允许较快的map任务比较慢的map任务消耗更多的路径,从而加快 DistCp 作业的整体速度。
  • CopyMapper:该类实现了物理文件拷贝。根据输入选项(在作业配置中指定)检查输入路径,以确定是否需要复制文件。只有满足以下至少一项条件时,才会复制文件:
    • 目标文件夹中不存在同名文件。
    • 目标文件夹中存在同名文件,但文件大小不同。
    • 目标文件夹中存在同名文件,但具有不同的校验和,并且未提及 -skipcrccheck。
    • 目标文件夹中存在同名文件,但指定了 -overwrite。
    • 目标文件夹中存在同名文件,但块大小不同(需要保留块大小)。
  • CopyCommitter:该类负责DistCp作业的commit阶段,包括:
    • 保留目录权限(如果在选项中指定)
    • 清理临时文件、工作目录等。

DistCp内核机制

关键步骤

DistCp的内核机制包括以下关键步骤:

  • 输入划分:根据输入的源数据大小和目标数据存储的容量,将输入数据划分为多个分片,以便并行处理
  • Map阶段:每个Map任务负责复制一个数据分片,Mapper执行文件的复制和写入操作
  • 进度监控:客户端定期从ResourceManager获取MapReduce作业的进度信息,并展示给用户
  • 容错处理:DistCp具有容错机制,当某个Map任务失败时,会重新启动失败的任务,保证数据的完整性和一致性
  • 输出合并:在Map阶段完成后,DistCp将所有数据分片合并为最终的输出目标

 

执行流程

  1. 解析输入参数:解析用户通过命令行或其他方式传入的输入参数,包括源路径、目标路径以及其他选项参数,如覆盖现有文件、保留文件权限等。
  2. 创建源和目标文件系统的对象:distcp会使用解析到的源路径和目标路径信息,创建源文件系统(例如HDFS)和目标文件系统(例如HDFS或S3)的对象,以便后续的文件操作可以在这些文件系统上执行。
  3. 检查权限和设置选项:distcp会检查用户是否具有足够的权限来复制文件或目录,并根据用户指定的选项参数进行设置,如是否覆盖现有文件、是否保留文件权限等。
  4. 获取源路径上的文件列表:distcp会通过源文件系统的对象,获取源路径上的文件列表,包括文件和目录。
  5. 创建目标路径上的目录:distcp会通过目标文件系统的对象,根据源路径上的目录结构,在目标路径上创建相应的目录。
  6. 提交复制任务:distcp会根据用户指定的并行度,将源路径上的文件列表切分成多个文件切片,并为每个文件切片创建一个复制任务。这些任务将被提交到Hadoop集群中的任务调度器(如YARN)进行执行。
  7. 并行复制:在任务调度器中,distcp的复制任务将在不同的节点上并行执行,从源文件系统读取文件切片的内容,并将其写入目标文件系统。这样可以加快复制速度,提高效率。
  8. 容错处理:如果在复制过程中发生错误,如网络故障、权限不足等,distcp会进行容错处理,例如重试、跳过错误文件等,以确保复制过程的可靠性。
  9. 进度监控:distcp会定期汇报复制的进度信息,包括已复制的文件数量、大小等,以便用户可以实时了解复制的状态。
  10. 完成复制:一旦所有的复制任务都完成,distcp会生成复制的总体摘要信息,包括复制的文件数量、大小等,并输出给用户。

数据一致性保证

DistCp复制过程中,确保数据的一致性和完整性是非常重要的。DistCp通过采用数据检验和校验的方式来保证数据一致性。在复制完成后,会对源数据和目标数据进行校验和比较,以确保数据的准确复制

并行性和性能优化

DistCp支持多个Map任务并行执行,通过这种方式提高了数据复制的速度和性能。同时,DistCp还可以使用多线程来加速文件的复制过程,从而更好地利用系统资源。

 

参考文献:

https://hadoop.apache.org/docs/r3.3.3/hadoop-distcp/DistCp.html

https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.5/administration/content/distcp_architecture.html

文章来自个人专栏
数据同步
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0