在前面我们了解了HDFS文件系统的数据安全,是依靠多个副本来确保的。
如何设置默认文件上传到HDFS中拥有的副本数量呢?可以在hdfs-site.xml中配置如下属性:
<property>
<name>dfs.replicationname>
<value>3value>
property>
这个属性默认是3,一般情况下,我们无需主动配置(除非需要设置非3的数值)。
如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性。
除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储。
hadoop fs -D dfs.replication=2 -put text.txt /tmp/
如上命令,就可以在上传test.txt的时候,临时设置其副本数为2。
对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令
hadoop fs -setrep [-R] 2 path
如上命令,指定path的内容将会被修改为2个副本存储。
-R选项可选,使用-R表示对子目录也生效。
我们可以使用hdfs提供的fsck命令来检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
fsck可以检查指定路径是否正常
-files可以列出路径内的文件状态
hdfs fsck /it/fb -files
-files -blocks 输出文件块报告(有几个块,多少副本)
hdfs fsck /it/fb -files -blocks
-files -blocks -locations 输出每一个block的详情
hdfs fsck /it/fb -files -blocks -locations
可以看到通过fsck命令我们验证了:
对于块(block),hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。
块大小可以通过参数:
<property>
<name>dfs.blocksizename>
<value>268435456value>
<description>设置HDFS块大小,单位是bdescription>
property>
如上,设置为256MB
在hdfs中,文件是被划分了一堆堆的block块,那如果文件很大、以及文件很多,Hadoop是如何记录和整理文件和block块的关系呢?
edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block。
edits记录每一次HDFS的操作逐渐变得越来越大。
问题在于,当用户想要查看某文件内容,如:/tmp/data/test.txt
就需要在全部的edits中搜索(还需要按顺序从头到尾,避免后期改名或删除),效率非常低。
将全部的edits文件,合并为最终结果,即可得到一个FSImage文件。
NameNode基于edits和FSImage的配合,完成整个文件系统文件的管理。
对于元数据的合并,是一个定时过程,基于:
只要有一个达到条件就执行。
检查是否达到条件,默认60秒检查一次,基于:
对于元数据的合并,还记得HDFS集群有一个辅助角色:SecondaryNameNode吗?
没错,合并元数据的事情就是它干的
关键信息点:
结束!!!!!!
hy:35
不要对人性抱以过高的期待,永远要警惕人性深处的幽暗,法治的前提就是对人性败坏的假设。