1. HDFS是Hadoop集群的文件系统,这是一种分布(distributed)、容错(fault tolerant)的文件系统
  2. 所谓分布,是说整个文件系统的内容并非集中存储在一台或几台“文件服务器上”,而是分散在集群的不同节点上
  3. 对于大数据文件系统,文件之所以应该是分布式的,不再仅仅是容量和容错的问题,还有计算的问题。
  4. 大数据处理有个原则,就是数据在哪里,计算就在哪里。
  5. 分布的计算必然要求分布的数据存储,最好就是每个机诶但都存储数据,每个节点也都承担计算。
  6. 按什么方式把整个文件系统的内容分布存储在集群中呢
    1. 远程挂在(mount):这只是目录(文件子系统)层面的分布
    2. 粒度更细化一点,改成文件层面的分布:也就是说不是以目录为单位,而是以文件为单位的分布,并建立重要文件查名服务器
    3. 粒度更细化,改成文件块层面的分布:在存储的时候把文件拆散,HDFS的分布,是“块”这个层次的分布.
  7. HDFS文件块是虚拟的,默认64MB,128MB也是很常用的
  8. 集中的目录和查明服务,则不是告诉你这些文件在哪里,而是告诉你具体的块在哪里,然后你自己去访问
  9. HDFS的查明服务都集中在一个节点上,成为nameNode;担负文件内容存储的节点则成为DataNode。
  10. 在DataNode上,不管是1MB、64MB、一个(HDFS的)块对于宿主主机而言就是一个文件,其块号就编码在文件名中。从一个DataNode中读出一个块,实际上是读出一个文件。而在NameNode中,则存储的是HDFS“文件系统”,实际上存储整个目录树,或称“namespace”的映像。可想而知,这个映像也是作为宿主系统的文件而存储的。
  11. 解决了怎么分布的问题,随之而来的是容错的问题。HDFS采用了“狡兔三窟”的策略,每个块都是一式几份。响应地,查明服务要提供的就不只是一个块在什么地方,而是这个块的几个副本分别在什么地方。这样,你就可以自己决定从哪个节点上读取这个块的副本,万一失败就换一个节点再去读取另一个副本。
  12. 为NameNode提供热备的节点,则称为“Standby NameNode“。ActiveNN和StandbyNN之间的有同步才能保持一致。然而如果每一次有一点改变时就得同步一次,系统的开销太大,所以HDFS采用一个变通的方法。(类似Oracle的archive log、ADG)
  13. 这个EditLog可以(但不是必须)既不是在NameNode节点上,也不是在Secondary NameNode节点上,而是在某个双方都能访问的第三方那里,而且一般要求这第三方具有更高的可靠性。比方说,如果集群中机器是普通的PC机,则EditLog就应该放在具有更可高、质量更好的服务器上。这样如果ActiveNN出了问题,StandbyNN出来接管,这是它手头的文件系统映像很可能是老的,已经远远落后于形势。而手头有着文件系统最新映像的原NameNode,则此时已经访问不到了。这时原StandbyNN就把EditLog中记录逐条”重演“一遍。
  14. 可想而知,这种同步也不一定非要到NameNode出问题时候才做,StandbyNN完全可以没过一段时间就做一下。
  15. EditLog信息的接收者可以不止一家。
  16. 在Hadoop中,NameNode表现为一个独立的JVM进程。同样,SNN、DataNode也是这样的JVM。
  17. NameNode    
    1. JvmPauseMonitor,看起其类名可知是用来监视JVM运行是否停滞。其实原理挺简单,这是一个线程,这个线程基本上老是睡眠,只是周期性的醒来一下,一醒来就从系统获取当时的实际时间,开刚才实际睡眠时间是否比自己指定要睡眠的时间长出很多,如果是,就说明本线程被调度运行的机会大大减少,系统已经太忙,因而就在运行日志中发出一条警告信息。
    2. Format:就只是HDFS文件系统的格式化,实际上就是其目录系统的格式化,那就是在宿主文件系统中创建一套目录,用来存放HDFS的元数据文件。而且,一旦完成格式化,程序就terminate(),这个命令的意图其实并非启动NameNode,而仅仅是格式化。当然在完成格式化之前,NameNode是无法正常运行的。
    3. 为什么格式化要和NameNode放在一起呢,这是因为HDFS的格式化只需在NameNode上进行,也只应在NameNode上进行。
    4. NameNode实际上并不需要知道具体的块在哪个数据节点的什么位置上,而只要知道哪些节点存储着哪些块,以及节点上还有多少容量可供使用。进一步,什么块在什么节点上这个信息其实不必固定记载在NameNode的文件系统映像中,而是可以在运行的时候让数据节点自行报告。在集群环境中,NameNode对于数据节点的控制不想单机对于磁盘那样严密,加之每个块都有多个副本保存在不同节点上,这样比把这些信息固定记载在NameNode上更合适,因为保不住哪个节点突然就离线了,过一会又回来了,甚至保不住哪个节点上的磁盘被拆装到了另一个节点上。
    5. NameNode的作用,简单地说:是给定一个文件路名名,就告诉你这个文件有哪些块,以及每个块都有几个副本、分别存储在什么节点上。
    6. 这里有两个环节。1、从一个文件的路径名到它的块表;2、再从具体块号到其副本所在的数据节点。这两个环节性质是有区别的。
    7. 其中的第一个环节,说明每个具体的文件名包含了哪些块,即从文件名到块表的映射,就是HDFS的目录系统,也跟单机的目录系统相似,是必须持久存储的,要不然断电之后就什么也没有了。集群中只有NameNode才有这方面的信息,DataNode根本就不知道还有HDFS这一层目录和文件。
    8. 但是第二个环节,即从块号到存储地点的映射,就不一定了。当然也可以把这个映射持久存储在NameNode上,但是这样也是有问题的,因为NameNode对于数据节点其实没有很强的控制,比如说,可能NameNode记载表明某个数据节点上有某个块号的一个副本,但是那个副本实际上却因为某种原因而不存在了,例如因本地的某种不当操作被删掉了,于是两边就不一致了。在比方说,NameNode可能记载着某个副本所在节点的节点名和IP地址,但实际使用中个别节点的名称和IP地址却可能变了。所以把第二层映射持久存储下来可能是靠不住的。那么怎么办呢?HDFS采用的办法就是干脆就不持久存储,而让各数据节点定期向NameNode报告:我这里有你的这么一些块,你可以让大家需要的时候上我这来读取;而NameNode则在运行时动态汇集和维持第二层映射所需的信息。集群中数据节点定时向NameNode发送心跳(Heartbeat)报告,上面就打搭载着这样的信息。
    9. 所以,NameNode至少要经历一轮Heartbeat之后才能真正完成其初始化。

