赞
踩
学习大数据,那就不得不提到hadoop。什么是hadoop?
百科中给出的定义是这样的:Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算 。
提出关键字我们可以知道Hadoop就是一个分布式系统的基础架构,在这里对于非科班的同学来讲(比如我)有些疑惑,分布式系统是什么?这里举个例子,目前即使计算机的配置足够高,其运算能力对于目前大厂动辄TB、PB级数据量,计算能力也会有限,而如果将几台相同的计算机串联起来,那计算能力、效率将得到显见的提升。就好比有一箱钞票需要计数有多少张,一个人查的时间一定比10个人查的时间长。这就是“分而治之”的思想,在后面我们也会看到MR也是采用了该思想。
基础架构是指Hadoop为其他应用组件提供了底部的支持,Hadoop框架最核心的设计就是HDFS(负责文件存储)和MR(负责计算)。在这里的图像仅以HDFS 1.0版本为例。HDFS负责最底层的文件存储,MR,storm是在其上搭建的计算框架,不过MR是离线计算,批处理,而storm是实时计算,流处理(不常用,吞吐量小)。而Hive则是在MR的基础上搭建的OLAP型数据库,关于Hive的知识将在以后介绍。
HDFS 本身是一个master、slave 架构(主从)。包括NameNode(nn)、DataNode(dn) 和SecondaryNameNode(snn),其中 nn 是主 ,dn 是从。nn 是一个进程,主要维护两部分数据:一部分是文件名到 block 块的映射关系;另一部分是 block 块到 dn 的映射关系。dn 则负责当前节点的数据管理,而 dn 上的 block 块则是储存数据的地方(1.0 版本默认大小64M, 2.0 版本默认大小128M)。看起来有些晦涩难懂?举个例子,一个公司有一个负责人,若干个部门,每个部门有若干个员工负责不同的工作内容,当你(client)找该公司合作,提出需求时,负责人(nn)接收到你的请求时,会找到你需求所对应的部门(dn),部门会找到对应的员工(block)满足你的需求。
这里又出现两个问题:如果某个 dn 挂掉了,数据丢失怎么办,nn 怎么知道这个 dn 挂掉没有。HDFS 是这样设计的,nn 与 dn 之间通过心跳机制进行通信,如果超过一定的时间 nn 没收到来自 dn 的信息,则认为 dn 已经挂掉。那数据丢失怎么办?HDFS 采用多副本机制(默认是三个副本),即相同的数据保存三份,防止某一个节点挂掉造成数据丢失。在保存多副本时,由上面可知先通过 nn 找到相应的 dn,然后在相应的 block 块上保存数据,那是写完三个副本返回写入成功吗?虽然这样会保证数据的一致性,但事实不是这样的,这总做法会造成很大的延迟,通常在写入第一个副本成功后就返回写入成功,剩下的两个副本则由后台自动去复制。
副本放置的策略采用机架感知策略,第一个副本放置在客户端同节点或其他随机节点(系统随机,默认避免太满太忙的节点),第二个副本放置在不同机架的节点,第三个则放置在与第二个通机架但不同节点。为什么不放在一起呢?避免鸡蛋放在同一个篮子,真放在一起了那多副本也没什么意义了。
介绍了这么多,细心地朋友可能发现还有一个组件没说,这里介绍下snn,它的名字是第二个 nn的意思,上面我们考虑了 dn 挂掉的情况,那 nn 挂掉怎么办,HDFS具有可靠性,结合 snn 名字的含义,是不是当原来的 nn 挂掉时作为新的 nn?有这个想法的朋友有一定的想法和创新力,虽然并不是这样,但这个想法与 2.0 版本基本一致。1.0 版本中的 snn 其实是 nn 的一个补充,并不是 nn 的备份和替代品!!!nn除了维护上面提到的两个文件,还包括日常的操作日志文件,例如对那些文件进行了增删改查(HDFS不建议改)。snn 周期性的合并这些fsimage文件,防止edits文件过大,导致 nn 重启时间过长,并且 snn 和 nn 也应该部署到不同的节点,避免被一锅端。
那有了 snn 后是不是就避免了 nn 挂点数据丢失的现象呢?答案是不绝对的,如果在重启时,snn 并没有将fsimage文件同步到 nn 上,依然会存在丢失的现象。2.0 版本提出了HA来解决单节点故障问题。使用两个NN 一个是 activate NN,一个是 standby NN。当activate NN 挂掉时,通过zookeeper将 standby NN 变为 activate NN,而原来的 activate NN 重启后变为 standby NN。并且通过两个 NN 共享文件系统和接受 dn 的心跳来保证数据的一致性。
对于1.0 版本和2.0 版本中资源管理和任务分配的差异将放在MR的章节再进行讨论。这里我们总结一下HDFS:
1)可靠性:由心跳 dn-nn 、数据完整性 crc32、副本-数据冗余、空间回收机制 -skipTrash、SNN/HA;
2)不适合的场景:储存大量小文件(浪费磁盘空间,太多的元数据也会给NN造成压力)、文件被修改(HDFS设计之初就不支持修改文件,在逻辑上与MR保持一致——将结果输出为新文件并不是在输入数据上更改,同时如果修改文件则需要重新让NN分配DN,以及找到之前的DN删除,效率低)。
关于Hadoop就讲这么多,下次分享一下MR的知识,觉得有用的朋友不妨点一下关注收藏,下次不迷路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。