大数据宝典

Hadoop

HDFS 读写流程

HDFS写流程:

image-1714192730620

  1. 客户端发送上传请求,通过RPC与NameNode建立通信。NameNode检查用户是否有上传权限,目标文件是否已存在,父目录是否存在。
  2. NameNode返回是否可以上传
  3. 客户端根据文件的大小进行切分,默认128M一块,切分完成之后给NameNode 发送请求第一个 block 块上传到哪些服务器上
  4. NameNode收到请求之后,根据网络拓扑、机架感知、副本机制进行文件分配,返回可用的DataNode地址(dn1,dn2,dn3)。
  5. 客户端收到地址后与dn1进行通信,本质就是RPC调用,建立pipeline,dn1收到请求后继续调用dn2,dn2调用dn3,将整个pipeline建立完成。
  6. dn1,dn2,dn3逐级响应客户端。
  7. 客户端向dn1发送第一个block, 先从磁盘读取数据数据然后放到本地内存缓存,以packet(数据包,64kb)为单位,dn1收到一个packet就会发送给dn2,然后dn2发送给dn3,dn1每传完一个packet回就回放入一个应答队列等待应答
  8. 数据被分割成一个个的packet数据包在pipeline上依次传输,在pipeline反向传输中,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点dn1将pipeline ack发送给客户端
  9. 当一个block传输完成之后,客户端再次请求NameNode上传第二个block,NameNode重新选择三台DataNode给客户端,然后重复上述流程

注:Hadoop 在设计时考虑到数据的安全与高效,数据文件默认在HDFS 上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份, 不同机架的某一节点上一份。

HDFS读流程:

image-1714192955215

  1. 客户端向NameNode发送RPC请求,请求文件block的位置
  2. NameNode收到请求后检查用户权限以及是否有这个文件,如果都符合,则视情况返回部分或者全部的block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址。这些返回的DataNode地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序。排序有两个规则:网络拓扑结构中距离客户端近的排靠前;心跳机制中超时汇报的DataNode状态为STALE,这样的排靠后。
  3. 客户端选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)
  4. 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
  5. 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
  6. 读取完一个 block 都会进行 checksum 验证,如果读取DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该block 副本的DataNode继续读;
  7. read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回 Client 请求包含块的 DataNode 地址,并不是返回请求块的数据
  8. 最终读取来所有的 block 会合并成一个完整的最终文件;

HDFS在读取文件的时候,如果其中一个块突然损坏了怎么办

客户端读取完 DataNode 上的块之后会进行 checksum 验证,也就是把客户端读取到本地的块与 HDFS 上的原始块进行校验,如果发现校验结果不一致,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的 DataNode 继续读

HDFS 在上传文件的时候,如果其中一个 DataNode 突然挂掉了怎么办

客户端上传文件时与 DataNode 建立 pipeline 管道,管道的正方向是客户端向DataNode 发送的数据包,管道反向是 DataNode 向客户端发送ack 确认,也就是正确接收到数据包之后发送一个已确认接收到的应答。
当 DataNode 突然挂掉了,客户端接收不到这个 DataNode 发送的ack 确认,客户端会通知 NameNode,NameNode 检查该块的副本与规定的不符,NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不再让它参与文件上传与下载。

NameNode 在启动的时候会做哪些操作

NameNode 数据存储在内存和本地磁盘,本地磁盘数据存储在fsimage 镜像文件和edits 编辑日志文件

首次启动 NameNode:

  1. 格式化文件系统,为了生成 fsimage 镜像文件
  2. 启动 NameNode:
    • 读取 fsimage 文件,将文件内容加载进内存
    • 等待 DataNade 注册与发送 block report
  3. 启动 DataNode:
    • 向 NameNode 注册
    • 发送 block report
    • 检查 fsimage 中记录的块的数量和 block report 中的块的总数是否相同
  4. 对文件系统进行操作(创建目录,上传文件,删除文件等):
    • 此时内存中已经有文件系统改变的信息,但是磁盘中没有文件系统改变的信息,此时会将这些改变信息写入edits 文件中,edits 文件中存储的是文件系统元数据改变的信息。

第二次启动 NameNode:

  1. 读取 fsimage 和 edits 文件;
  2. 将 fsimage 和 edits 文件合并成新的 fsimage 文件;
  3. 创建新的 edits 文件,内容开始为空;
  4. 启动 DataNode。

