2003-2004年,Google公开了部分GFS(分布式文件系统)和Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年业余时间实现了DFS和Mapreduce机制,一个微缩版:Nutch
Hadoop 于 2005 年秋天作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。2006 年 3 月份,Map-Reduce 和 Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目。
什么是hadoop?
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。hadoop使得用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
hadoop为什么可以处理海量数据?
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
hadoop的主要模块是哪些?
Hadoop Common(公共子模块): 公共的部件,用来支持hadoop的其他模块。
Hadoop Distributed File System (HDFS):hadoop分布式文件系统,提供了 高可靠性、高扩展性和高吞吐率的数据存储服务。
Hadoop YARN: 负责集群资源的管理和调度。
Hadoop MapReduce: 分布式计算框架(计算向数据移动)具有易于编程、高容错性和高扩展性等优点。
hadoop的存储模型是怎样的?
hadoop的存储模型是字节。
文件被线性切割成块,即Block。Block分散存储在集群的节点中。单一文件Block大小一致。Block可以设置副本数,副本分散存储在不同的节点中。在向HDFS上传文件时,可以设置Block的大小和副本的数量。已经上传的文件Block副本数可以调整,大小不变。HDFS只支持一次写入,但可以多次读取。且同一时刻只能有一个写入者。虽然不能修改数据,但是可以使用append追加数据。
hadoop的存储架构中,主要分为两种节点。第一种是NameNode(NN),第二种是DataNode(DN)。
在hadoop中,一个文件的数据被分为MetaData和数据本身。MetaData主要用来存储数据的位置,名称,大小目录等信息。MetaData被存储在NameNode中,而文件数据本身被存储在DataNode中。NameNode知道一个文件具体存放在哪几个DataNode中。
DataNode与NameNode保持心跳,并提交Block列表。这样NameNode就知道应该去哪些节点上读取数据本身的信息。
HDFS的客户端与NameNode交互元数据信息,然后
HDFS的客户端与DataNode交互文件Block数据。一个大致的架构图就像下面这样:
在这个图中,可能你已经发现了一个叫做SecondaryNameNode的节点,关于这个节点我们稍后再做解释。
到底什么是NameNode?
正如上面已经讲到的一样,NameNode主要用来接受客户端的读写服务并收集DataNode汇报的Block列表信息。NameNode的MetaData中主要存在着下面这些数据:
- 文件owership和permissions
- 文件大小,时间
- (Block列表:Block偏移量),位置信息
- Block每个副本位置(由DataNode上报)
NameNode是基于内存存储的。NameNode的持久化是通过两个文件来完成的。分别为fsimage和edits。MetaData存储到磁盘文件名为”fsimage”的文件中,注意fsimage文件中不保存Block块的位置信息。位置信息是通过DataNode上报的。而edits记录了每一次对MetaData的操作日志。这样一来,我们就可以通过fsimage文件和edits文件来恢复HDFS最新的状态信息。
到底什么是DataNode?
DataNode是Block真正存储的地方。DataNode的本地磁盘以文件形式存储着Block信息。同时还存储着Block的元数据信息文件。
HDFS在启动时,DataNode会向NameNode汇报block的信息。
DataNode通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode 10分钟没有收到DataNode的心跳,则认为其已经lost,并复制其上的block到其它DataNode。
HDFS的优点是什么?
通过上面的介绍,我们可以得出HDFS的优点:
- 高容错性
- 数据自动保存多个副本
- 副本丢失后,自动恢复
- 适合批处理
- 移动计算而非数据
- 数据位置暴露给计算框架(Block偏移量),适合大数据处理GB 、TB 、甚至PB 级数据
- 适合百万规模以上的文件数量
- 能够部署10K+节点
- 可构建在廉价机器上
- 通过多副本提高可靠性
- 提供了容错和恢复 机制
HDFS的缺点是什么?
- 不适合低延迟数据访问,比如毫秒级
- 不适合小文件存取,会占用NameNode 大量内存
- 寻道时间超过读取时间
- 不支持并发写入和文件随机修改
- 仅支持append,即只能向文件末尾追加数据
SecondaryNameNode是什么?
初看名字,你可能会以为SecondaryNameNode是NameNode的备份,实际上,SecondaryNameNode的主要作用并不是这个,当然它也可以用来做备份。
要了解SecondaryNameNode的作用,就不得不说一下HDFS的启动过程。
上面我们已经提到了两个文件fsimage和edits。fsimage是当前HDFS系统的快照。edits记录了对HDFS的各种操作日志。
HDFS在启动的时候,根据fsimage和edits日志可以得到系统当前最新的状态,并产生一个新的fsimage文件。这样的启动时很耗时间的。尤其是当edits文件非常大的时候,合并会占用很多额外的时间。SecondaryNameNode就是为了解决这个问题而设立的。SecondaryNameNode会定时的合并NameNode的edit logs到fsimage文件中,产生一个新的fsimage文件,然后拷贝给NameNode。这样HDFS在启动的时候,就不用每次都合并大量的edits操作到fsimage中,大大的加快了启动速度。
HDFS写流程具体是怎样的?
- 客户端请求NameNode
- NameNode返回是否可以上传
- 客户端将文件切分成块,请求NameNode第一个Block应该存储到哪些DataNode上。
- NameNode返回给客户端可以上传的文件的DataNode的服务器
- 客户端请求其中一台DataNode服务器,然后这台DataNode将调用第二台DataNode,第二台DataNode将调用第三台DataNode,直到最后一台DataNode,这样就建立了一个RPC调用的pipeline。
- 客户端开始以packet的方式上传第一个Block给第一个DataNode,第一个DataNode再给第二个DataNode,以此类推,直到所有的DataNode都上传成功。
- 第一个Block上传完成后,DataNode向NameNode汇报Block信息,并向客户端汇报完成,客户端向NameNode汇报完成。
- 按照1-7的顺序以此上传第二个Block,第三个Block……。直到所有的Block上传成功。
HDFS的读流程具体是怎样的?
- 客户端发送文件路径个NameNode。
- NameNode返回给客户端文件具体存储在哪些DataNode中。
- 客户端请求其中一台DataNode读取数据
- DataNode返回数据给客户端
- 客户端通过这中方式以此获取Block块,并在本地合并成一个完整的文件。
什么是Hadoop的安全模式?
NameNode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻NameNode运行在安全模式。即NameNode的文件系统对于客户端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)。
在此阶段NameNode收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由NameNode维护的,而是以块列表形式存储在DataNode中。