前言
我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的。那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了
一、HDFS中数据块概述
1.1、HDFS集群中数据块存放位置
我们知道hadoop集群遵循的是主/从的架构,namenode很多时候都不作为文件的读写操作,只负责任务的调度和掌握数据块在哪些datanode的分布,
保存的是一些数据结构,是namespace或者类似索引之类的东西,真正的数据存储和对数据的读写是发生在datanode里的。
找到${HADOOP_HOME}/ect/hadoop/hdfs-site.xml文件,里面有你自己定义的dfs.datanode.data.dir一项就是你数据存放的位置。
此外我们还可以通过Web控制页面(http://master:50070)的hdfs查看你所存放的所有数据文件,而且更加的清晰简洁,包括文件的名称,用了多少个数据块存储,数据块的id,每个数据块写入数据的大小。
1.2、数据块(data block)简介
每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位,构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍。
HDFS同样也有块的概念,但是大得多,默认为128MB(2.0以前是64MB)。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为多个分块,作为独立的存储单元。
与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。
1.3、对分布式文件系统中的块进行抽象会带来很多好处
1)第一个明显的好处是,一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上,因此他们可以利用集群上的任意一个磁盘进行存储。
2)第二个好处是,使用块抽象而非整个文件做为存储单元,大大简化了存储子系统的设计。简化是所有系统的目标,但是这对于故障种类繁多的分布式系统来说尤为重要。
将存储子系统控制单元设置为块,可简化存储管理(由于块的大小是固定的,因此计算单个磁盘能够存储多少个块相对容易)。同时也消除了对元数据的顾虑(块只是存储数据的一部分---而文件的元数据,
如权限信息,并不需要与块一同存储,这样一来,其他的系统就可以单独管理这些元数据)。
3)块非常适合用于数据备份进而提供数据容错能力和可用性。将每个块复制到少数几个独立的机器上(默认为3个),可以确保在发生块、磁盘或机器故障后数据不会丢失。
如果发现一个块不可用,系统会从其他地方读取另一个复本,而这个过程对用户是透明的。
注意:HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。
二、Java访问HDFS中的数据块
2.1、相关类和方法介绍
Hadoop关于HDFS中的数据块相关类 org.apache.hadoop.hdfs.protocol包下。(不知道为什么在2.8的api