学习云计算,必然得了解Hadoop,而Hadoop中的HDFS(分布式文件系统)是一个基础,接下来就写一下我所理解的HDFS。

  有一个很有特别的村庄,村庄里面有一个很牛逼的人,叫做“大哥”,村民们都信得过他,于是会把自己家的粮食、农具等等各种各样的东西“打包成一个大的包裹”让“大哥”给存着,等用的时候,再去找大哥要。我们可以姑且简单的认为:“大哥”就是服务器Server,村民们是客户端Client,而村民打包的一个大的包裹就是一个很大的文件

  一开始大家相安无事,后来别的村的人(更多的Client)觉得在自己家里放那么多东西,太占地方,于是都找“大哥”,要把东西放他这儿。“大哥”人也算好,来者不拒,可是自己家里就那么多点儿地方,放不下了怎么办?

  于是“大哥”想到一个办法,扩大自己家的地方(服务器扩大硬盘容量),这样就很好的解决了问题。

  可是“大哥”的名气越来越多,往他这儿存东西的人越来越多,无休止的的扩大自己家的地方,也不是一个办法啊。“大哥”开始拼命读书,请教各路朋友支招,最终一个叫做“攻城狮”朋友一下点中要害:“大哥,你现在遇到的问题叫做大数据,有人也称为海量数据,有人也称为bigdata”。“兄台高见,可有破解之道?” “光靠扩充自己的家地方也不是办法,还得想到一个万全之策”。他们经过日夜思考,终于想到一个绝妙的办法,且听我慢慢道来。

  大哥雇佣了其他一些人,我们姑且叫他们“小弟们”,他们是“主从的关系”。小弟们家里会有些地方,这样村民们往大哥这儿存东西的话,大哥并不用自己家的地方,而是放在别的小弟那儿,随着村民们存的东西越来越多,大哥只需要多雇佣点儿小弟就行了。

  上面就是“大哥”和“攻城狮”想到的一个万全之策,他们称之为HDFS,而大哥为了小弟们称呼方便,给自己起了一个花名,叫做“NameNode”,也给小弟们每个人起了个花名:DataNode1、DataNode2、DataNode3、……。对于村民(客户端)来说,我需要存东西到你那儿,直接给你就行了,不用考虑太多,可是大哥心酸,又怎可知。我们看看大哥是如何很好的运作HDFS的。

  假设有个村民要存一个大包裹给大哥,这个大包裹有多大呢,称了称,大概是“6GB”。接下来是大哥面对这“6GB”的东西,思考的一些问题和解决的方法。

1.这么大东西怎么存呢?

  他把这么一个大的东西,切分成了64MB大小的块(Block),给小弟们(DataNode)分出去,而大哥(DataNode)脑子(内存)里面记下各个块都分给了哪个小弟。这样人家村民来取东西的时候,大哥“NameNode”会告诉村民各个块(Block)在哪个小弟手里,然后直接找小弟要就行了。

2.光记在脑子里不行,要是忘了怎么办?

      村民的各种行为(创建、修改、删除)等操作时,大哥不能仅仅记在脑子里,还准备了两个本子(文件),一个叫做EditLog,一个叫做FSImage。无论村民新存东西、修改自己存的东西、删除自己存的东西,大哥“NameNode”都会在EditLog记下一笔。

  万一EditLog或FSImage丢了怎么办?于是他找了个管家,叫做“SecondaryNameNode”,帮他也存着这两个文件,切记,虽然也有NameNode称号,但他仅仅是“管家”,不是“大哥”,要是大哥死了,管家也担当不了大哥的位置。

3.存数据块的小弟“挂了”怎么办呢?

(1)怎么知道小弟“挂了”呢?

  为了保证小弟们好好干活,小弟(DataNode)需要周期性的向大哥(NameNode)汇报情况,称为“心跳信号heartbeat”,如果周期性的收到信号,表示小弟没事;如果没有收到呢,则说明小弟异常了。  

(2)大哥的应对策略是什么呢?

  大哥把大文件分成一个个64MB的小块给了小弟,万一哪个小弟挂了,这个数据块不就丢失了,村民还不得堵我家门。因此大哥把某一个块给其中一个小弟前,会先复制出两份,叫做“副本”,给其他小弟也存着,这种冗余存储,保证了数据的安全性。

(3)副本给哪些小弟呢?

