2. Hadoop HDFS

Posted 小K学大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. Hadoop HDFS相关的知识,希望对你有一定的参考价值。

Hadoop

HDFS

概述

HDFS(Hadoop Distributed File System),分布式文件系统用于存储文件,通过目录树定位文件,由多个服务器节点联合起来实现功能,集群中的服务器有各自的角色

适合一次写入,多次读取的场景,只能append(追加写)。一个文件在经过创建、写入和关闭之后就不需要被改变

优缺点

优点

  1. 高容错性
    • 数据以多副本形式保存在各个节点上,某一个节点上的数据丢失以后,可根据另外节点上的完整数据进行自动恢复
  2. 适合处理大数据场景
    • 数据规模大、数据量大
  3. 可构建在廉价的机器上

缺点

  1. 不适合低延时的数据访问
    • 不能做到毫秒级的存储数据(mysql、Hive可以做到)
  2. 无法高效的对大量小文件进行存储
    • 每个文件需要存储文件目录和块信息,NameNode存储有限
    • 单个小文件的寻址时间会超过读取时间,违背HDFS设计原则
  3. 不支持并发写入和文件的随机修改
    • 一个文件同时只能运行一个线程或任务写入
    • 仅支持数据追加写入,不支持文件的随机修改

组成架构

  1. NameNode(NN):HDFS的管理者
    • 管理HDFS的名称空间
    • 配置副本策略
    • 管理数据块的映射信息
    • 处理客户端的读写请求
  2. DataNode(DN):执行实际的操作
    • 存储实际的数据块
    • 执行数据块的读写操作
  3. Client:客户端
    • 文件切分,在文件上传HDFS的时候,客户端将文件按照Block大小切分成一个个的Block,然后上传
    • 与NN交互,获取文件的位置信息
    • 与DN交互,读取或者写入数据
    • 提供命令管理HDFS ---> NN的格式化
    • 提供命令访问HDFS ---> HDFS的增删改查
  4. Seconary NameNode
    • 辅助NN,定期合并Fsimage和Edits,并推送给NN
    • 紧急情况下,可以辅助恢复NN

HDFS文件块大小

文件块大小的设定与硬盘的传输速度有关,目前普通机械硬盘的传输速度为100MB/s。假设寻址时间为10ms,存储时间为寻址时间的100倍,为保证HDFS的高效运行,将每个文件块的大小设定为128MB。

  1. 数据块设置过小,会增加寻址时间,DN中存储过多的数据块,导致程序一直在寻找块的开始位置
  2. 数据块设置过大,会增加将数据写入硬盘的时间,远大于定位到指定数据块所需的时间,处理该数据块的时间也会增加

Shell操作

  1. hadoop fs -moveFromLocal
  2. hadoop fs -copyFromLocal
  3. hadoop fs -put
  4. hadoop fs -appendToFile
  5. hadoop fs -copyToLocal
  6. hadoop fs -get
  7. hadoop fs -ls
  8. hadoop fs -cat
  9. hadoop fs -chmod/-chown
  10. hadoop fs -mkdir
  11. hadoop fs -cp
  12. hadoop fs -mv
  13. hadoop fs -tail
  14. hadoop fs -rm/-rm -r
  15. hadoop fs -setrep ---> 设置副本数量

写入流程

图解

流程

  1. 客户端创建Distributed FileSystem
  2. 客户端向NN发送请求上传文件
  3. NN检查存储的元数据
    • 文件是否已存在
    • 父目录是否已存在
  4. NN返回响应客户端是否可以上传指定文件
  5. 客户端请求上传文件的第一个Block,请求NN返回上传至哪几台DN(假设副本数为3)
  6. NN返回DN节点信息
  7. 客户端通过FSDataOutputStream模块请求DN1上传数据并建立pipeline
    • DN1收到请求继续请求DN2建立通道pipeline
    • DN2请求DN3建立通道pi peline
    • 完成通道建立
  8. 从DN3开始向上应答 ---> DN3-DN2-DN1-客户端
  9. 客户端开始向DN1上传第一个Block
    • 以packet为单位(64kb)
    • packet包含chunck(512byte)和chuncksum(4byte)
    • 将packet写入dataQueue
    • 将第一个packet传给DN1,持久化至磁盘的同时,将packet向下一个DN节点传
    • packet写入DN1的同时,会备份一份packet至ackQueue
    • packet写入完成后,各个节点会向上返回写入状态,是否完成写入
    • DN1返回所有节点的写入状态给客户端的ResponseProcessor
      • 如果成功写入指定packet,删除ackQueue中的packet
      • 如果不成功,将ackQueue中的packet上传至dataQueue的最前端,继续重新发送该packet
    • 完成第一个Block上传
  10. 客户端请求上传下一个Block

读入流程

图解

流程

  1. 客户端创建Distributed FileSystem
  2. 客户端向NN发送下载请求
  3. NN判断是否可以下载
    • 客户端权限
    • 是否存在指定文件
  4. 返回指定文件元数据
  5. 客户端创建FSDataInputStream
  6. 客户端通过NN返回的数据块元数据,计算距离最近的DN节点,同时考虑最近节点的目前负载能力,选择最优DN节点,请求读取数据
  7. 以packet为数据传输单位接收并做文件校验
  8. 读取数据块模式 ---> 串行(先读完Block1之后再读Block2)

NameNode和Seconary NameNode

第一阶段

  1. 第一次启动并格式化DN后,创建Fsimage和Edits文件
    • Fsimage:存储HDFS系统中所有目录和文件inode的序列化信息
    • Edits:存储HDFS系统中所有执行的操作命令
  2. 客户端对元数据进行增删改查的请求
  3. NN将记录首先保存至Edits文件中记录操作日志,并实时更新滚动日志
  4. NN在内存中对元数据进行指定操作

第二阶段

  1. 2NN询问NN是否需要CheckPoint
  2. 2NN请求执行CheckPoint
    • 每隔一小时执行一次
    • 每分钟检查操作次数,如果操作次数达到100万,执行CheckPoint
  3. NN滚动正在写入的Edits日志文件
  4. 将滚动前的Edits日志和Fsimage文件拷贝至2NN
  5. 加载Edits和Fsimage至内存,并在内存中合并
  6. 生成新的Fsimage
  7. 将新的Fsimage拷贝至NN
  8. NN重命名新的Fsimage

DataNode工作机制

  1. 每个数据块以文件形式存储在DataNode中,包含两个文件
    • 数据本身
    • 元数据:包含数据块长度、块数据校验和、时间戳
  2. DataNode在启动后向NameNode注册
  3. 以后每6小时DataNode扫描自身节点的数据块信息,并同时上报给NameNode
  4. DataNode每3秒发送心跳给NameNode
    • 如果超过10分钟加10个心疼时常(3秒)没有收到DataNode发给NameNode的心跳,NameNode任务该节点不可用


以上是关于2. Hadoop HDFS的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop生态系统简介及大数据相关技术

Maven构建Hadoop Maven构建Hadoop工程

Hive初识

Apache HAWQ 创建使用SSD磁盘的表

大数据从0到一(HDFS)

大数据从0到一(HDFS)