学习云计算,必然得了解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. iOS开发-automaticallyAdjustsScrollViewInsets属性

    iOS开发-automaticallyAdjustsScrollViewInsets属性 Available in iOS 7.0 and later. 简单点说就是automaticallyAdju ...

  2. ASP.net MVC中页面跳转

    @Html.ActionLink("Home Name", "Index", "Home")Home name 是 跳转链接的名Index  ...

  3. JAVA求解线性方程组-列主元高斯消去法

    package MyMath; import java.util.Scanner; public class Gauss { /** * @列主元高斯消去法 */ static double x[]; ...

  4. (Python)异常处理try...except、raise

    一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError 例子: a=10 b=0 c=a/b ...

  5. 如何解决pycharm输入中文报错问题

    在pycharm中的python文件中输入中文会报错SyntaxError: 问题解决方法在文件开头添加 : # -*- coding:utf-8 -*- 每次添加都很麻烦,一劳永逸解决此问题的方法: ...

  6. SQL Split

    最初是根据数据ID批量删除数据,因为不知道到底是要删除多少条,而T-sql里也没有像C#中params这样方便的东西,所以想到字符串分割,但是发现T-sql中也没有提供字符串分割的函数,所以自己搜索了 ...

  7. js原生实现选项卡功能

    选项卡在js中是一个重要的知识点.他没有那么难,但在工作中却有重要的位置.几乎在每一个网站都能看到选项卡的实例.所以今天写一下选项卡的实现. 我们设想有三个按钮分别来控制三个盒子当我们点击当前的按钮的 ...

  8. 计算机网路之动态NAT配置

    配置路由端口的ip地址与打开(省略) 配置路由协议 router eigrp 100 network 211.1.1.0(网络号) 0.0.0.255(通配子掩) network 192.168.1. ...

  9. java抽象语法

    1.基本概念: 0.0.抽象类的定义:抽象类是为子类提供一个规范,其目地是由子类去继承实现(类似国家提出的法律,由我们去执行). 0.1.定义抽象类用abstract来定义. 语法: public a ...

  10. nodejs之异步思想

    nodejs的精髓就是"异步",但什么是异步呢?我们来看一个例子: var start =new Date; setTimeout(function(){ var end =new ...