Hadoop2学习路程,Hadoop面试复习系列

– 如果一个文件是128MB,根据默认配置它将占用384MB的系统空间存储。

NameNode通过从DataNode定期接收数据块上报去维护复制因子,当一个数据块过多复制或者复制不足,则NameNode负责根据需要增加或删除副本。

  1. 缺点

HDFS的特点
优点:
  1. 高可靠性:Hadoop按位存储和处理数据的能力值得人们信赖;
  2.
高扩展性:Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
  3. 高效性: 
  Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
  4.
高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
缺点:
  1. 不适合低延迟数据访问。
永利皇宫登录网址 ,  2. 无法高效存储大量小文件。
  3. 不支持多用户写入及任意修改文件。

  • 特别的–当出现写入某个DataNode失败时,HDFS会作出以下反应:首先管道会被关闭,任何在
    确认队列
    中的文件包都会被添加到数据队列的前端,以确保故障节点下游的datanode不会漏掉任何一个数据包。

    为存储在另一个正常的datanode的当前数据块指定一个新的标识,并将标识传送给nameNode,当dataNode
    在恢复后,会发现其原来的标识是过时的,于是就可以删除存储的不完整的那部分数据块。

    从管线中删除故障datanode,基于两个正常的datanode构建新的管线。余下的数据库写入管线中正常的datanode。

    namenode在注意到副本不足时,会在另一个节点上创建一个新的副本。后续的数据块继续正常的接受处理。

    如果有多个节点的写入失败了,如果满足了最小备份数的设置(dfs.namenode.repliction.min),写入也将会成功

  • 写入一致性新建一个文件后,它能够在文件系统命名空间中立即可见写入文件的内容不保证立即可见(即逝数据流已经调用flush当前正在写入的块对其他reader不可见。通过hflush()方法后,数据被写入datanode的内存中。可保证对所有reader可见通过hsync()方法后,数据被写入到磁盘上。如果没有调用hflush或者hsync()方法。客户端在故障的情况下就会存在数据块丢失

HDFS的介绍

转载自:

I. 硬件故障(自动快速检测应对硬件错误)
  硬件故障已经不再是异常了,它变成了一个常规现象。HDFS实例由成千上万的服务机器组成,这些机器中的任何一个都存储着文件系统的部分数据。这里元件的数量是庞大的,而且极可能导致硬件故障。这就意味着总是有一些组件不工作。所以,核心结构的目标是快速的自动的进行错误检测和恢复。
II. 流数据访问(流式访问数据)
  HDFS 应用需要依赖流去访问它的数据集。Hadoop
HDFS的设计方向主要面向于批处理而不是用户交互。着力点在于重视数据访问的高吞吐率而不是数据访问的低延迟性。它注重于如何在分析日志的同时尽肯能快速的获得数据。
III. 巨大的数据集
  HDFS通常需要工作在大数据集上。标准的实践中是,HDFS系统中存在的文件大小范围是GB到TB。HDFS架构的设计就是如果最好的存储和获得大量的数据。HDFS也提供高聚合数据的带宽。它同样应该具备在单一集群中可以扩展上百个节点的能力。与此同时,它也应该具备在一个单元实例中处理处理数千万个文件的能力。
IV. 简单的一致性模型(简单一致性模型)
  它工作在一次性写入多次的读取的理论上。一旦数据被创建、写入和关闭,该文件是不能被修改的。这种方式解决数据一致性的问题同时也实现了高吞吐量访问数据的需求。基于MapReduce的应用和或者网络爬虫的应用在这种模型中拥有很高的适应性。和每一apache笔记一样,未来计划增加追加写入文件这一功能。
V. 转移计算量比转移数据更合理(移动计算比移动数据本身更划算)
  如果一个应用在它操作的数据附近进行计算,总会比在离它远的地方做计算更高效。这个现象在处理大的数据集时,往往提现的更明显。这样做主要的优势体现在增加系统的总吞吐量上。它同时也最小化了网路阻塞。其理念是,将计算移动到离数据更近的位置,来代替将数据转移到离计算更近的位置。
VI. 便捷的访问有不同软件和硬件组成的平台(异构平台可移植)
  HDFS
被设计成便捷的在平台之间切换。这让HDFS系统能够因为其适应性而广泛传播。这是在处理大数据集数据的最好的平台。

  • 使用HDFS提供的客户端Client, 通过 DistributedFileSystem
    向远程的Namenode发起RPC请求;

  • Namenode会视情况返回文件的部分或者全部block列表, 对于每个block,
    Namenode都会返回有该block副本的DataNode地址;

  • 客户端Client会选取离客户端最近的DataNode来读取block;
    如果客户端本身就是DataNode, 那么将从本地直接获取数据;

  • 读取完当前block的数据后, 关闭当前的DataNode链接,
    并为读取下一个block寻找最佳的DataNode;

  • 当读完列表block后, 且文件读取还没有结束,
    客户端会继续向Namenode获取下一批的block列表;

  • 以上这些步骤对于客户端来说都是透明的。客户端只需通过
    DistributedFileSystem 返回的 FSDataInputStream 读取数据即可

  • 特别的–如果客户端和所连接的DataNode在读取时出现故障,那么它就会去尝试连接存储这个块的下一个最近的DataNode,同时它会记录这个节点的故障,以免后面再次连接该节点。客户端还会验证从DataNode传送过来的数据校验和。如果发现一个损坏块,那么客户端将再尝试从别的DataNode读取数据块,并且会告诉NameNode
    这个信息,NameNode也会更新保存的文件信息,进行数据修复。

  • 写数据流程

    永利皇宫登录网址 1hdfs写流程.jpg

  • 客户端调用create来新建文件。

  • DistributedFileSystem 通过RPC调用在 NameNode
    的文件系统命名空间中创建一个后缀是.copy新文件,此时还没有相关的DataNode与之相关。

  • NameNode
    会通过多种验证保证新的文件不存在文件系统中,并且确保请求客户端拥有创建文件的权限。当所有验证通过时,NameNode
    会创建一个新文件的记录,如果创建失败,则抛出一个IOException异常;如果成功
    namenode 能够掌握集群DataNode整体状况,并将第一批 block
    块分配数据块后,连同 DataNode 列表信息返回给客户端;

  • 当客户端写入数据时,DFSOutputStream
    会将文件分割成数据包,然后放入一个内部队列,我们称为“数据队列(data
    queue)”。DataStreamer会将这些小的文件包放入数据流中,DataStreamer的作用是请求NameNode为新的文件包分配合适的DataNode存放副本。返回的DataNode列表形成一个“管道”,假设这里的副本数是3,那么这个管道中就会有3个DataNode。DataStreamer将文件包以流的方式传送给队列中的第一个DataNode。第一个DataNode会存储这个包,然后将它推送到第二个DataNode中,随后照这样进行,直到管道中的最后一个DataNode,这种
    pipeline 的方式加快了写入过程,并隐藏了副本数对客户端的影响,即
    对客户端来说,副本数是透明的。副本的放置遵循 Block的副本放置策略

  • DFSOutputStream同时也会保存一个包的内部队列,用来等待管道中的DataNode返回确认信息,这个队列被称为确认队列(ask
    queue)。只有当所有的管道中的DataNode都返回了写入成功的信息文件包,才会从确认队列中删除。

  • 客户端完成数据写入后,对数据流调用close方法。该操作将剩余的所有数据写入dataNode管线,当DataNode
    向 NameNode 心跳汇报的时候,新写入的 block 信息被更新到
    NameNode.第一批block 块的写入完成

  • 重复以上过程,客户端继续第二批 block
    块的写入,直至最后一批写入完成结束!

安全模式下,集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问,因为文件的组成Block信息此时NameNode还不一定已经知道了。所以只有NameNode已了解了Block信息的文件才能读到。而安全模式下任何对HDFS有更新的操作都会失败。

对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。
安全模式相关命令

  • 查询当前是否安全模式 hadoop dfsadmin -safemode get Safe mode is ON
  • 等待safemode关闭,以便后续操作 hadoop dfsadmin -safemode wait
  • 退出安全模式 hadoop dfsadmin -safemode leave
  • 设置启用safemode hadoop dfsadmin -safemode enter

(注: 文档有参考 —-> ) 

  1. 优点

NameNode启动的时候首先将fsimage(镜像)载入内存,并执行(replay)编辑日志edits的的各项操作

一旦在内存中建立文件系统元数据映射,则创建一个新的fsimage文件(这个过程不需SecondaryNameNode) 和一个空的edits

  • 读数据流程
  1. 自动快速检测应对硬件错误
  2. 流式访问数据
  3. 移动计算比移动数据本身更划算
  4. 简单一致性模型
  5. 异构平台可移植
    {
    对于设计目标的详细解释:
  • 2.1 不适合低延迟的数据访问
    • HDFS设计更多的是批处理,而不是用户交互使用。重点在于数据访问的高吞吐量,而不是数据访问的低延迟。
  • 2.2 不适合小文件存取
    • 占用NameNode大量内存;
    • 寻道时间超过读取时间。
  • 2.3 无法并发写入、文件随即修改
    • 一个文件只能有一个写者;
    • 仅支持追加和截断。

NO.2 NameNode 启动过程
永利皇宫登录网址 2

本文主要是记录了个人在复习过程看到的一些知识点,可能有点东拼西凑的感觉,但是作为复习来看看还是不错的。当然关于
HDFS
肯定不止这么一点东西,不过作为开发,运维相关的其实很少用到,不过还是有一些需要补充的,比如:高可用,HDFS
shell相关。。。诶,其实前面有几篇文章说后续会补上,但是因为各种原因,还在那里欠着,还好没人计较,也就是自己在自娱自乐。。。哈哈

什么是Hadoop HDFS?

永利皇宫登录网址 3hdfs读数据流程.jpg

}

NameNode的任务:
· 管理文件系统命名空间
· 规定客户端访问文件规则
· 对文件执行命名,关闭,打开文件或打开路径等 操作
· 所有的数据节点发送心跳给NameNode,
NameNode需要确保DataNode是否在线。一个数据块报告包含所有这个数据点上的所有block的情况。
· NameNode也负责管理复制因子的数量。
文件呈现在NameNode的元数据表示和管理:

  1. DataNode管理附加到它们运行的节点的存储,并允许用户数据存储在文件中;在内部,文件被分割成一个或多个块,并且这些块被存储在一组DataNode中;负责提供来自文件系统客户端的读取和写入请求;执行块创建,删除;

    启动DN进程的时候会向NN汇报Block信息;通过向NN发送心跳保持与其联系,如果NN10分钟没有收到DN的心跳,则认为DN已经丢失,并且复制其上的Block到其他的DN上。

网站地图xml地图