目录
hdfs概述
分布式文件系统
跨机存储,统一管理(提供统一的访问接口)像普通文件系统一样使用分布式文件系统
应用场景
1、存储非常大的文件,几百m、g、TB,需要高吞吐量,对延时没有要求
2、流式数据访问:一次写入多次读取,数据集经常从数据源生成或拷贝一次,然后在其上做很多分析工作
3、每台主机不必太贵,节约成本
4、容错率高
5、扩展性强
不适合的场景
1、低延时的数据访问(毫秒级),为了大吞吐可能牺牲延时
2、大量小文件,因为元数据保存在NameNode的内存中,整个文件系统的文件数量受限于NameNode内存大小,经验上一个文件/目录/文件块一般占有150字节的内存空间,100万文件就是300m,数10亿级则难以支持
3、多放读写,需要任意的文件修改HDFS采用追加的方式写入,不支持文件任意offset(偏移量)的修改。不支持多个写入器
架构
由4部分组成
1、HDFS Client
文件切分,Client将文件切分成一个个的Block进行存储
与NameNode交互,获取文件位置信息
与DataNode交互,读取或写入数据
2、NameNode 就是master一个主管、管理者
管理HDFS的命名空间
管理数据块(Block)映射信息
配置副本策略
处理客户端读写请求
3、DataNode:就是slave NameNode下达命令,DataNode执行实际操作
存储实际的数据块
执行数据的读/写操作
4、Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务,只是个辅助作用
辅助NameNode,分担其工作量
定期合并fsimage和fsedits并推送给NameNode
在紧急情况下,可辅助恢复NameNode
NameNode与DataNode的作用
保存着整个文件系统的名称 空间和数据块的地址映射
整个HDFS可存储文件数量受限于NameNode内存的大小
当NameNode重启时内存中的数据不就没了?
NameNode的持久化机制
定期将元数据保存在两个文件中:fsimage(镜像文件)、edits(日志文件)
1、NameNode元数据信息
2、NameNode文件操作
3、NameNode副本
4、NameNode心跳机制
DataNode:
提供真实文件数据的存储服务
1、DataNode以数据块形式存储HDFS文件
2、响应HDFS客户端读写请求
3、周期性向NameNode汇报心跳信息
4、周期性向NameNode汇报数据块信息
5、周期性向NameNode汇报缓存数据块信息(为了提高访问速度会进行块缓存放入内存中)
hdfs的副本机制与机架感知
副本
由之前的hdfs配置文件定义
<!-- 文件切片的副本个数-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 设置一个文件切片的大小:128M-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
机架感知:存数据时会看看在不在同一个机架
前两个副本在同一个机甲,在同一个机架读写会快一些
第三个副本防止前一个机架宕机
hdfs的命令行使用
命令开头都是hdfs dfs
1、hdfs dfs -ls URI
类似于ls命令显示文件列表
例:显示根目录
hdfs dfs -ls
2、-ls -R 递归显示
3、mkdir创建一个目录 -p递归创建
4、put可以上传文件也可以上传文件夹
格式-put <localsrc>(本地路径) …<dst>(目的路径)
5、moveFromLocal
从本地上传的HDFS,但是源文件会被删除
-moveFromLocal <localsrc>(本地路径) …<dst>(目的路径)
6、moveToLocal
还未实现
7、get
格式:-get [-ignorecrc](忽略CRC校验) [-crc](使用CRC校验) <src> <localdst>
还可以在web中操作
8、mv
格式:-mv URI <dest>
作用:将hdfs上的文件从原路径移动到目标路径(移动后文件删除),注意不能跨文件系统(不能本地到hdfs)
9、rm
格式 -rm [-r] [-skipTrash](跳过回收站) URI [URI…]
作用:删除参数指定的文件,可以有多个,只删除文件和非空目录
不用skipTrash就会放入回收站
删目录要加-r
回收站会在第一次执行删除命令后创建
10、cp
格式:-cp RUI [URL…] <dest>
将文件拷贝到目标路径,如果<dest> 为目录的话,可以将多个文件拷贝到该目录下
-f 若存在就覆盖
-p 深度拷贝:保留文件的属性(时间戳、所有权、许可、ACL、XAttr)
11、-cat URI [URI…]
作用:将参数所指示的文件内容输出到stdout
12、-chmod [-R] URI[URI…]
作用:改变文件权限 -R选项对整个目录递归修改
使用这一命令的用户必须是文件的所属用户,或者超级用户
13、-chown [-R] URI[URI…]
作用:改变文件的所属用户和用户组(linux下的用户与用户组),-R递归
使用者是文件所属用户或超级用户
例子:hdfs dfs -chown -R hadoop:hadoop /install.log
将这个文件所属改为hadoop组的hadoop用户
14、-appendToFile <localsrc> (注意是本地目录)….<dst>
作用:追加一个或者多个文件到hdfs指定文件中,也可以从命令行输入
例子:
补充:查看文件分片信息
hdfs dfs 路径 -files -blocks locations
hdfs的高级使用命令
一、HDFS限额配置
作用限制用户的存储额度
1、查看配额信息
-count -q -h
示例:查看这个文件的限额
hdfs dfs -count -q -h /user/root/dir
这么写也可以hdfs dfs -count -q -h dir
因为默认命令路径就是/user/root
修改限额
2、数量限额
hdfs dfsadmin -setQuota 2 dir 给该文件夹下面设置最多上传两个文件,发现只能上传一个文件,因为该目录也算一个所以只能放n-1
修改后在查,就变了
如果上传了大于1个文件则会报错
-clrQuota /user/root/dir 清除文件数量限制
3、空间大小限额
在设置空间配额时,设置的空间至少是block_size*n大小,n代表副本数
dfsadmin -setSpaceQuota 4k /user/root/dir
注意我们这是的block_size是128m当我们设置的大小是4k,当放入一个非常小的文件时
报错,这个文件再小也会被分作一个block
这里我们设置的副本数是2,所以会报256m,一般副本数设置为奇数,方便纠错
清除空间限额
dfsadmin -clrSpaceQuota /user/root/dir2
例题:
现在假设有个文件大小为129m,副本数为3,现要装入这个文件,限额要配多少?
128*2*3=768m
129m多出来的1m也要占一个block
这里有个命令,可以生成指定大小的文件
dd if=/dev/zero of=1.txt bs=129M count=1
这个命令在当前目录生成了一个指定大小的文件
可以测试上面的例子
二、hdfs的安全模式
是一种保护机制,保证集群中的数据块的安全性,集群启动时,会首先进入安全模式,检查数据的完整性
会检查副本率(检查每个block的副本是否完整)
副本率=实际副本数/设置的副本数
假设现在,设置3个副本,启动只有两个
则2/3=0.66667…
hdfs默认副本率是0.999
显然达不到,只有副本率>0.999才完整
不完整就会到其他机器上拷贝一份,放在对应主机上
我们可以去官方文档看这个默认副本率
http://hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
ctrl+f搜safemode
这个是完整性检测后安全模式持续时间30s
安全模式下只能读,不能删改
当整系统达到安全标准时,HDFS自动离开安全模式
操作命令
dfsadmin -safemode get 查看安全模式状态
网页上也可以看
enter是进入安全模式
leave关闭安全模式