▶ \blacktriangleright ▶ HDFS简单介绍 (Hadoop核心技术止之一)
-
优缺点
-
优点:
- 运行在廉价的硬件之上
- 适合存储超大文件
- 流式数据访问:一次写入多次读取
-
缺点:
- 不适合低延迟数据访问 : HDFS是为了处理大型数据集分析任务、为达到高的数据吞吐量而设计的
- 无法高效存储大量的小文件 :namenode是存储源文件并放置在内存中的,文件系统所能容纳的文件数目由namenode的内存大小决定
- 不支持多用户写入及任意修改文件 :在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾完成,也就是说只能执行追加操作
-
▶ \blacktriangleright ▶ 组成架构
-
主控节点NameNode和从控系节点DataNode
-
HDFS集群有两类节点,并以管理者-工作者模式运行,即一个NameNode(管理者)和多个DataNode(工作者)
-
NameNode:
- 保存文件系统的3种元数据
- 命名空间
- 数据块与文件名的映射
- 每个数据块副本的位置细信息,每个数据块默认有3个副本
- 可以执行文件操作(打开、关闭、重命名),负责向DataNode分配数据块并建立数据块和DataNode的对应关系
- 保存文件系统的3种元数据
-
DataNode:用来实际存储和管理文件的数据块
-
负责处理文件系统用户具体的数据读写请求,同时也处理NameNode对数据块的创建和删除副本的指令
-
-
文件块大小:为了提高硬盘的效率,文件系统中最小的读写为单位不是字节,而是一种数据块(Block)
- Hadoop2.x中 ,HDFS文件每个数据块默认的大小是128MB;同时为了防止数据丢失,每个数据块默认有3个副本,且3个副本会分别复制在不同的节点上,以避免因一个节点失效造成一个数据块的彻底丢失
- Hadoop1.x : 64MB
- 在hdfs.site.xml文件中通过配置项dfs.replication来设置每个HDFS块在Hadoop集群中保存的的份数,值越大,冗余性越好,占用存储也越,默认值是3,也就是说有2份冗余
-
心跳
-
Client
▶ \blacktriangleright ▶ HDFS的基本文件访问过程
- 用户的应用程序通过HDFS的客户端程序将文件名发送至NameNode
- NameNode接收到文件名之后,在HDFS目录中检索文件名对应的数据块,在根据数据块信息找到保存数据块的DataNode地址,将这些地址会送到客户端
- 客户端接收到DataNode地址之后,和这些DataNode并行的进行数据传输操作,同时将操作结果的相关日志提交到NameNode
▶ \blacktriangleright ▶ HDFS的数据流
-
读数据流程
- 使用HDFS提供的客户端开发库Client,向远程的NameNode发起请求
- NameNode 会视情况返回文件的部分或者全部Block列表,对于每个Block,NameNode都会返回由该Block复制的DataNode地址
- Client会选取离客户端最近的DataNode来读取Block,如果客户端本身就是DataNode,那就直接从本地直接获取数据
- 读取完当前的Block的数据后,关闭和当前的DataNode的连接,为下一个Block寻找最佳的DataNode
- 读完列表的Block后,并且文件读取还没有结束,Client会继续通知NameNode获取下一批的Block列表
- 读取完一个Block会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该BlocfuzhideDataNode地址继续 读
-
写数据流程
- 使用HDFS提供的客户端开发库Client,向远程的RPC发起请求
- NameNode会检查要创建的文件是否已经存在,创建者是否有权限进行该操作,检查成功则会为文件常见一个记录,失败就让客户端抛出异常
- 当客户端开始写入文件时,会将文件切分成多个packet,并在内部以数据队列的形式管理这些packet,并且向NameNode申请新的Block,获取用来存储replicas合适的DataNode列表,列表的大小根据NameNode中队replication的设置而定
-
网络拓扑-节点距离计算
- 节点距离:两个节点到达最近的共同祖先的距离总和。
-
副本存储节点选择(机架感知)