1.1认识HDFS
当数据集的大小超过单台计算机的存储能力时,有必要将其进行分区并存储在若干台单独的计算机上。而通过网络来进行管理的跨多台计算机存储的文件系统称为分布式文件系统。该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通的文件系统更为复杂,比如容忍节点故障且不丢失任何数据等。
1.1.1HDFS的优缺点
优点:(1)适合存储超大文件:存储在Hadoop分布式文件系统的文件大多在GB甚至TB的级别。
(2)运行在普通的PC server之上,不需要昂贵的服务器。
缺点:(1)实时的数据访问弱:如果应用要求数据访问的时间在秒或者毫秒级别,HDFS做不到。可以考虑用HBase。
(2)HDFS中的文件只能有一个写入者,并且写数据操作总在文件末,不能再任意位置进行修改,也不支持多个写入者。
1.2HDFS架构
一个完整的HDFS运行在一些节点之上,这些节点运行着不同类型的守护进程,如NameNode、DataNode、SecondaryNameNode,不同类型的节点相互协作一起构成HDFS。
(1)数据块
HDFS同样有块的概念,但是HDFS的数据块要比一般的文件系统的数据块大得多,默认为64MB。
块的好处:
a、数据块的设计实际就是对文件进行分片,分片可以保存在集群的任意节点,从而使文件存储跨越了磁盘甚至机器的限制,如data.txt文件被切分为3个块,分别存放在3个不同机器的DataNode节点上。
b、容错性高:如果将dfs.relication设置成2,那么任意一个数据块损坏,之后的集群会将损坏的数据块的副本复制到集群中能正常工作的节点上,从而使副本数回到配置的水平。
(2)NameNode和SecondayNameNode
NameNode是HDFS的大脑,他维护着整个文件系统的的目录树。这些信息以两种文件存储在本地文件中。一种是命名空间镜像,一种是命名空间镜像编辑日志。
SecondayNameNode被称为第二节点,用于定期合并命名空间镜像和命名空间镜像的编辑日志的守护进程,合并的目的是更新目录树。如果由NameNode来做合并操作,那么NameNode在为集群提供服务时可能无法提供足够的资源,所以SecondayNameNode应运而生。每个HDFS集群都有一SecondayNameNode,可能部署在一台服务器上。
1.3 HDFS的容错机制
a、心跳机制:在NameNode和DataNode之间维持着心跳检测。当网络故障导致DataNode的新桃没有被NameNode正常收到时,Namenode不会将新的I/O操作派发个那个DataNode,该DataNode上的数据被认为是无效的。NameNode会检查是否有文件块的副本数小于设置值,如果小于就自动开始复制新的副本并分发到其他的DataNode节点。
b、检测文件块的校验和:当每个文件的所有块的校验和不正确时,会从其他的DataNode节点获取该块的副本。
1.4访问HDFS命令
命令 | 功能 | 例子 |
hadoop dfs -ls <path> | 列出文件或者目录内容 | hadoop dfs -ls / |
hadoop dfs -lsr <path> | 递归的列出目录内容 | hadoop dfs -lsr / |
hadoop dfs -count <path> | 显示path下的目录树及文件数 | hadoop dfs -count / |
hadoop dfs -mv <src> <dst> | 将hdfs上的文件移动到目的文件夹 | hadoop dfs -mv /user/hadoop/a.txt /user/test 将/user/hadoop下的a.txt文件移动到/user/test目录下 |
hadoop dfs -rm <path> | 将hdfs上路径为path的文件移动到回收站 | hadoop dfs -rm /test.txt |
hadoop dfsf -put <local> <dst> | 将本地文件上传到HDFS的<dst>目录下 | hadoop dfs -put /home/hadoop/test.txt /user/hadoop |
hadoop dfs -cat <src> | 浏览hdfs上<src>路径下的文件的内容 | hadoop dfs -cat /user/hadoop/test.txt |
hadoop dfs -mkdir <path> | 在hdfs上创建路径为path的目录 | hadoop dfs -mkdir /user/test |
hadoop dfs -touchz <path> | 创建一个路径为path的hdfs空文件 | hadoop dfs -touchz /user/hadoop/test |
hadoop dfs -chmod [-R] mode path | 改变hdfs上路径为path的文件的权限,-R选项表示递归执行此操作 | hadoop dfs -chmod -R +w /user/test.sh 将/user/test.sh赋予写的权限 |
hadoop dfs -chown [-R] [ower]:[group] path | 改变hdfs上路径为path的文件的所属用户和组别 | hadoop dfs -chown -R zhangsan:zhangsan /user/test.sh 将/user/test.sh所属的文件和组别改为张三 |