【大数据】hadoop分布式文件系统--HDFS

HDFS:Hadoop Distributeed File System

HDFS优点:
处理超大文件
运行在廉价机器上
流式地访问数据:一次写入,多次读取
HDFS缺点:
不适合低延迟数据访问
无法高效存储大量小文件

HDFS基础

一、四个角色:
Client:客户端
Client将文件切分成一个一个的数据块(block),然后进行存储。与NameNode交互,获取文件的位置信息,与DataNode交互,读取或者写入数据。Client提供一些命令来管理HDFS,比如启动或者关闭HDFS,也可以通过一些命令来访问HDFS。
NameNode:元数据节点(NN)
管理HDFS的名称空间,管理元数据信息,配置副本策略,处理客户端读写请求。管理文件系统的命名空间一个HDFS集群只有一个Active的NN。
DataNode(DN)
数据节点文件系统中真正存储数据的地方,一个集群可以有多个数据节点。
SecondaryNameNode(SNN)
从数据节点辅助NamaNode将内存中的元数据信息持久化合并NameNode的edit logs到fsimage文件中。
二、HDFS副本机制
Block:数据块
HDFS副本机制作用:避免数据丢失
副本默认数是3
存放机制:一个副本存放在本地机架节点上,一个副本存放在同一机架的不同节点,还有一个存放在相邻不同机架的节点上

HDFS读写流程

HDFS读文件:
【大数据】hadoop分布式文件系统--HDFS_第1张图片
1、首先调用FileSystem.open()方法,获取DistributedFileSystem实例
2、DistributedFileSystem向NameNode发起RPC(远程过程调用)请求获得文件的开始部分或全部block列表,对于每个返回的块,都包含块所在的DataNode地址,这些DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离,然后再进行排序。如果客户端本身是一个DataNode,那么他将从本地读取文件
3、DistributedFileSystem会向客户端client返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据。FSDataInputStrem包含一个DFSInputStream对象,这个对象用来管理DataNode和NameNode之间的I/O
4、客户端调用read()方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode
5、DFSInputStream对象中包含文件开始部分的数据块所在的DataNode地址,首先它会连接包含文件第一个块最近DataNode。随后,在数据流中重复调用read()函数,直到这个块全部读完为止。 如果第一个block块的数据读完,就会关闭指向第一个block块的datanode连接,接着读取下一个block块
6、如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
HDFS写文件:
【大数据】hadoop分布式文件系统--HDFS_第2张图片
1、Client发起文件上传请求,调用DistributedFileSystem对象的create方法,创建一个文件输出流(FSDataOutputStream)对象
2、通过DistributedFileSystem对象与Hadoop集群的NameNode进行一次RPC远程调用,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;在HDFS的Namespace中创建一个文件条目(Entry),该条目没有任何的Block
3、通过FSDataOutputStream对象,向DataNode写入数据,数据首先被写入FSDataOutputStream对象内部的Buffer中,然后数据被分割成一个个Packet数据包
4、以Packet最小单位(默认64K),基于Socket连接发送到按特定算法选择的HDFS集群中一组DataNode(正常是3个,可能大于等于1)中的一个节点上,在这组DataNode组成的Pipeline上依次传输Packet:client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、这组DataNode组成的Pipeline反方向上,发送ack,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client
6、完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流7 调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功 HDFS读文件:客户端发请求调用DistributedFileSystem中的open()方法,然后DistributedFileSystem向NameNode发请求,返回去块地址到客户端,DistributedFileSystem向客户端再返回一个支持文件定位的输入流对象FSDataInputStream,去读取数据,客户端调用read()方法,根据地址去读取数据,所有读取来的块会合并成一个完整的最终文件。

你可能感兴趣的:(hadoop)