这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
HDFS是一个分布式的文件系统;
使用场景
适合一次写入,多次读出的场景。但是它但是不支持文件的修改,所以他适合用来做大数据的分析查询,而非数据经常变化的那些应用。
优缺点
优点:
- 高容错性
- 数据多副本
- 副本丢失自动恢复
- 适合处理大数据
- 数据达到GB,TB甚至PB级别的数据
- 可以构建在廉价机器上提供多副本机制,提高可靠性。
缺点:
- 不适合低延迟的访问,ms级的数据存储是不可实现
- 即数据存入到被查询,这中间是有时间间隔的。
- 不适合大量小文件存储
- HDFS的么个文件都对应这NameNode上存储的一块元数据。如果小文件太多, 就会需要大量的NameNode内存来存储这些小文件的元信息,而我们一般廉价机器,内存都不会太高;
- 小文件存储寻址时间可能会超过读取时间,一块文件可能一次就可以读取到了,但是磁盘的寻道则时间会更长,小文件越多,则磁盘的磁头切换也会越频繁,那么就会导致整体上寻找文件位置时间,比读取文件时间还要长。
- 不支持并发写入
- 一个文件只能一个线程来写
- 不支持文件的随机修改
- 仅支持数据的append,不能随机修改文件(之前存过的文件的修改)
架构
除了图中的NameNode和DataNode外,主要讲Client和SecondaryNameNode。
client客户端
client就是和我们用户交互的一个程序包,他主要的职责:
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block(默认128M),然后进行上传;
(2)与NameNode交互,去获取文件的元数据位置信息;
(3)拿到位置信息后,与DataNode交互,读写数据到DataNode;
(4)Client还提供一些命令来管理HDFS;
(5)Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;
Secondary NameNode:(非NameNode的热备服务:在NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。)
(1)辅助NameNode的工作,比如合并Fsimage和Edits推送给NameNode;
(2)在某些情况下,可以帮助恢复NameNode进程。
HDFS 文件块大小的设置
HDFS文件系统中,文件将以块的方式被存储在系统中。hadoop新版本默认为128M,1.X的旧版本为64M
为什么是128M:
- 讲义中假设一般机器寻址的时间为10ms;
- 不知何处的定义:当机器寻址时间是传输时间的1%的时候,是为机器最佳状态。 10ms/0.01 = 1s,所以最佳传输时间为1s
- 目前磁盘的传输速度普遍在100m/s,所以1s*100ms/s 一个block的大小为100m左右。保证一个块,在1s内可以完全被传输完毕保证最佳状态。
块不能设置的太小,也不能太大:
- 太小,增加寻址时间;
- 太大, 传输数据的时间就很长,处理数据就会十分慢,远远大于定位需要的时间
HDFS块的大小主要取决于磁盘的传输速率,如果SSD的盘,我们可以设置块大小为256M