【笔记】大数据学习

1、分布式文件系统HDFS须要了解的知识点node

本文参考:http://www.javashuo.com/article/p-acynnjzd-dg.html服务器

一、HDFS实现原理架构

HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,能够运行于廉价的商用服务器上。它所具备的高容错、高可靠性、高可扩展性、高得到性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了不少便利。并发

  • Block: 在HDFS中,每一个文件都是采用的分块的方式存储,每一个block放在不一样的datanode上,每一个block的标识是一个三元组(block id, numBytes,generationStamp),其中block id是具备惟一性,具体分配是由namenode节点设置,而后再由datanode上创建block文件,同时创建对应block meta文件
  • Packet:在DFSclient与DataNode之间通讯的过程当中,发送和接受数据过程都是以一个packet为基础的方式进行
  • Chunk:中文名字也能够称为块,可是为了与block区分,仍是称之为chunk。在DFSClient与DataNode之间通讯的过程当中,因为文件采用的是基于块的方式来进行的,可是在发送数据的过程当中是以packet的方式来进行的,每一个packet包含了多个chunk,同时对于每一个chunk进行checksum计算,生成checksum bytes
  • 小结:

    1. 一个文件被拆成多个block持续化存储(block size 由配置文件参数决定)app

    2. 数据通信过程当中一个 block 被拆成 多个 packet框架

    3. 一个 packet 包含多个 chunk分布式

 HDFS的优缺点比较 
HDFS 的优势:oop

一、高容错性大数据

1)数据自动保存多个副本。它经过增长副本的形式,提升容错性

2)某一个副本丢失之后,它能够自动恢复,这是由 HDFS 内部机制实现的,咱们没必要关心。.net

二、适合批处理

1)它是经过移动计算而不是移动数据

2)它会把数据位置暴露给计算框架。

三、适合大数据处理

1)处理数据达到 GB、TB、甚至PB级别的数据。

2)可以处理百万规模以上的文件数量,数量至关之大。

3)可以处理10K节点的规模

四、流式文件访问

1)一次写入,屡次读取。文件一旦写入不能修改,只能追加。

2)它能保证数据的一致性。

五、可构建在廉价机器上

1)它经过多副本机制,提升可靠性。

2)它提供了容错和恢复机制。好比某一个副本丢失,能够经过其它副原本恢复。 

HDFS 缺点(不适用适用HDFS的场景): 
一、低延时数据访问 
1)好比毫秒级的来存储数据,这是不行的,它作不到。

2)它适合高吞吐率的场景,就是在某一时间内写入大量的数据。可是它在低延时的状况下是不行的,好比毫秒级之内读取数据,这样它是很难作到的。

二、小文件存储 
1)存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,由于NameNode的内存老是有限的。

2)小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。


三、并发写入、文件随机修改

1)一个文件只能有一个写,不容许多个线程同时写。 
2)仅支持数据 append(追加),不支持文件的随机修改。

 

HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面咱们分别介绍这四个组成部分。

  1. NameNode:Master节点(也称元数据节点),是系统惟一的管理者。负责元数据的管理(名称空间和数据块映射信息);配置副本策略;处理客户端请求
  2. DataNode:数据存储节点(也称Slave节点),存储实际的数据;执行数据块的读写;汇报存储信息给NameNode
  3. Sencondary NameNode:分担namenode的工做量;是NameNode的冷备份;合并fsimage和fsedits而后再发给namenode。注意:在hadoop 2.x 版本,当启用 hdfs ha 时,将没有这一角色
  4. client:系统使用者,调用HDFS API操做文件;与NameNode交互获取文件元数据;与DataNode交互进行数据读写。注意:写数据时文件切分由Client完成 

  热备份:b是a的热备份,若是a坏掉。那么b当即运行代替a的工做

  冷备份:b是a的冷备份,若是a坏掉。那么b不能当即代替a工做。可是b上存储a的一些信息,减小a坏掉以后的损失

 

Client:就是客户端。

       一、文件切分。文件上传 HDFS 的时候,Client 将文件切分红 一个一个的Block,而后进行存储。

       二、与 NameNode 交互,获取文件的位置信息。

      三、与 DataNode 交互,读取或者写入数据。

       四、Client 提供一些命令来管理 HDFS,好比启动或者关闭HDFS。

       五、Client 能够经过一些命令来访问 HDFS。

NameNode:就是 master,它是一个主管、管理者。

      一、管理 HDFS 的名称空间。

       二、管理数据块(Block)映射信息

       三、配置副本策略

      四、处理客户端读写请求。

DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操做。

       一、存储实际的数据块。

       二、执行数据块的读/写操做。

Secondary NameNode:NameNode 的冷备。当NameNode 挂掉的时候,它并不能立刻替换 NameNode 并提供服务。

       一、辅助 NameNode,分担其工做量。

      二、按期合并 fsimage和fsedits,并推送给NameNode。

       三、在紧急状况下,可辅助恢复 NameNode。

 

HDFS的文件读取原理,详细解析以下:

è¿éåå¾çæè¿°

     一、首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例。

     二、DistributedFileSystem经过RPC(远程过程调用)得到文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照Hadoop拓扑结构排序,距离客户端近的排在前面。

     三、前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream能够方便的管理datanode和namenode数据流。客户端调用read方 法,DFSInputStream就会找出离客户端最近的datanode并链接datanode。

     四、数据从datanode源源不断的流向客户端。

     五、若是第一个block块的数据读完了,就会关闭指向第一个block块的datanode链接,接着读取下一个block块。这些操做对客户端来讲是透明的,从客户端的角度来看只是读一个持续不断的流。

     六、若是第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,而后继续读,若是全部的block块都读完,这时就会关闭掉全部的流。

 

HDFS的文件写入步骤图: 
这里写图片描述

HDFS的文件写入原理详细步骤解析:

      1.客户端经过调用 DistributedFileSystem 的create方法,建立一个新的文件。

      2.DistributedFileSystem 经过 RPC(远程过程调用)调用 NameNode,去建立一个没有blocks关联的新文件。建立前,NameNode 会作各类校验,好比文件是否存在,客户端有无权限去建立等。若是校验经过,NameNode 就会记录下新文件,不然就会抛出IO异常。

      3.前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候类似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 能够协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,而后排成队列 data queue。

      4.DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,好比重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推

      5.DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的全部DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。

      6.客户端完成写数据后,调用close方法关闭写入流。

      7.DataStreamer 把剩余的包都刷到 pipeline 里,而后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。