一个数据块默认的3个副本,不是随便给哪个小弟的,一般给符合下面要求的小弟:

  1)第一个副本给任意一个小弟(DataNode)。

  2)第二个副本给第一个小弟的邻居。(同一个机架上

  3)第三个副本给其他小弟,离前面两个都远点儿。(不同机架的DataNode

  备注:同一个机架下的两个服务器带宽比不同机架间两台带宽要大。

(4)副本怎么给小弟

  副本的复制是采用的流水线式复制方法。具体来说:客户端存数据的时候,先把数据写到本地磁盘临时文件中,等写够64MB了,NameNode才会告诉客户端一个DataNode地址,让客户端往里面写数据,第一个DataNode一小部分一小部分的接收数据,然后把接到的数据复制给第二个DataNode,然后第二个DataNode复制给第三个,以这种流水线式的进行副本的复制。

(5)万一有一个小弟挂了怎么办?

  天有不测风云人有旦夕祸福,如果其中一个小弟真挂了,那么现在副本数变成了两个,大哥会再创建一个副本给其他小弟存着,保证副本的数量不少于3个,一切安全第一。

 

尼玛,终于搞定了海量数据存储的问题,大哥雇佣了这么多小弟,不能只存储数据吧,怎么着也得再干点儿别的吧,于是他们又想着去帮助村民去完成他们的一些计算等任务,这个时候,大哥又有了个名字,叫做“JobTracker”,而小弟们又有了个新的名字,叫做“TaskTracker”,又组成了一个新的团队,叫做:MapReduce。

(完)

文档信息

换个角度理解云计算之HDFS的更多相关文章

  1. 换个角度理解云计算之MapReduce

    上一篇简单讲了一下HDFS,简单来说就是一个叫做“NameNode”的大哥,带着一群叫做“DataNode”的小弟,完成了一坨坨数据的存储,其中大哥负责保存数据的目录,小弟们负责数据的真正存储,而大哥 ...

  2. 换个角度理解云计算之MapReduce(二)

    接上篇 3.Combiner操作 前面讲完Map操作,总结一下就是:一个大文件,分成split1~5,对应于Map1~5,每一个Map处理一个split,每一个split的每一行,会用每一个Map的m ...

  3. 深入理解Hadoop之HDFS架构

    Hadoop分布式文件系统(HDFS)是一种分布式文件系统.它与现有的分布式文件系统有许多相似之处.但是,与其他分布式文件系统的差异是值得我们注意的: HDFS具有高度容错能力,旨在部署在低成本硬件上 ...

  4. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...

  5. 深入理解hadoop之HDFS

    深入理解hadoop之HDFS 刚刚才写完关于mapreduce的一篇博文,趁热打铁接下来聊聊HDFS.本博文参考资料为HADOOP权威指南第3版完版,博文如有错漏之处,敬请指正. HDFS即Hado ...

  6. 理解云计算的(IaaS PaaS SaaS)

    本文不经允许,不得转载! 云计算技术已经慢慢普及了.我们做技术的有必要学习云计算技术. IaaS:Infrastructure-as-a-Service(基础设施即服务)云计算到来之前,很多企业都是自 ...

  7. 理解云计算三种服务模式——IaaS、PaaS和SaaS

    云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为三个大类: SaaS(Software as a Service–软件即服务) PaaS(Platform as a Ser ...

  8. 【俗话说】换个角度理解TCP的三次握手和四次挥手

    PS:通俗一点的解释都会在引用块中 Nothing is true, Everything is permitted. 0. 什么是TCP TCP,全称Transmission Control Pro ...

  9. 运用Hadoop能否搭建完整的云计算平台?

    Apache Hadoop 是一个用java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,它可以让应用程序支持上千个节点和PB级别的数据. Hadoop并不完全代表云计算,所 ...

随机推荐

  1. sublime配置coffeeScript

    node.js 全局模块所在目录  npm -g ls 1.安装 npm install -g coffee-script 2.sublime安装CoffeeScript sublime语法高亮插件 ...

  2. 父窗口,子窗口之间的JS"通信"方法

    今天需要在iframe内做一个弹窗,但使用弹窗组件的为子窗口,所以弹窗只在子窗口中显示掩膜层和定位,这样不符合需求. 后来晓勇哥指点,了解到一个以前一直没关注到的东西,每个窗口的全局变量,其实都存在对 ...

  3. PHP使用内置函数生成图片的方法详解

    原文地址:http://www.poluoluo.com/jzxy/201605/475301.html 本文实例讲述了PHP使用内置函数生成图片的方法.分享给大家供大家参考,具体如下: 第一步:创建 ...

  4. AngularJS的小知识点

    小知识点:$scope和$rootScope (1)每次使用ngController指令,都会调用控制器的创建函数,创建出一个控制器对象. (2)每次创建一个控制器对象,AngularJS都会创建一个 ...

  5. 【洛谷P2866】Bad Hair Day

    单调栈版子 #include<cstdio> #include<cstring> using namespace std; ; ,zh[N]; int read(){ ; ch ...

  6. Android广播大全

    1.String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式. 2.String ALL_APPS_ACTION 动作:列举所有可用的应用.输入:无. 3.String A ...

  7. python基础整理笔记(八)

    一. python反射的方式来调用方法属性 反射主要指的就是hasattr.getattr.setattr.delattr这四个函数,作用分别是检查是否含有某成员.获取成员.设置成员.删除成员. 此外 ...

  8. mybatis按时间条件搜索

    dto接受前台字符串时间格式 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date contractStartDt; @Date ...

  9. CAS 4.0.0RC编译环境

    CAS 4.0.0RC编译环境 Eclipse Java EE IDE for Web Developers. JDK1.7,注意用JDK1.8是会出现编译错误的. Maven 在编译出现test错误 ...

  10. 关于javascript对象的简单记忆法

    关于javascript对象方法的简单记忆法(个人整理) string对象: 大号小号闪烁加链接./big/small/blink/link/ 粗体斜体打字删除线./bold/italics/fixe ...