hdfs:hadoop distributed file system分布式文件系统
一、设计思想
1.分块存储
举个例子,如有有100T文件,存在3个节点,怎么存?100T存在一个节点上吗?直接存储在一台机器上 合理吗?不合理!负载不均衡。我们可以将100T分成多个部分进行存储,分块存储。
每个部分(块)应该分很多合适?1T,如果文件只有2T,分成2个块,还是负载不均衡!
如果块太大不合适,负载会不均衡。
块大小1kb合适吗?也不合适。元数据存储的时候,一个块会存储一条元数据,这样会导致需要存很多元数据。namenode的压力会很大。
hadoop中已经对块做了设计:hadoop1:块大小默认64M ;hadoop2:块大小默认是128M;
在参数设置里有:
dfs.blocksize 134217728 128M
说到这里,我们来看一下集群中的配置:
集群中的所有的配置如果没有进行配置则使用默认配置:
例如我的配置在:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/目录下的jar包中:
core-default.xml
hdfs-default.xml
yarn-default.xml
mapred-default.xml
想要修改默认块大小,只需要修改这个参数:
hdfs-site.xml文件中:
<property>
<name>dfs.blocksize</name>
<value>46472828</value>
</property>
如有自己进行配置了,则会覆盖原始的默认配置
再来看一下具体的存储,按照系统默认设置,如果有一个文件300M,则需要分成几块3块(300/128)
块1:0-127
块2:128-255
块3:256-300M 44M 不满128M 仍然会单独成一个块 块的实际大小44M
如果又来一个文件有150M,是接着上一个的存,还是自己独立存储?
答:自己独立进行存
块4:0-127
块5:128-150
所以如果文件存储完了,块不够128M 就按照实际的进行存储,单独存一个块。一个单独的文件即使只有1kb也占一个块。
2. 备份存储—-副本机制
副本是什么?
副本相当于是备份,完全复制出来的,文件完全一样。
在hdfs中数据块的存储是采用多副本存储的
各个副本之间没有主次之分,多个副本之间是相互互为副本,地位一样的。这里副本的个数也就是文件的总份数。例如副本数量为3,也就是这个文件的在集群中的总数量是3。
hadoop集群中默认存储的副本个数:3。
副本配置参数:
dfs.replication 3
一个块这里配置了几个副本 就会复制几份出来
1)如果配置了副本,则会覆盖默认的副本数量
如果只有3个节点,副本有2个,则每一个块会被存2份。假设有一个块损坏了,剩下1个,这个时候hdfs会进行复制,达到块的个数2。假设复制完了,刚才的损坏的块又恢复了,块的个数变为3 ,这个时候块多1个,namenode在一定的时间内如果发现还是3个块,则会删除一个块,最终达到2个块。
2)同一个块多副本如何存储:
多副本存在一个节点上有没有意义?没有意义,因为如果机器宕机所有副本都没有了。所以每个副本存储在不同的节点上,任何两个副本都不可能存储在相同的节点上。也就是说每一个节点上只能存储同一个块的一个副本,一个节点上可以存多个块,但是这些块都是不同的块。
3)如果节点2个,副本4个怎么存储?
实际存储的时候会存储2个,集群会进行记账,欠2个副本,当集群中的节点个数增加的时候会进行复制,最终复制到4个。
4)副本个数越多越好吗?
副本个数越多数据安全性越高,但是数据维护起来越困难,成本加大。hdfs底层用空间换取数据安全的,因为目前硬件成本相对于数据价值来说是比较低的。
二、hdfs主要架构
namenode的作用一:存储元数据元数据记录了—-抽象目录树:hdfs是一个文件系统 类似于linux根目录/(所有集群共同存储的根目录,不指某一台机器的根目录)
这里的抽象目录树指的是hdfs上的文件目录结构对于用户是看不到底层的一个个节点的,他们看到的是一个抽象出来的目录树。
元数据记录了—-数据和块的映射关系
Block ID: 1073741825,这个参数是全局、(整个hdfs集群)唯一的,是块的标识,每一个块都有自己唯一的id。
Block Pool ID: BP-54673466-192.168.40.201-1531445892504,这个参数是集群的块池,一个namenode只对应一个块池
Generation Stamp: 1001
Size: 134217728 128M
映射关系如:
hadoop-2.7.6.tar.gz
blk_1073741825
blk_1073741826
元数据记录了—- 数据块的存储位置
Availability,这个参数记录数据块的存储位置
hadoop02
hadoop01
元数据的位置:
/home/hadoop/data/hadoopdata/name/current的目录下:
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/data</value>
<description>datanode 的数据存储目录</description>
</property>
namenode的作用二:接收客户端的读写请求
datanode的作用一:负责真正的数据存储
存储的路是在配置文件中写好的,例如我的:
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/data</value>
<description>datanode 的数据存储目录</description>
</property>
实际路径在:home/hadoop/data/hadoopdata/data/current/BP-54673466-192.168.40.201-1531445892504/current/finalized/subdir0/subdir0下会:
blk_1073741825 blk_1073741826
datanode的作用二:负责处理客户端的真正读(下载)写(上传)请求
secondarynamenode:是namenode的备份节点 (冷备份)
帮助namenode进行元数据备份;帮namenode做一些工作,减轻nanenode压力
hdfs优缺点
优点
(1)成本低,在普通的廉价机上就可以使用。以硬件故障作为常态
(2)高容错性,一个机器宕机的时候不影响数据的访问
(3)适合批量数据访问:适合离线数据访问
(4)适合大数据访问
(5)流式访问:一次写入,多次读取。不支持修改,修改的成本太高
缺点
(1)不支持低延迟的数据访问,不支持实时的数据访问
(2)不擅长存储小文件(大量的小文件)
寻址时间过长: 在进行数据访问的时候先访问元数据,如果存储了大量的小文件,会花费很长的时间在元数据检索上
namenode的压力过大:底层元数据存储的时候是一个块存储一条元数据,一条元数据大概是150byte,会造成namenode中存储大量的元数据信息,增加namenode的压力
不支持文件内容修改,但是支持对文件内容追加(不建议使用)
三、hdfs的使用
1.脚本方式(使用广泛)
命令
文件上传的命令:hadoop fs -put 本地文件 hdfs路径
查看文件的命令:hadoop fs -ls 路径
启动hadoop的客户端:hadoop fs
hadoop/hdfs:hadoop namemode -format
fs:run a generic filesystem user client
将本地文件追加到hdfs的指定的文件上 ,追加到末尾,不建议使用:-appendToFile aa.txt /yy
查看文件的命令:hadoop fs -cat /hadoop-2.7.6.tar.gz
hadoop fs -checksum /yy
修改文件夹权限:hadoop fs -chmod 777 /yy
修改文件所属用户:chown
本地文件上传到hdfs的根目录:hadoop fs -copyFromLocal aa.txt /
新建文件 空文件:hadoop fs -touchz /yy
删除空文件夹:hadoop fs -rmdir /aa/bb/cc
删除文件:hadoop fs -rm -r -f /aa
-r|R递归删除
-f force 强制删除
从hdfs下载文件到本地:hadoop fs -copyToLocal /yy ./
计数统计:hadoop fs -count /aa
5 3 216983315 /
目录的个数 文件的个数 大小
1
2
把hdfs中aa.txt文件复制到/aa下:hadoop fs -cp /aa.txt /aa
查看磁盘占有率:hadoop fs -df -h
查看指定路径的磁盘占有:hadoop fs -du -h /
文件下载: hadoop fs -get /yy ./
显示末尾的 显示末尾1kb的数据:hadoop fs -tail /aa.txt
调整文件或目录的副本个数的:hadoop fs -setrep 4 /hadoop.tar.gz
-w wait,等待复制完成
-R 修改目录的时候代表递归修改其下面的所有文件的副本个数
`
hadoop fs -setrep -w 4 -R /aa
- 以文本方式显示 zip 、jar :
- 显示末尾的 显示末尾1kb的数据hadoop fs -tail /aa.txt
2.api方式
用得较少,不赘述