-
在HDFS文件系统里面,会默认把需要存储的数据进行切割存储,每切出来的一个块都是128M(hadoop2.x 和 hadoop3.x),64M(hadoop1.x);
-
为什么每一个块都是128M?找到一个文件10ms,最好的获取数据的时间是1000ms=1s,现在的磁盘的读取速度大约是100M/s。所以把块设置为128M.
当我们在磁盘上找东西时,大文件和小文件的寻址时间都是一样的,大约是5ms~15ms之间
当寻址时间大约占传输时间的1%是最好的。
什么是寻址时间?
就是系统在硬盘上找到一个文件所需要的时间
总结:每一个块到底可以设置多大,取决于硬盘的读写速度,假如你们公司全部使用固态硬盘,就可以设置为256M一个块,也可以更大。
3.在HDFS中,每一个块默认都有三个数据(防止丢失,这叫容灾【防灾】)。
一般集群中的每一个数据都有三份
4.机架感知
就是当有一个DataNode节点发生故障损坏了或者是怎么了不能使用了,NameNode节点就会在损坏了的DataNode旁边离的近的地方再找一个没有存满数据的DataNode节点里面存放数据。如果一个没有存完损坏的节点的数据,还会再找其他的节点来进行存储。
Hadoop为什么可以做到机架感知呢?算法
5.为什么不把块设置的小一点?
消耗内存:不管一个块大或者小,都有元数据(元数据就相当于是数据的目录,NameNode),这个元数据大概是150字节,当把块设置小了之后,块的数量就变多了,相应的元数据的数量也就变多了。
6.块信息如何修改
可以通过hdfs-site.xml 修改块大小
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>默认块⼤⼩,以字节为单位。可以使⽤以下后缀(不区分⼤⼩写):k,m,g, t,p,e以重新指定⼤⼩(例如128k, 512m, 1g等)</description>
</property>
<property>
<name>dfs.namenode.fs-limits.min-block-size</name>
<value>1048576</value>
<description>以字节为单位的最⼩块⼤⼩,由Namenode在创建时强制执⾏时间。这可以防 ⽌意外创建带有⼩块的⽂件降低性能。</description>
</property>
<property>
<name>dfs.namenode.fs-limits.max-blocks-per-file</name>
<value>1048576</value>
<description>每个⽂件的最⼤块数,由写⼊时的Namenode执⾏。这可以防⽌创建降低性能 的超⼤⽂件
</description>
</property>
每一个主要的配置文件都有两份,第一份是 hdfs-defalut.xml 里面存放的是这个功能的默认设置;还有一个是hdfs-site.xml 这个里面存放的是 自定义设置。
hdfs-site.xml中的配置会替换hdfs-defalut.xml中的配置。
1G = 1024M
1T = 1024G
1P = 1024T
7.hdfs的优缺点
缺点:
1、对于低延迟(立即响应)的场景是不合适的
2、不适合存储小文件
3、不适合修改(文件上传之后无法修改)
优点:
1、适合大数据量的存储
2、一份变三份,具有很好的容错性
8.hdfs的体系结构
1、NameNode
有且仅有一个(HA【高可用】除外),负责整个集群的管理工作;
管理着DataNode节点,记录每个块的信息,还处理客户端的各种请求
NameNode所记录的数据都是在内存里面存放的,如果机器宕机了,内存数据也会消失。为了防止数据丢失,NameNode有两个帮手:fsimage、edit
2、SecondaryNameNode
这不是第二个NameNode,算是NameNode的秘书,也是只有一个
他可以帮助NameNode完成fsimage和edit的合并工作
3、DataNode
数据节点,是hdfs真正存储数据的地方,可以有一个,也可以有多个,
会不定时的想NameNode发送心跳数据,每隔3秒发送一次。