概述
HDFS即Hadoop分布式文件系统。源自GFS论文。
有以下特点:
1、高容错性的分布式文件系统。
2、可构建在廉价机器上,通过多副本机制,提高可靠性。
3、易扩展、为用户提供性能不错的文件存储服务。
缺点:
1、不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
2、无法高效的对大量小文件进行存储。
3、不支持并发写入,不支持文件的随机修改(仅支持append)
HDFS为什么不适合存储小文件?
1、HDFS中存储的数据的元数据信息会加载到NameNode的内存中,每个块大概占用内存中的150字节,存储大量小文件的话,它会占用NameNode大量的内存。因为NameNode的内存是有限的, 所以这样容易挤爆NameNode。
2、一般来说,NN会不断跟踪并检查每个数据块的存储位置(通过DN的心跳信息)。数据节点需要上报的block越多,则也会消耗越多的网络带宽/时延。
3、小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
解决方法: 合并小文件(合并后大小最好接近并小于等于块大小)
块(block)
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,1.x中是64M。块的副本数是根据参数(dfs.replication)来规定的。
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。
假一个文件260M,块大小为128,副本系数为3,则应有 3 * 3 个块,实际占用的空间为260M * 3 。
注:当一个4M的文件存在128M的块中时,实际占用的空间是4M。
HDFS架构
这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。其中Rack代表机架。
1)Client:客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
(2)与NameNode交互,获取文件的元数据信息;
(3)与DataNode交互,读取或者写入数据;
(4)Client提供一些命令来管理HDFS,比如启动、关闭、访问HDFS;
2)NameNode:NN 。管理者(老大),管理文件系统的命名空间。
(1)管理 文件名称、文件目录结构、文件属性、创建时间、权限、副本数、块ID等;
注:上述信息会以fsimage、editlog的方式持久化在硬盘上,启动时加载到内存中。
(2)管理 数据块对应哪些datanode节点上;
注: NN不会持久化存储以上这种映射关系,DN定期发送blockReport给NN,NN在内存中动态维护这种映射关系。
(3)处理客户端读写请求。
3) DataNode:DN。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块和数据块的校验和(判断该数据块是否损坏);
(2)每隔3秒发送一次心跳,每10次心跳发送一次当前节点的blockreport。
(3)执行数据块的读/写操作。
4) Secondary NameNode:SNN。NN的冷备份。
(1)辅助NameNode,分担其工作量;
(2)定期合并Fsimage和Edits为新的fsimage文件,并推送给NameNode;(checkpoint机制)
参数:dfs.namenode.checkpoint.period 3600s (默认一小时备份一次。不可靠)
(3)在紧急情况下,可辅助恢复NameNode(不能马上替换)。
HDFS常用命令
1、ls
hdfs dfs -ls /:查看hdfs中根目录/下的所有文件
hdfs dfs -ls -R /:递归查看目录/下所有文件与文件夹
2、put:从本地传文件去hdfs(与copyFromLocal类似)
hdfs dfs -put [文件名] [hdfs目录]
(hdfs dfs -put hello.txt / 即把hello.txt放在hdfs中的/下)
(hdfs dfs -copyFromLocal hello.txt /text/h.txt 即把hello.txt放在hdfs中的/text下,并改名为h.txt)
3、查看文件内容:text或者cat
hdfs dfs -cat /hello.txt
4、mkdir:创建一个目录
hdfs dfs -mkdir /text
hdfs dfs -mkdir -p /text/a/b (创建递归文件夹)
5、get:从hdfs中取得文件(类似于copyToLocal)
hdfs dfs -get /text/a/b/h.txt (取得hdfs中的h.txt)
6、rm:删除文件
删除文件夹: -rm -R