Hadoop技术研究

HDFS原理

1.概述
OLTP( On-Line Transaction Processing)联机事务处理过程
OLAP( Online Analytical Processing) 联机分析处理先要对这两个概念做区分,才能理解hadoop适合的场景。数据分析,数据处理领域,而不是事物处理。

Hadoop
不是指具体一个框架或者组件,它是Apache软件基金会下用Java语言开发的一个开源分布式计算平台。实现在大量计算机组成的集群中对海量数据进行分布式计算。
Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案,虽然Google没有公布这三个产品(还有BigTable)的源码,但是他发布了这三个产品的详细设计论文。
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE机制,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache*项目(同年,cloudera公司成立),迎来了它的快速发展期。
狭义上来说,hadoop就是单独指代hadoop这个软件,广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件。
hadoop和HDFShadoop分为HDFS和mapreduce两部分:HDFS被用来储存数据,mapreduce用来处理数据。HDFS:Hadoop是用java实现的,分布式的,可横向扩展的文件系统。Distributed:分布式计算是利用互联网上的计算机的 CPU 的共同处理能力来解决大型计算问题的一种计算科学。
特性
1. 高容错性;
2. 高吞吐量;
3. 大文件存储。

适合:
1.大文件存储
2.流式数据访问。
不适合:
1. 大量小文件(原因:NameNode启动时,将文件系统的元数据加载到内存,因此文件系统所能存储的文件总数受限于NameNode内存容量。根据经验,每个文件,目录和数据块的存储信息大约占150字节,如果一百万个文件,且每个文件占一个数据块,那至少需要300MB的内存空间,但是如果存储十亿个文件,那么需要的内存空间将是非常大的。)
2. 支持追加,不支持随机写入;
3. 低延迟读取(原因:HDFS是为高数据吞吐量应用优化的,这样就会造成以高时间延迟为代价。)

2.系统架构
Hadoop技术研究
设计目标1:
1. 硬件失效;
2. 流式数据访问;
3. 存储数据大。

设计目标2:
1. 数据一致性;
2. 多硬件平台;
3. 移动计算能力。

Name Node:
HDFS只有一个namenode组成,也称masternode,可以记录文件,管理文件系统,有所有datanode的元数据. 只有一个namenode所以我们称之为单点故障. 直连客户端.NameNode管理文件系统的命名空间。它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(用以阶段性保存文件镜像)和编辑日志文件(记录用户的操作日志,用以在FSImage的基础上生成新的文件系统镜像)。
Data Node:
数据节点使用blocks(128M)存储数据,并负责客户端的读写. 每个datanode会和namenode做心跳链接,并定时(3s)发送心跳信息保证自己是活的。两分钟内没收到心跳就认为节点挂了,然后开始 把该节点的数据映射到其他节点去。一个数据块在 datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
Secondary Name Node:
它只关注namenode中文件系统元数据的检查点,也可以叫做检查节点。可以算作namenode的助手。
关键特性:1.元数据:
* 第一类是文件和目录自身的属性信息,例如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等。
* 第二类记录文件内容存储相关信息,例如文件分块情况、副本个数、每个副本所在的DataNode信息等。(NN中不存储DN和文件的对应关系,NN根据Data Node上报block id和DN的对应关系而得到文件存放位置)
* 第三类用来记录HDFS中所有DataNode的信息,用于DataNode管理。

3.HDFS写流程:
Hadoop技术研究
(1)客户端对DistributedFileSystem对象调用create()方法来创建文件。
(2)DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件,此时该文件中还没有相应的数据块。namenode执行各种检查以确保这个文件不存在,并且客户端有创建该文件的权限。如果这些检查均通过,namenode就会为创建新文件记录一条记录;否则,创建失败,并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOutputStream(文件输出流)对象,由此客户端可以开始写数据。就像读取数据一样,FSDataOutputStream封装一个DFSOutputStream(输出流)对象,该对象负责处理datanode和namenode之间的通信。
(3)在客户端写入数据时,DFSOutputStream(输出流)将他们分成一个个的数据包,并写入内部队列,成为数据队列(data queue)。
(4)DataStreamer(数据流)处理数据队列,它的责任是根据从NameNode获取到数据块编号、位置信息来存储数据。将需要写入数据的一组datanode组成一个管线—我们假设副本数量为3,所以管线中有3个节点。DataStreamer将数据包流式的传输到管线的第一个datanode,该datanode存储数据并将数据发送到管线的第二个datanode。同样的,第二个datanode存储该数据包并发送给管线中的第三个(也就是最后一个)datanode。
(5)FSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,成为“确认队列”(ack queue)。当管线中所有datanode确认信息后,该数据包才会从确认队列中删除。
(6)客户端完成写入后,会对数据流调用close()方法关闭文件,并联系namenode确认文件写完成。
(7)namenode已经知道文件由那些数据块组成,持久化元数据。
读流程:
Hadoop技术研究
(1)客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例。
(2)DistributedFileSystem通过RPC(远程过程调用)来调用namenode,以确定文件起始块的位置。对于每一个块,namenode返回存有该块所有副本的datanode地址。此外这些datanode根据他们与client的距离来排序。 DistributedFileSystem类返回一个FSDataInputStream对象(一个支持文件定位的输入流)给客户端并读取数据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着namenode和datanode的I/O。
(3)接着客户端对这个输入流调用read()方法。 DFSInputStream随即连接存储着文件起始块的距离最近的datanode。
(4)通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端。(5)到达块的末端时,DFSInputStream会关闭与该datanode的连接,然后寻找下一个块的最佳datanode。客户端只需连续的读取连续的流,并且对于客户端都是透明的。
(6)一旦客户端完成读取,就对DFSInputStream调用close()方法。 在读取数据的时候,如果DFSInputStream与datanode的通信出现错误,它便会尝试从这个块的另外一个最邻近的datanode读取数据。它也会记住出现故障的datanode,以保证以后不会反复读取该节点上后续的块。DFSInputStream也会通过“校验和”确认从datanode发来的数据是否完整。如果发现一个损坏的块,它就会在DFSInputStream试图从其他datanode读取一个块副本之前通知namenode。

问题:写入过程中如果某个datanode失效了怎么做?Hadoop技术研究