组成:
- nameNode:
- 存储元数据(文件名,大小,类型等信息)
- 元数据保存在磁盘中,启动时加载到内存
- 保存文件,block,dataNode之间的映射关系
- dataNode:
- 存储文件内容
- 文件内容保存在磁盘
- 维护了blockId到dataNode本地文件的映射关系
运行机制:
- 一个nameNode, 多个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份副本。linux
NameNode(NN)
- 主要功能:接受client的读写请求
- 保存信息包括:
- 文件全部人,权限,
- 文件包含哪些block,
- block保存在哪一个dataNode上(dataNode启动时上报给nameNode)
- nameNode的元数据(metadata)启动后加载到内存
- metadata存储在磁盘的文件名是fsimage
- block位置信息不会存fsimage(启动时上报而后加载到内存)
- edits目录记录对metadata的操做日志。好比,当有新增删除操做时,会更新内存中的metadata,但并不会立刻更新fsimage,而是记录一条日志,隔一段时间以后再合并到fsimage中。
SecondaryNameNode(SNN)
-
并非nameNode的备份,但能够作一部分的元数据的备份api
-
主要功能:帮助nameNode合并edits文件安全
-
合并时机:并发
- 根据设置的时间间隔fs.checkpoint.period 默认3600s
- 根据设置的edits log大小fs.checkpoint.size 默认64MB
-
合并流程:SNN将NN的edits和fsimage拷贝过来,进行合并。而后将新生成的fsimage传输到NN替换旧的fsimage。为了保证数据不丢失,在SNN拷贝edits的时候,NN已经启用了新的edits。如此轮回反复。oop
-
在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的报告,当数据块达到最小副本数以上时,被认为是‘安全’的。
- 当检测到有副本数不足的数据块时,该块会被复制达到最小副本数