简 介:这本书的名字为大数据技术原理与应用,该书的作者为厦门大学著名的研究大数据方向的林子雨老师。顾名思义,概述讲述了大数据的相关知识,包含一些分布式系统以及各种流计算等大数据技术。本书讲述的非常棒,通俗易懂。下面是我在读这本书的时候的记录并加上自己的理解。本文意在记录自己近期学习过程中的所学所得,如有错误,欢迎大家指正。
关键词:大数据组件、HBase、NoSQL
一、文件系统格式
Hadoop的文件系统是由多个服务器构成,集群中的节点都是放在机架上面,然后不同机架之间通过交换机进行互连。
HDFS的存储是以块为单位,就是说一个完整的文件会被切分成多个文件块存储到不同的服务器上面。对于一个集群来说,是由多个服务器构成的,而这些服务器分为两类,一类是名称节点(NameNode),另一种是数据节点(DataNode)。
- NameNode:用来存储文件树,以及文件块与HDFS位置的映射以及各种元数据
- DataNode:是真正用来存储数据的节点,受NameNode支配
当我们进行读取数据时,首先会访问NameNode节点获取所需要读取的文件的块在哪个位置,然后向存储文件块的服务器进行通信获得数据块。
当我们写数据时,依旧会访问NameNode,NameNode会进行分配存储位置,然后客户端把相应的数据写入分配到的节点。
很重要的一个地方就是HDFS存在副本机制,如果某一台服务器崩掉,我们会找到其它的DataNode节点访问它的副本数据,提高了数据的可靠性,在单个节点出现故障时,就可以很快的调用副本。
二、HDFS的一些特点
- 支持大数据存储:因为是集群机制,所以可以使用更多的服务器存储更大的数据
- 文件模型简单:HDFS是一次写入,多次读取,当我们将文件写入HDFS上面之后,是无法进行再次更改,只能是读取
- 数据延迟较高:HDFS无法使用于那些毫秒级的应用场景,广泛用于离线数据处理,HDFS主要是进行大规模数据进行批处理
- 不适合存储小文件:NameNode中会存取我们HDFS文件中的元数据就是一些位置映射数据,每条元数据也会占用一定空间,如果小文件很多,那么NameNode就是产生大量小文件的元数据,导致文件检索效率降低,而且如果小文件过多的话,进行MapReduce的时候计算开销也会较大,因为每个小文件会对应一个Map任务,导致线程数增多,严重的影响整个集群的性能。
- HDFS默认是以块进行存储数据,现在默认为128MB,每个块会作为独立的单元进行存储数据。
三、NameNode和DataNode
- NameNode:主要负责管理分布式文件系统的命名空间。它的内部含有两个核心的数据结构,分别是FsImage和EditLog。FsImage用于维护文件树中的数据以及文件夹的元数据。而EditLog就是操作日志,记录着客户端对文件系统的各种操作,包括文件的创建、删除、重命名等操作。NameNode记录着每个文件中各个块在DataNode中的位置信息。
- DataNode:会受NameNode的支配进行存储数据,客户端会进行访问,通过NameNode给的文件位置,拿到文件块
当NameNode启动时,会将FsImage加载到内存,然后执行EditLog中的操作来保持内存中的元数据是最新的。HDFS正常启动后,会将操作数据写入到操作日志中,而不是写入FsImage中,这是因为我们的HDFS系统支持的是大数据,如果直接操作数据的话系统就会变得非常缓慢,所以将操作写入操作日志还是非常高效的。
有一点就是当我们启动NameNode的时候,HDFS会进入安全模式,此时HDFS只能够对外界进行读数据操作,而不能够进行写操作,等待启动结束后,安全模式会自动退出,有时候不能够自动退出,可以自己使用命令进行退出。
hadoop dfsadmin -safemode leave
四、SecondaryNameNode
当我们启动NameNode之后,HDFS会不断地进行更新,这些更新操作就会不断地写入EditLog中,该文件就会不断地增大。这是就会存在一个问题,当我们重启NameNode时,我们要执行所有EditLog中的操作来进行更新FsImage中的元数据,这就会导致在启动初期启动地会非常慢,安全模式会非常的长,但是着不会影响运行阶段,EditLog文件尽管很大,在NameNode运行时不会造成影响。
为了解决这一问题就有了SecondaryNameNode节点,它的任务就是一定时间会拉取NameNode中的FsImage和EditLog然后将其进行合并,执行EditLog中的操作更新FsImage,然后将新的FsImage返回。
- NameNode创建一个新的EditLog文件,记录新的操作,老的不允许再写入
- SecondaryNameNode会将FsImage和EditLog将其拉到
- 执行EditLog更新FsImage
- 将新的FsImage返回给NameNode
五、HDFS的存储原理
HDFS是分布式文件系统,为了保证文件的可靠性采取了副本机制,它会将一个数据块的多个副本存到到不同的DataNode上,这样就会存在很多优点:
- 文件传输速率变快:当访问文件时,会访问距离客户端最近的节点上的数据
- 可以检查文件数据是否错误:因为存在多个副本,所以可以不同的DataNode之间进行通信,核对数据是否出错
- 保证数据不会丢失
数据的存放策略
HDFS的默认副本数为3,一个机架的不同机器会存储两个副本,另外一个存储到不同的机架中。这样既可以保证机架发生异常时能够进行恢复数据,还可以题号数据的读写性能,同一机架内的带宽非常高,所以同一机架内的通信非常快,另外如果一个机架出现问题,可以从其它的机架上进行恢复数据。
六、HDFS数据的读写流程
1.读数据流程
读取HDFS上面的数据分为几个流程:
- 客户端会通过File System.open()打开文件,调用open方法之后,创建HDFS的输入流
- 访问NameNode,通过getBlockLocations()方法会获得文件的数据块的存储位置,并用该存储位置初始化输入流
- 通过初始化好的输入流进行read操作,获取数据,但是读的数据是最近的,什么意思?就是第2步会初始化同一个数据块的输入流,因为存在多个副本,然后将其进行排序,最近的会优先访问,如果前面的出现访问异常然后读取下一个较近的
- 关闭数据流的连接
- 重复2、3、4操作直到将一个文件的所有数据块全部读取完成
2.写数据流程
向HDFS中写入数据的流程:
- 客户端通过FileSystem.create()获取文件的输出流
- 访问NameNode,NameNode此时会做一些检查就是带写入的数据是否存在等信息,如果不存在NameNode会创建一个新的文件,并添加元数据信息
- 调用输出流的write方法进行写数据
- 当时写入的数据会被分成一个一个的包,这些包会被存入到一个队列中
- 输出流向NameNode申请节点,这些节点就会构成一个数据流管道,按照流水线的方式不断发往目标节点
- 每个节点成功接收成功的话会返回ack,确认已经收到,沿着管道的逆方向,每当一个包成功接受就将其从队列中删除,直到队列中无数据
这些节点就会构成一个数据流管道,按照流水线的方式不断发往目标节点 - 每个节点成功接收成功的话会返回ack,确认已经收到,沿着管道的逆方向,每当一个包成功接受就将其从队列中删除,直到队列中无数据
- 关闭输出流资源