Hadoop入门
分布式文件系统架构
文件切分思想
-
文件存放在一个磁盘上效率肯定是低的
- 读取效率低
- 如果文件特别大会超出单机的存储范围
-
字节数组
- 文件在磁盘真实存储文件的抽象概念
- 数组可以进行拆分和组装,源文件不会受到影响
-
切分数据
- 对字节数组进行切分
-
拼接数据
- 按照数组的偏移量将数据连接到一起,将字节数组链接到一起
-
偏移量
- 当前数据在数组中的相对位置,你可以理解为 下标
- 数组都有对应的索引(下标),可以快速的定位数据
-
数据存储的原理
- 不管文件的的大小,所有的文件都是由字节数组构成
- 如果我们要切分文件,就是将一个字节数组分成多份
- 我们将切分后的数据拼接到一起,数据可以继续使用
- 我们需要根据数据的偏移量将他们重新拼接到一起
Block拆分标准
-
拆分的数据块需要等大
- 数据不统一,算法很难设计
- 数据拉取的时候时间相对一致
- 通过偏移量就知道这个块的位置
- 相同文件,分成的数据块大小应该相等
-
数据块 Block
-
数据被切分后的一个整体称之为块
-
在H1默认大小为64M,在H2及其以后默认大小为128M
-
同一个文件中,数据块大小要一致除了最后一个节点外
- 不同文件中,块的大小可以不一致
- 文件大小不同可以设置不同的块的数量
-
真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小
-
数据块的个数 =Ceil( 文件大小 / 每个块的大小)
-
-
注意事项
-
HDFS中一旦文件被存储,数据不允许被修改
- 修改会影响偏移量
- 修改会导致数据倾斜
- 修改数据会导致蝴蝶效益
-
但是可以被追加,但是不推荐
- 追加设置需要手动打开
-
一般HDFS存储的都是历史数据。所以 将来Hadoop的mr都用来进行离线数据的处理
-
块的大小一旦文件上传之后就不允许被修改
-
问题
- 如果数据文件的切割点128M整好是一个单词的中间部分,切分数据如何保证数据的完整性?
-
Block数据安全
-
对存储数据做备份
-
备份的数据肯定不能存放在一个节点上
-
所以备份的数量要小于等于节点的数量
-
每个数据块会有3个副本(总)
-
副本的数量可以变更
- 可能近期的数据被分析的可能性跟大,副本数可以多设置几个
- 后期数据很少被分析,可以减少副本数
Block的管理效率
-
分工
- 存储 DataNode
- 记录 NameNode
- 日志 secondaryNameNode
HDFS的特点
-
优点
-
高容错性
- i.保存多个副本,且提供容错机制。
- ii.副本丢失或宕机自动恢复。默认存3份。
-
运行在廉价的机器上(商用机)
- i.通过副本提高可靠性
- ii.提供了容错和恢复机制
-
适合批处理
- i.移动计算而非数据
- ii.数据位置暴露给计算框架。NameNode上有位置
-
适合大数据的处理
- i.TB,甚至PB级数据
- ii.百万规模以上的文件数量
- iii.10K+节点规模
-
流式数据访问
- i.一次写入,多次读取,高吞吐量,所以可以同时处理大量数据
-
-
缺点
-
不擅长低延迟数据访问
- 比如毫秒级
-
不擅长小文件的分区
- i.占用NameNode大量内存,每个小文件都有一个元数据信息,甚至比文件还大
- ii.磁盘寻道时间超过读取时间
-
不擅长并发写入,文件随机修改
- i.一个文件只能有一个写入者
- ii.仅支持append,也就是添加(有组件实现删等)
-
Hadoop集群命令
分类
-
hadoop fs
- 该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广
-
hadoop dfs(推荐)
- 专门针对hdfs分布式文件系统
hdfs dfs命令
-
-mkdir
-
-ls
-
-put
-
-get
-
-du
- 显示给定目录中包含的文件和目录的大小或文件的长度,用字节大小表示
-
-dus
- 显示文件长度的摘要
-
-mv
- 不允许跨文件系统移动文件
-
-cp
-
-copyFromLocal
- 从本地复制文件到hdfs文件系统(与-put命令相似)
-
-copyToLocal
- 复制hdfs文件系统中的文件到本地 (与-get命令相似)
-
-rm
-
-cat
-
-text
- 获取源文件并以文本格式输出文件
-
-touchz
- 创建一个零长度的文件
-
-stat
-
-tail
- 显示文件的最后1kb内容到标准输出
-
-getmerge
- 将源目录和目标文件作为输入,并将src中的文件连接到目标本地文件(把两个文件的内容合并起来
-
-distcp
- 最常用在集群之间的拷贝
文件的数据类型
文件有一个stat命令
- 元数据信息–>描述文件的属性
文件有一个vim命令
- 查看文件的数据信息
分类
-
元数据
- 文件的基本信息
-
文件数据
- 真实存在于文件中的数据
NameNode(NN)
功能
-
接受客户端的读写服务
- NameNode存放文件与Block的映射关系
- NameNode会记录Block与DataNode的映射关系,但是不会持久化
-
保存文件的元数据信息
- 文件的归属
- 文件的权限
- 文件的大小时间
- Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
-
收集Block的信息
-
系统启动时
-
NN关机的时候是不会存储任意的Block与DN的映射信息
-
DN启动的时候,会将自己节点上存储的Block信息汇报给NN
-
NN接受请求之后重新生成映射关系
- Block–DN3
-
如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
-
-
集群运行中
- NN与DN保持心跳机制,三秒钟发送一次
- 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
- 可以让客户端读取存活的DN节点
-
-
如果DN超过三秒没有心跳,就认为DN出现异常
-
- 不会让新的数据读写到DataNode
-
- 客户访问的时候不提供异常结点的地址
- 如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点
-
性能
-
NameNode为了效率,将所有的操作都在内存中完成
-
NameNode不会和磁盘进行任何的数据交换
-
问题
- 数据的持久化
- 数据保存在内存中,掉电易失
-
DataNode(DN)
功能
-
存放的是文件的数据信息和验证文件完整性的校验信息
- 数据会存放在硬盘上
- 1m=1条元数据 1G=1条元数据
- NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
-
汇报
-
启动时
- 汇报之前先验证Block文件是否被损坏
- 向NN汇报当前DN上block的信息
-
运行中
- 向NN保持心跳机制
- 客户可以向DN读写数据
-
-
当客户端读写数据的时候,首先去NN查询file与block与dn的映射,然后客户端直接与dn建立连接,然后读写数据
SecondaryNameNode
传统解决方案
-
日志机制
-
做法
- 做任何操作之前先记录日志
- 当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
-
缺点
- edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长
- 有可能日志中存在大量的无效日志
-
优点
- 绝对不会丢失数据
-
-
拍摄快照
-
做法
- 我们可以将内存中的数据写出到硬盘上(序列化)
- 启动时还可以将硬盘上的数据写回到内存中(反序列化)
-
缺点
- 关机时间过长
- 如果是异常关机,数据还在内存中,没法写入到硬盘
- 如果写出频率过高,导致内存使用效率低(stop the world) JVM
-
优点
- 启动时间较短
-
SNN解决方案
-
解决思路(日志edits+快照fsimage)
- 让日志大小可控
- 定时快照保存
-
NameNode文件目录
-
解决方案
-
启动一个集群的时候,会产生四个文件
- edits_0000000000000000001
- fsimage_00000000000000000
- seen_txid
- VERSION
-
我们每次操作都会记录日志 -->edits_inprogress-000000001
-
随和时间的推移,日志文件会越来越大,当达到阈值的时候(64M 或 3600秒)生成新的日志文件(合并一次Fsimage快照 和 Edits日志)
- edits_inprogress-000000001 -->edits_0000001
- 创建新的日志文件edits_inprogress-0000000016
-