1.1. Hadoop组成:
Hadoop = hdfs(存储) + mapreduce(计算) + yarn(资源协调) + common(工具包) + ozone(对象存储) +
submarine(机器学习库)
hadoop生态圈:

1.2. 分布式存储系统HDFS (Hadoop Distributed File System)
概括: 它是一个分布式存储系统, 提供高可靠性(high reliablity), 高扩展性(high scalability)和高吞吐率(High throughput)的数据存储服务。
应用: 主要用于解决大数据的存储问题。
HDFS架构图:

HDFS 数据存储单元(block)
文件被切分成固定大小的数据块block
(1). 默认数据块大小为128MB(hadoop 3.x为256MB),可自定义配置
(2). 若文件大小不到128MB, 则单独存储成一个block
文件存储方式
(1). 按大小被切分成若干个block, 存储到不同节点上
(2). 默认情况下每个block都有3个副本
Block大小和副本数通过Client端上传文件时设置, 文件上传成功后副本数可以变更, Block Size 不可变更

hdfs存储模型: 字节
- ? 文件线性切割成块(Block): 偏移量 offset (byte)
- ? Block 分散存储在集群节点中
- ? 单一文件Block大小一致, 文件与文件可以不一致
- ? Block可以设置副本数, 副本分散在不同节点中(副本数不要超过节点数量)
- ? 文件上传可以设置Block大小和副本数
- ? 已上传的文件Block副本数可以调整, 大小不变
- ? 只支持一次写入多次读取, 同一时刻只有一个写入者可以append追缴数据
名称节点NameNode(NN)
主要功能:
- 接受客户端的读/写服务
- 收集DataNode回报的Block列表信息
特性: 基于内存存储, 不会和磁盘发生交换
NameNode保存metadata(元数据)信息
- 文件ownership(归属) & permission(权限)
- 文件大小, 时间
- Block列表: Block偏移量, 位置信息(不会持久化)
- Block 保存在哪个DataNode, 信息就由该DataNode启动时上报, 不保存在磁盘
NameNode持久化
- NameNode的metadate信息在启动后会叫再到内存
- metadata存储到磁盘的文件名为 “fsimage”
- Block的位置信息不会保存到 fsimage
- edits 记录对metadata的操作日志
fsimage保存了最新的metadata检查点, 类似snapshot.
editslog 保存自最新检查点后的原信息变化, 从最新检查点后, hadoop将对每个文件的操作都保存在edits中。客户端修改文件的时候, 先写到editlog, 成功后才更新内存中的metadata信息。
so: Metadata = fsimage + editslog
数据节点DataNode(DN)
- 本地磁盘目录存储数据(Block), 文件形式
- 同时存储Block的元数据(md5值)信息文件
- 启动DN进程的时候会向NameNode汇报block信息
- 通过向NN发送心跳保持与其联系(3秒一次), 如果NN 10分钟没有收到DN的心跳, 则认为其已经失效, 并拷贝其上的block到其他DN
第二个名称节点SecondaryNameNode(SNN) [hadoop2.x 被standby namenode替代]

合并流程:
首先是NN中的Fsimage和edits文件通过网络拷贝, 到达SNN服务器中, 拷贝的同时, 用户在实时操作数据, 那么NN中就会从新生成一个edits来记录用户的操作, 而另一边的SNN将拷贝过来的edits和fsimage进行合并, 合并之后替换NN中的fsimage。之后NN根据fsimage进行操作(每隔一段时间进行合并替换, 循环)。 当然新的edits与合并之后传输过来的fsimage会在下一次时间内又进行合并。
Block 的副本放置策略
- 第一个副本: 放置在上传文件的DN; 如果是集群外提交, 则随机挑选一台磁盘不太满, CPU不太忙的节点。
- 第二个副本: 放置在于第一个副本不同的机架的节点上。
- 第三个副本: 与第二个副本相同机架的不同节点。
- 更多副本: 随机节点
集群内提交:

HDFS读写流程
写文件流程图

- 客户端Client:
- 切分文件Block
- 按 Block 线性和NN获取DN列表(副本数)
- 验证DN列表后以更小的单位(packet)流式传输数据(需确保各节点可两两通信)
- Block传输结束后:
- DN向NN汇报Block信息
- DN向Client汇报完成
- Client向NN汇报完成
- 获取下一个Block存放的DN列表 ...............
- 最终Client汇报完成
- NN会在写流程更新文件状态
读文件流程图

- 客户端Client:
- 和 NN 获取一部分Block副本位置列表
- 在Block副本列表中按距离择优选取
- 和DN获取Block, 最终合并为一个文件
HDFS文件权限
与Linux文件权限类似
- r: read; w: write; x: execute
- 权限x对于文件忽略, 对于文件夹表示是否允许访问其内容
如果Linux系统用户xxx使用hadoop命令创建一个文件, 那么这个文件在HDFS中owner就是xxx。
HDFS的权限目的:组织好人做错事, 而不是阻止坏人做坏事。
HDFS相信, 你告诉我你是谁, 我就认为你是谁。
安全模式
- namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
- 一旦在内存中成功建立文件系统元数据的映射,创建一个空的编辑日志。
- 此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)。
- 在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
- 当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。
HDFS的优缺点
优点:
- 高容错性
- 适合批处理
- 移动计算而非数据
- 数据位置暴露给计算框架(Block 偏移量)
- 适合大数据处理
- TB, 甚至PB级数据
- 百万规模以上的文件数量
- 10K+ 节点
- 可构建在廉价机器上
缺点
低延迟
- 支持秒级别反应, 不支持毫秒级
- 延迟与高吞吐率问题(吞吐量大但有限制于其延迟)
小文件存储
并发写入, 文件随机修改
Hadoop组件详解(随缘摸虾)
原文:https://www.cnblogs.com/ronnieyuan/p/11523749.html