目录

  • 概览
  • 性能范围
    • 块大小
  • HDFS读写过程
    • 写过程
    • 读过程
  • HDFS调优参数
    • 0 调优
    • 1 HDFS Block Size
    • 2 HDFS Replication
    • 3 NameNode,DataNode system
    • 4 栗子:分布式复制
  • HDFS健壮性
    • 健壮性如何达到?

概览

  • 可扩展的分布式文件系统

  • 将数据以节点形式分布在本地磁盘上

  • 高度容错:可以使用低成本商业硬件

  • 数以千计的节点:需要处理节点或硬盘的failure

  • 轻量级

  • 高流通量

Approach:

  • 一致性模型:写一次读多次
  • 数据复制:可以处理硬件failure
  • 将计算放在数据附近
  • 放宽一部分POSIX约束,来实现流式读取文件系统数据的目的。

可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。什么是POSIX? – 问答 – 云+社区 – 腾讯云 (tencent.com)

  • 单个NameNode:管理文件系统的命名空间以及用户访问文件的规范,追踪情况
  • 多个DataNode:一般每个节点有一个DataNode。管理存储、为用户提供读写request,数据块的增删改

性能范围

  • 给定文件大小决定block的数量
  • 受块大小影响的关键HDFS和系统组件

块大小

  • 默认为64MB
  • 10GB文件会被分为:10*1024/64=160块

为什么块很重要?

  • Namenode内存使用:每个块都代表一个object
  • map task的数量是基于块的数量的

为什么最好不要有很多很小的文件?

  • 内存使用:基本上每个object有150byte大小
  • 网络加载:check这些datanode的状态会加重网络负担
  • Map task:会产生许多排队任务,延迟,硬盘读写的效率低下
    解决方法for大量小文件:
  • 合并文件
  • 序列文件?(sequence file):文件名作为key,data作为value
  • HBase&Hive
  • CombineFileInputFormatCombineFileInputFormat 文件分片总结_程序员小陶的大数据分享-CSDN博客

我们并不希望一个小文件就产生一个 map 任务,为了有效利用集群资源,优化任务的执行。CombineFileInputFormat通过将多个“小文件”合并为一个”切片”(在形成切片的过程中也考虑同一节点、同一机架的数据本地性),让每一个Mapper任务可以处理更多的数据,从而提高MR任务的执行速度。

HDFS读写过程

写过程

  1. 用户请求创建文件,数据首先被缓存在本地
  2. 数据积累到block的size时联系namenode,获得进一步的信息。
  3. namenode反馈一组datanodes(namenode是机架感知的)
    机架感知(RackAwareness)IT探的博客-CSDN博客_机架感知

机架感知是一种计算不同计算节点(TaskTracker)的距离的技术,用以在任务调度过程中尽量减少网络带宽资源的消耗,这里用尽量,想表达的是当一个TT(TaskTracker)申请不到本地化任务时,JT(JobTracker)会尽量调度一个机架的任务给他,因为不同机架的网络带宽资源比同一个机架的网络带宽资源更可贵。

数据一共复制三份(三个datanode),第一份在client所在的机架(rack)上,后两份在另一个机架上。
4. 第一个datanode接受client的data并写入本地,并且同时将data传递至下一个datanode——是一个pipeline
5. namenode提交文件创建(持续状态)
6. namenode接收heartbeat和节点报告: Hadoop-2.4.1源码分析–HDFS HeartBeat(心跳检测)整体结构_HelloWorld-CSDN博客_hadoop heartbeat

心跳就是HDFS中从节点DataNode周期性的向名字节点NameNode做汇报,汇报自己的健康情况、负载状况等,并从NameNode处领取命令在本节点执行,保证NameNode这一HDFS指挥官熟悉HDFS的全部运行情况,并对从节点DataNode发号施令,以完成来自外部的数据读写请求或内部的负载均衡等任务。

读过程

  1. client从namenode处获得datanode列表
  2. HDFS寻找离reader最近的replica

HDFS调优参数

0 调优

调优环境通常在HDFS XML配置文件中,例如HDFS -site. XML中。一般的商业供应商会提供一些管理控制台。

1 HDFS Block Size

可以根据workload改变,例如128MB
dfs.blocksizedfs.block.size

2 HDFS Replication

默认是3,dfs.replication
tradeoffs:

  • 降低会减少复制的成本
  • 减低健壮性:难以恢复数据
  • 提高会导致更多的worker可以使用本地数据
  • 降低可以获得更多的空余空间

3 NameNode,DataNode system

基本不需要更改,更多可以看这个网页:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

4 栗子:分布式复制

并行文件系统中复制32个文件(总大小:512GB)
改变map和node数量

HDFS健壮性

健壮性如何达到?

failure:

  • DataNode Failure:服务器宕机、磁盘损坏、数据损坏
  • Network Failure
  • NameNode Failure:磁盘故障、节点故障
    减少failure:
  • 周期性的heartbeat:从datanode到namenode
    • 如果最近失去了heartbeat:
      • 标记为dead,不再发送IO
      • 在另一个节点上重新复制
  • checksum(Hadoop数据完整性与CheckSum校验原理_雾幻的博客-CSDN博客_hadoop 文件校验)

检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和(checksum)并存储,在数据进行传输后再次计算校验和进行对比,如果计算所得的新校验和和原来的校验和不匹配,就认为数据已损坏。但该技术并不能修复数据——它只能检测出数据错误。(这正是不使用低端硬件的原因。具体说来,一定要使用ECC内存。)注意,校验和也是可能损坏的,不只是数据,但由于校验和比数据小得多,所以损坏的可能性非常小。

    • 创建文件时计算,存储在HDFS的命名空间
    • 读文件时进行校验,如果和创建文件时的checksum不一样的话就从其他replica读取
  • copy一些namenode(metadata)默认是人工切换。