架构
block
HDFS会将文件分成若干block块来存储,这个dfs.blocksize参数默认block大小为128M
NameNode(NN)
主要是存储整个HDFS的文件系统,包括:文件名称/文件目录结构/文件属性(权限,创建时间,副本数等)/文件对应的哪些块(副本块),这里的文件和副本块的映射关系并不会持久化,而是在集群运行或者启动时,DN定期发送blockreport给NN来更新映射关系。
DateNode(DN)
用来存储数据块和校验以及读写数据,一般来说DN和NN之间的通信靠下面两个参数:
- blockreport dfs.blockreport.intervalMsec=21600000毫秒=6小时
- heartbeat dfs.heartbeat.interval=3秒
副本
HDFS中副本是个很重要的容错机制,防止硬件故障带来的文件损失。副本直接复制文件的各个block,HDFS中dfs.replication默认规定副本数为3。
列如:如果你要存储一个260M的文件,在不修改上述的参数情况下,HDFS实际上有它的3乘3=9个block,实际存储3乘260=780M。
副本放置策略
如果写请求出现在DataNode机器上,第一个副本就会存放在本机器上,否则就会随机存放在任意一个DataNode上,接着第二个副本就会存放在不同于第一个副本所在机架的机架上,第三个副本会随机存放在第二个副本所在机架的任一DataNode上。
生产上副本数
一般来说副本数使用3是比较适合的,但是如果你的使用场景中数据增长过快亦或者存储空间不是太够,建议把副本数调成2。在实际上,为了存储空间通常会将历史数据移到AWS的S3或者阿里云的oss上,在代码中只需要将hdfs://hadoop001:9000/换成oss://hadoop001:9000/或者s3://hadoop001:9000/。