首页 > 代码库 > 换个角度理解云计算之HDFS

换个角度理解云计算之HDFS

  学习云计算,必然得了解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