Hadoop学习笔记之HDFS

组成:

  • nameNode:
    • 存储元数据(文件名,大小,类型等信息)
    • 元数据保存在磁盘中,启动时加载到内存
    • 保存文件,block,dataNode之间的映射关系
  • dataNode:
    • 存储文件内容
    • 文件内容保存在磁盘
    • 维护了blockId到dataNode本地文件的映射关系

运行机制:

  • 一个nameNode, 多个dataNode
  • 数据复制【副本机制】
  • 故障检测
    • dataNode是否宕机
    • 数据是否完整
  • 空间回收机制

优势

  • 高容错性
    • 数据自动保存多个副本
    • 副本丢失后自动恢复
  • 适合大数据
    • TB 甚至PB级别的数据
    • 百万规模以上的文件数量
    • 10K+ 节点
  • 可构建在廉价机器上
    • 经过对歌副本提升可靠行
    • 提供了容错和恢复机制

缺点

  • 低延迟数据访问
    • 好比毫秒级
    • 低延迟与高吞吐量
    • 大量小文件存储
      • 占用大量的nameNode内存
      • 寻道时间超过读取时间
    • 并发写入,文件随机修改
      • 文件放在hdfs后不方便修改(修改内容)
      • 一个文件不能有多个写入者

数据存储单元(block)

  • 文件被切割成固定大小的数据块,默认每一个块是64MB,可配
  • 若文件不足64MB, 也单独存一个block;一个block只存一个文件,但一个文件可能存多个block。
  • block是逻辑概念,不是物理结构,即文件实际多大就占用多大的磁盘空间。
  • 默认每一个数据存两个副本(共三份数据),可配。
  • 副本数和块的大小经过client上传时设置。文件上传成功后,副本数可修改,块的大小不可修改。

设计思想

一个文件,以70MB为例,将被切分红两个数据块(64MB和6MB),每一个block存三份在不一样的节点(dataNode)上。 当有一个dataNode挂掉,hdfs会发现某个block的副本数 < 3,这时会找到另外的一个副本,复制一份,而后存在其余空闲的dataNode上,这时副本数又恢复到3份副本。linux

NameNode(NN)

  • 主要功能:接受client的读写请求
  • 保存信息包括:
    • 文件全部人,权限,
    • 文件包含哪些block,
    • block保存在哪一个dataNode上(dataNode启动时上报给nameNode)
  • nameNode的元数据(metadata)启动后加载到内存
    • metadata存储在磁盘的文件名是fsimage
    • block位置信息不会存fsimage(启动时上报而后加载到内存)
    • edits目录记录对metadata的操做日志。好比,当有新增删除操做时,会更新内存中的metadata,但并不会立刻更新fsimage,而是记录一条日志,隔一段时间以后再合并到fsimage中。

SecondaryNameNode(SNN)

  • 并非nameNode的备份,但能够作一部分的元数据的备份api

  • 主要功能:帮助nameNode合并edits文件安全

  • 合并时机:并发

    • 根据设置的时间间隔fs.checkpoint.period 默认3600s
    • 根据设置的edits log大小fs.checkpoint.size 默认64MB
  • 合并流程:SNN将NN的edits和fsimage拷贝过来,进行合并。而后将新生成的fsimage传输到NN替换旧的fsimage。为了保证数据不丢失,在SNN拷贝edits的时候,NN已经启用了新的edits。如此轮回反复。oop

  • 在NN挂了以后,SNN还保留着上次备份完成时的fsimage, 因此,能够恢复大部分数据。大数据

因而可知,内存中的元数据,和fsimage有必定的差别,元数据是实时的,fsimage不是。线程

DataNode(DN)

  • 存储数据(block)
  • 启动时会向NN汇报block信息
  • 经过向NN发送心跳保持联系(3s一次),若是NN十分钟没有收到DN的心跳,则认为DN已经lost,并复制其上的block到其余的DN

Block副本放置的策略

  • 第一个副本:放置在上传文件的DN
  • 第二个副本:放置在和第一个副本不一样的机架的节点上
  • 第三个副本:放置在和第二个副本相同的机架上的节点上
  • 更多副本:随机节点

HDFS读数据流程

  • client经过DistributedFileSystem请求NN,得到block的位置信息
  • client请求FSDataInputStream,经过这个api,并发地读取DN上的各个block
  • client合并成一个完整的文件

HDFS写数据流程

  • client经过DistributedFileSystem请求NN, 建立元数据(文件名,大小,全部人),NN返回数据应该切多少个block,应该存在哪些DN
  • client经过FSDataOutputStream往其中一个DN写入数据,产生一个副本
  • 再由这个DN产生一个线程,往其余的DN上复制副本,返回成功信息
  • client再往NN发信息告诉NN, 文件上传完了。

HDFS文件权限

  • 与linux文件权限相似,rwx
    • x 对于文件忽略,对于文件夹表示是否容许访问其内容
  • 若是linux用户zhangsan,使用hadoop命令建立了一个文件,那么文件在hdfs的全部人就是zhangsan
  • 不作密码认证,告诉我你是谁我就相信你是谁。作密码认证会下降数据读写的速度,因此适合存安全性不是很高的数据

安全模式(初始化阶段)

  • NN启动时,首先将fsimage加载到内存,并执行edits的各项操做;
  • 一旦内存中成功造成元数据,将生成一个新的fsimage和一个空的edits。就是比如本身作了一遍SNN的工做。
  • 此时的hdfs对于client而言是只读的。
  • 此阶段,NN收集各个DN的报告,当数据块达到最小副本数以上时,被认为是‘安全’的。
  • 当检测到有副本数不足的数据块时,该块会被复制达到最小副本数
相关文章
相关标签/搜索