组成:
- nameNode:
- 存储元数据(文件名,大小,类型等信息)
- 元数据保存在磁盘中,启动时加载到内存
- 保存文件,block,dataNode之间的映射关系
- dataNode:
- 存储文件内容
- 文件内容保存在磁盘
- 维护了blockId到dataNode本地文件的映射关系
运行机制:
- 一个nameNode, 多个dataNode
- 数据复制【副本机制】
- 故障检测
- dataNode是否宕机
- 数据是否完整
- 空间回收机制
优点
- 高容错性
- 数据自动保存多个副本
- 副本丢失后自动恢复
- 适合大数据
- TB 甚至PB级别的数据
- 百万规模以上的文件数量
- 10K+ 节点
- 可构建在廉价机器上
- 通过对歌副本提高可靠行
- 提供了容错和恢复机制
缺点
- 低延迟数据访问
- 比如毫秒级
- 低延迟与高吞吐量
- 大量小文件存储
- 占用大量的nameNode内存
- 寻道时间超过读取时间
- 并发写入,文件随机修改
- 文件放在hdfs后不方便修改(修改内容)
- 一个文件不能有多个写入者
数据存储单元(block)
- 文件被切割成固定大小的数据块,默认每个块是64MB,可配
- 若文件不足64MB, 也单独存一个block;一个block只存一个文件,但一个文件可能存多个block。
- block是逻辑概念,不是物理结构,即文件实际多大就占用多大的磁盘空间。
- 默认每个数据存两个副本(共三份数据),可配。
- 副本数和块的大小通过client上传时设置。文件上传成功后,副本数可修改,块的大小不可修改。
设计思想
一个文件,以70MB为例,将被切分成两个数据块(64MB和6MB),每个block存三份在不同的节点(dataNode)上。 当有一个dataNode挂掉,hdfs会发现某个block的副本数 < 3,这时会找到另外的一个副本,复制一份,然后存在其他空闲的dataNode上,这时副本数又恢复到3份副本。
NameNode(NN)
- 主要功能:接受client的读写请求
- 保存信息包括:
- 文件所有人,权限,
- 文件包含哪些block,
- block保存在哪个dataNode上(dataNode启动时上报给nameNode)
- nameNode的元数据(metadata)启动后加载到内存
- metadata存储在磁盘的文件名是fsimage
- block位置信息不会存fsimage(启动时上报然后加载到内存)
- edits目录记录对metadata的操作日志。比如,当有新增删除操作时,会更新内存中的metadata,但并不会马上更新fsimage,而是记录一条日志,隔一段时间之后再合并到fsimage中。
SecondaryNameNode(SNN)
-
并不是nameNode的备份,但可以做一部分的元数据的备份
-
主要功能:帮助nameNode合并edits文件
-
合并时机:
- 根据设置的时间间隔fs.checkpoint.period 默认3600s
- 根据设置的edits log大小fs.checkpoint.size 默认64MB
-
合并流程:SNN将NN的edits和fsimage拷贝过来,进行合并。然后将新生成的fsimage传输到NN替换旧的fsimage。为了保证数据不丢失,在SNN拷贝edits的时候,NN已经启用了新的edits。如此轮回反复。
-
在NN挂了之后,SNN还保留着上次备份完成时的fsimage, 所以,可以恢复大部分数据。
由此可见,内存中的元数据,和fsimage有一定的差异,元数据是实时的,fsimage不是。
DataNode(DN)
- 存储数据(block)
- 启动时会向NN汇报block信息
- 通过向NN发送心跳保持联系(3s一次),如果NN十分钟没有收到DN的心跳,则认为DN已经lost,并复制其上的block到其他的DN
Block副本放置的策略
- 第一个副本:放置在上传文件的DN
- 第二个副本:放置在和第一个副本不同的机架的节点上
- 第三个副本:放置在和第二个副本相同的机架上的节点上
- 更多副本:随机节点
HDFS读数据流程
- client通过DistributedFileSystem请求NN,获得block的位置信息
- client请求FSDataInputStream,通过这个api,并发地读取DN上的各个block
- client合并成一个完整的文件
HDFS写数据流程
- client通过DistributedFileSystem请求NN, 创建元数据(文件名,大小,所有人),NN返回数据应该切多少个block,应该存在哪些DN
- client通过FSDataOutputStream往其中一个DN写入数据,产生一个副本
- 再由这个DN产生一个线程,往其他的DN上复制副本,返回成功信息
- client再往NN发信息告诉NN, 文件上传完了。
HDFS文件权限
- 与linux文件权限类似,rwx
- x 对于文件忽略,对于文件夹表示是否允许访问其内容
- 如果linux用户zhangsan,使用hadoop命令创建了一个文件,那么文件在hdfs的所有人就是zhangsan
- 不做密码认证,告诉我你是谁我就相信你是谁。做密码认证会降低数据读写的速度,所以适合存安全性不是很高的数据
安全模式(初始化阶段)
- NN启动时,首先将fsimage加载到内存,并执行edits的各项操作;
- 一旦内存中成功形成元数据,将生成一个新的fsimage和一个空的edits。就是好比自己做了一遍SNN的工作。
- 此时的hdfs对于client而言是只读的。
- 此阶段,NN收集各个DN的报告,当数据块达到最小副本数以上时,被认为是‘安全’的。
- 当检测到有副本数不足的数据块时,该块会被复制达到最小副本数