基于《hadoop权威指南》第四版
一、什么是hdfs
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。
- HDFS是一个高度容错性的系统,适合部署在廉价的机器上。
- HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
- HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。
HDFS是Apache Hadoop Core项目的一部分。
二、hdfs不适合的几个场景
1. hdfs不适合低时延的应用(几十毫秒)
hdfs本身为高吞吐而优化!
思考: 为何基于hdfs实现的hbase可以满足低延迟的访问需求?
2.小文件不能过多
每个文件、目录、数据块的存储信息大约150字节。
所以一百万个文件,至少需要300MB的内存。当小文件过多时会直接压垮namdnode。
3.不能多用户写入,任意修改文件
不能多用户写入,任意修改文件。hdfs文件只支持单用户写入,仅append!这个和hdfs存储原理相关,后续的笔记会详细介绍。
hdfs最适合一次写入多次读取是最高效的访问模式
三、hdfs基本信息
1. namenode与datanode
- namenode 可以理解为存储hdfs元数据信息的结点
- datanode 可以理解为实际存储数据的结点
当然二者的关系不仅仅如此,会有一些复杂的设计在里面。
2.hdfs的块信息
hdfs默认块是128MB,但是当你数据是是10MB时,hdfs不会占用128MBMB(与普通文件系统不一样)。
hdfs的块为什么这么大?
为了最小化寻址开销。当然这个值也不能太大,map任务通常一次只能处理一个块中的数据。
3.基本命令
# 查看help
hadoop fs -help
# 上传文件
hadoop fs -copyFromLocal xxx hdfs://localhost/
# 下载文件
hadoop fs -copyToLocal
# 建目录
hadoop fs -mkdir dir
# ls
hadoop fs -ls .
# ls结果的第二列是副本数。其中目录的元数据存储在namenode无副本一说,所以值是 “-”
当客户端使用core-site.xml配置后,我们的命令就不需要使用冗长的URI
四、其他
1.最佳分片大小?
最佳分片大小与块大小相同,如果分片跨越两个数据块。hdfs基本不会同时存储着两个数据块,因此分片中的部分数据需要通过网络传输到map任务运行的节点。
2.map任务将其输出写入本地磁盘而不是hdfs?
中间数据存储在hdfs小题大做了(没必要多副本)。存储在本地磁盘还可以加速运算,减少网络传输。
reduce任务并不具备本地化的优势。
3.hdfs读取与写入流程?
都是6小步,在下一笔记详细介绍