Hadoop源代码点滴-文件系统HDFS的更多相关文章

  1. Hadoop源代码点滴-系统结构(HDFS+YARN)

    Hadoop建立起HDFS和YARN两个字系统,前者是文件系统,管数据存储:后者是计算框架,管数据处理. 如果只有HDFS而没有YARN,那么Hadoop集群可以被用作容错哦的文件服务器,别的就没有什 ...

  2. Hadoop源代码分析:HDFS读取和写入数据流控制(DataTransferThrottler类别)

    DataTransferThrottler类别Datanode读取和写入数据时控制传输数据速率.这个类是线程安全的,它可以由多个线程共享. 用途是构建DataTransferThrottler对象,并 ...

  3. Hadoop源代码点滴-基础概念

    大数据特征:volume(数量).variety(多样性).velocity(产生的速度) 大数据特征:多.乱.快.杂 数据的来源:业务数据.日志.管理文档(OCR).互联网.物联网.外购

  4. Hadoop源代码点滴-自然常数e

    数学里的 e 为什么叫做自然底数?是不是自然界里什么东西恰好是 e? https://www.zhihu.com/question/20296247

  5. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  6. Hadoop 分布式文件系统 - HDFS

    当数据集超过一个单独的物理计算机的存储能力时,便有必要将它分不到多个独立的计算机上.管理着跨计算机网络存储的文件系统称为分布式文件系统.Hadoop 的分布式文件系统称为 HDFS,它 是为 以流式数 ...

  7. Hadoop分布式文件系统HDFS详解

    Hadoop分布式文件系统即Hadoop Distributed FileSystem.        当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并 ...

  8. Hadoop分布式文件系统--HDFS结构分析

    转自:http://blog.csdn.net/androidlushangderen/article/details/47377543 HDFS系列:http://blog.csdn.net/And ...

  9. 【转载】Hadoop分布式文件系统HDFS的工作原理详述

    转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文 ...

随机推荐

  1. [Python] 用python做一个游戏辅助脚本,完整思路

    一.说明 简述:本文将以4399小游戏<宠物连连看经典版2>作为测试案例,通过识别小图标,模拟鼠标点击,快速完成配对.对于有兴趣学习游戏脚本的同学有一定的帮助. 运行环境:Win10/Py ...

  2. Win10下安装python3.x+pycharm+autopep8

    一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/   下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...

  3. Super和This总结

    this: this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. Java关键字this只能用于方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自 ...

  4. ImportError: cannot import name '_obtain_input_shape' from 'keras.applications.imagenet_utils'

    报错 Using TensorFlow backend. Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpac ...

  5. [python]文档字符串

    文档字符串可以在运行时访问,也可以用来自动生成文档. 输入: def foo(): print "This is a doc string" return True foo() 运 ...

  6. SDU暑期集训排位(3)

    B. Mysterious LCM 做法 保留 \(a_i|x\) 的元素,其它元素解体. \(a_i\) 的某个质因子的指数,要和 \(x\) 的这个质因子一样多,才有贡献,否则这个质因子它在划水啊 ...

  7. 数据库常用SQL语句(二):多表连接查询

    前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ...

  8. MongoDB入门及 c# .netcore客户端MongoDB.Driver使用

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  9. 反射,Expression Tree,IL Emit 属性操作对比

    .net的反射(Reflection) 是.Net中获取运行时类型信息的一种方法,通过反射编码的方式可以获得 程序集,模块,类型,元数据等信息. 反射的优点在于微软提供的API调用简单,使用方便: 表 ...

  10. Spotlight on Oracle注册码破解(亲测可用)

    了解到该工具监控十分强大,该工具优点: 我就是为了监控一个Oracle数据库,查阅各种资料,真是费了十牛二虎之力,才破解完成.#_# 在客户端安装好了,连接监控的服务器,提示得要注册码,这外国的软件基 ...