hadoop-hdfs
整体:https://segmentfault.com/a/11...
HDFS是hadoop的最底层存储部分,旨在部署在低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,高可靠服务。创建后除了追加和删除之外(append的实现也很曲折,很复杂的异常逻辑https://caodaoxi.iteye.com/bl...,无更改。直接写文件+多副本,读共享内存+就近。主要关注高可靠。
官方:http://hadoop.apache.org/docs...
HDFS是每台机器运行的守护进程,对外暴露网络服务,允许其他节点访问存储在该机器上的文件
架构
- NameNode
跟踪哪个文件块存储在哪台机器,先从namenode获取元数据,再到具体的datanode中读取数据。nn一般有两个互为主备,ANN,SNN NameSpace
在NameNode之上,一个ns包含多个nn
namespace:允许每个命名空间的NN自定义DNid的ip,无需和另一个NS商议。删除命名空间可删除自己的dn,nn。比如在NN1的DN1:IP2,NN3的DN2:IP4的配置:<property> <name>dfs.nameservices</name> <value>ns1,ns2</value> </property> <property> <name>dfs.nameservices.ns1</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-addr.ns1.nn1</name> <value>ip1:8082</value> </property> <property> <name>dfs.nameservices.ns2</name> <value>nn3,nn4</value> </property> <property> <name>dfs.namenode.rpc-addr.ns2.nn3</name> <value>ip4:8082</value> </property>
- DN
数据节点
高可靠
NN
存放每个节点的路由。可以每个机器放一个+n个dn。为了保证可靠性,每个NS都有两个NN,多NN的HA保证:
- 使用共享存储
存放nnlog,一个写一个读同步+zk自动故障转移
SNN在升级前确保log同步全,两个机器同时发心跳和block-map,
为了保证只有一个ANN写入NFS,一个ANN发出写DN,只有一个ANN对客户端做响应。必须在ANN降级后切段写入,确保网络延时的数据等不再写入。 - QJM。
QJM奇数个节点,轻量级,可以混部,QJM负责NN的接管转换隔离,写入持久化,读写一致性,自动故障还是要用zk。
DN
- 副本
通常副本有3份,三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,另外三分之一均匀分布在剩余的机架上。此策略可提高写入性能,而不会影响数据可靠性或读取性能。每个块【128 MB,block读写的时候是以packet(默认每个packet为64K)为单位进行的。每一个packet由若干个chunk(默认512Byte)组成。Chunk是进行数据校验的基本单位,对每一个chunk生成一个校验和(默认4Byte)并将校验和进行存储】都会保证有最小副本值。 - DN会自动负载均衡。与NN心跳,超时追踪需要复制的块引发新的复制
- 读取就近
- 写入流程
性能
- 所有HDFS通信协议都在TCP / IP协议之上
- 缓存
可以增加集中式缓存,DN将缓存上报到NN,NN路由到缓存节点 - 存储
DISK
ARCHIVE(pb级,冷存档)
RAM_DISK(HDFS支持写入由数据节点管理的堆外内存。数据节点将异步刷新内存中的数据到磁盘,从而从性能敏感的IO路径中删除昂贵的磁盘IO和校验和计算,因此我们称这种写入为Lazy Persist写入。HDFS为Lazy Persist Writes提供尽力而为的持久性保证。如果在将副本持久保存到磁盘之前重新启动节点,则可能会丢失数据。应用程序可以选择使用Lazy Persist Writes来换取一些持久性保证,以减少延迟)
SDD