Hadoop的checkpoint流程

image-1714269136297

Hadoop 1.x 2.x 3.x 的区别

  1. Hadoop 1.x:

    • Hadoop 1.x是Hadoop的最早版本,也称为Hadoop MapReduce版本。它包括两个核心组件:Hadoop Distributed File System (HDFS)和MapReduce计算框架。
    • Hadoop 1.x中的资源管理和作业协调由JobTracker和TaskTracker完成。JobTracker负责作业调度和资源管理,而TaskTracker负责执行作业中的任务。
    • 这个版本的Hadoop存在一些局限性,例如不支持多个计算框架共享同一集群资源,不支持容错性较好的资源管理等。
  2. Hadoop 2.x:

    • Hadoop 2.x引入了YARN(Yet Another Resource Negotiator)作为资源管理器。YARN将资源管理和作业调度分离开来,允许多个计算框架(如MapReduce、Apache Tez、Apache Spark等)共享集群资源。
    • Hadoop 2.x的YARN架构使得Hadoop集群更加灵活和多样化,使得用户可以更好地运行不同种类的工作负载。
    • 除了YARN,Hadoop 2.x还引入了一些其他的改进和功能增强,如HDFS HA(高可用性)、HDFS Federation(多名称节点支持)等。
  3. Hadoop 3.x:

    • Hadoop 3.x是Hadoop的最新版本,引入了许多新功能和改进。
    • Hadoop 3.x的一个重要特性是Erasure Coding(纠删码)的引入,这使HDFS的存储效率得到了提高,可以节省存储成本。
    • 另一个重要的改进是Hadoop 3.x中的资源调度器的改进,包括容器调度器的改进和动态资源配置的引入,使得集群资源的利用更加高效。
    • 此外,Hadoop 3.x还包括了一些性能优化、安全性改进和其他功能增强。

Hadoop集群计算的时候 什么是集群的瓶颈

  1. 磁盘I/O:
    • Hadoop集群中的数据通常存储在HDFS中,作业在执行过程中需要频繁地读取和写入数据。如果节点的磁盘I/O能力不足,会导致数据读写速度变慢,从而影响作业的执行效率。
  2. 网络带宽:
    • Hadoop集群中的各个节点之间需要频繁地进行数据传输和通信,如果集群的网络带宽不足,会导致数据传输速度变慢,从而影响作业的执行效率。
  3. 硬件资源:
    • 集群中的节点硬件资源包括CPU、内存和存储等。如果某些节点的硬件资源不足,可能会导致作业在这些节点上的执行速度较慢,从而成为集群的瓶颈。
  4. 资源调度:
    • Hadoop集群中的资源调度器负责将作业分配到各个节点上进行执行。如果资源调度器的性能不佳或者配置不合理,可能会导致某些节点资源利用不均匀,从而影响作业的整体执行效率。
  5. 作业调度:
    • 作业调度器负责管理集群中各个作业的执行顺序和优先级。如果作业调度器的性能不佳或者配置不合理,可能会导致作业之间的调度冲突或者作业执行的顺序不合理,从而影响整个集群的性能。
  6. 数据倾斜:
    • 如果作业中的数据分布不均匀,可能会导致某些节点负载过重,从而影响作业的执行效率。这种情况通常称为数据倾斜。
  7. 作业设计和调优:
    • 作业的设计和调优也可能成为集群的瓶颈。如果作业设计不合理或者作业参数调优不足,可能会导致作业执行效率较低,从而影响整个集群的性能。

Hadoop的默认块是多大,为什么这么设置

  1. 适应大文件处理:Hadoop被设计用来处理大规模的数据,因此默认的块大小要足够大,以便能够高效地处理大文件。较大的块大小可以减少磁盘寻址和数据传输的开销,从而提高整体的处理效率。
  2. 减少元数据开销:在Hadoop中,每个文件都会被划分成一个或多个块,并在HDFS中存储这些块。较大的块大小可以减少文件所需的元数据量,因为每个文件需要的元数据数量与其包含的块数量成正比。减少元数据的数量有助于降低HDFS的管理开销,提高整个系统的性能和可扩展性。
  3. 减少任务启动时间:在Hadoop中,作业的执行是以块为单位的,作业会被分成多个任务来处理不同的块。较大的块大小可以减少作业启动时的任务数量,从而减少作业启动的开销,提高作业的执行效率。