1. HDFS概述
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统 。
HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目. Hadoop 非常适于存储大型数据 (比如 TB 和 PB), 其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统.
2. HDFS应用场景
2.1 适合的应用场景
1)存储非常大的文件:这里非常大指的是几百M、G、或者TB级别,需要高吞吐量,对延时没有要求。
2)采用流式的数据访问方式: 即一次写入、多次读取,数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 。
3)运行于商业硬件上: Hadoop不需要特别贵的机器,可运行于普通廉价机器,可以处节约成本
4)需要高容错性
5)为数据存储提供所需的扩展能力
2.2 不适合的应用场景
1) 低延时的数据访问 对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时
2) 大量小文件 文件的元数据保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。 经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持。
3) 多方读写,需要任意的文件修改 HDFS采用追加(append-only)的方式写入数据。不支持文件任意o set的修改。不支持多个写入器(writer)
3. HDFS 的架构
HDFS是一个 主/从(Mater/Slave)体系结构 ,
HDFS由四部分组成,HDFS Client 、NameNode、DataNode和Secondary NameNode
1、Client:就是客户端
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。
2、NameNode:就是 master,它是一个主管、管理者。
管理 HDFS 的名称空间
管理数据块(Block)映射信息
配置副本策略
处理客户端读写请求。
3、DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。
存储实际的数据块。
执行数据块的读/写操作。
4、Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务
辅助 NameNode,分担其工作量。
定期合并 fsimage和fsedits,并推送给NameNode。在紧急情况下,可辅助恢复 NameNode。
4:NameNode和DataNode
4.1 NameNode作用
NameNode在内存中保存着整个文件系统的名称 空间和文件数据块的地址映射整个HDFS可存储的文件数受限于NameNode的内存大小
1、NameNode元数据信息 文件名,文件目录结构,文件属性(生成时间,副本数,权限)每个文件的块列表。 以及列表中的块与块所在的DataNode之间的地址映射关系 在内存中加载文件系统中每个文件和每个数据块的引用关系(文件、block、datanode之间的映射信息) 数据会定期保存到本地磁盘(fsImage文件和edits文件)
2、NameNode文件操作 NameNode负责文件元数据的操作 DataNode负责处理文件内容的读写请求,数据流不经过NameNode,会询问它跟那个DataNode联系
3、NameNode副本 文件数据块到底存放到哪些DataNode上,是由NameNode决定的,NN根据全局情况做出放置副本的决定
4、NameNode心跳机制 全权管理数据块的复制,周期性的接受心跳和块的状态报告信息(包含该DataNode上所有数据块的列表) 若接受到心跳信息,NameNode认为DataNode工作正常,如果在10分钟后还接受到不到DN的心跳,那么NameNode认为DataNode已经宕机 ,这时候NN准备要把DN上的数据块进行重新的复制。 块的状态报告包含了一个DN上所有数据块的列表,blocks report 每个1小时发送一次.
4.2 DataNode作用
提供真实文件数据的存储服务。
1、Data Node以数据块的形式存储HDFS文件
2、Data Node 响应HDFS 客户端读写请求
3、Data Node 周期性向NameNode汇报心跳信息
4、Data Node 周期性向NameNode汇报数据块信息
5、Data Node 周期性向NameNode汇报缓存数据块信息
4.3 机架感知
HDFS分布式文件系统的内部有一个副本存放策略:以默认的副本数=3为例:
1、第一个副本块存本机
2、第二个副本块存跟本机同机架内的其他服务器节点
3、第三个副本块存不同机架的一个服务器节点上
5、HDFS的shell命令
首先CM的hadoop会有下面两个错误
错误一
hdfs dfs -mkdir -p /aa/bb
Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
执行命令的用户没有执行权限。直接给当前用户授权。(这种想法是不正确的,不要为了简化输入命令,就试图修改这些东西)正确的做法应该是。切换指定用户执行命令
[root@cdh1 data]#sudo -u hdfs hadoop fs -mkdir /newFile
或者
[root@cdh1 data]#sudo -u hdfs dfhs dfs -mkdir /newFile
更简单的是,先进入这个用户,su hdfs
错误二
sudo -u hdfs hdfs dfs -mkdir -p /aa/bb
Error: JAVA_HOME is not set and could not be found.
java -version
java version “1.8.0_91”
确实已经设置了JAVA_HOME ,而且在linux shell 执行 echo $JAVA_HOME 也是有输出。
解决办法:
建立一个已经有的JAVA_HOME 链接到 /usr/java/jdk1.8 就好了!
目标位置:/usr/java/jdk1.8
原文件:/export/service/jdk1.8.0_144
ln -s 源文件 目标文件
mkdir /usr/java/jdk1.8
ln -s /export/service/jdk1.8.0_144 /usr/java/jdk1.8
sudo -u hdfs hdfs dfs -mkdir -p /flume/mysql
hdfs的命令行使用(dest代表hdfs、是本地系统)
ls
格式:sudo -u hdfs hdfs dfs -ls URI <dest>
作用:类似于Linux的ls命令,显示文件列表
ls -r
格式:sudo -u hdfs hdfs dfs -ls -r URI <dest>
作用:在整个目录下递归执行ls, 与UNIX中的ls -r类似
mkdir
格式:sudo -u hdfs hdfs dfs [-p] -mkdir <paths>
作用:以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录
put
格式:sudo -u hdfs hdfs dfs -put <localsrc > ... <dest>
作用:将单个的源文件src或者多个源文件srcs从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中
hdfs dfs -put /root/a.txt /dir1
moveFromLocal(与之对应一个moveToLocal但是该命令未实现)
格式:sudo -u hdfs hdfs dfs -moveFromLocal <localdst> <dest>(首写字母一定要大写)
作用: 和put命令类似,但是源文件localsrc拷贝之后自身被删除
get
格式:sudo -u hdfs hdfs dfs -get [-ignorecrc ] [-crc] <dest> <localdst>
作用:将文件拷贝到本地文件系统。 CRC 校验失败的文件通过-ignorecrc选项拷贝。 文件和CRC校验和可以通过-CRC选项拷贝
mv
格式: sudo -u hdfs hdfs dfs -mv URI <dest>
作用: 将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能夸文件系统
rm
sudo -u hdfs hdfs dfs -mv /dir1/a.txt /dir2
格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】
作用: 删除参数指定的文件,参数可以有多个。 此命令只删除文件和非空目录。
如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。
cp
格式:sudo -u hdfs hdfs hdfs dfs -cp URI [URI ...] <dest>
作用:将文件拷贝到目标路径中。如果<dest> 为目录的话,可以将多个文件拷贝到该目录
-f
选项将覆盖目标,如果它已经存在。
-p
选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)
cat
格式: sudo -u hdfs hdfs hdfs dfs -cat URI <dest>
作用: 将参数所指示的文件内容输出到控制台
chmod
格式:sudo -u hdfs hdfs dfs -chmod [-R] URI <dest>
作用:改变文件权限。如果使用 -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户
chown
格式: sudo -u hdfs hdfs dfs -chmod [-R] URI <dest>
作用:变文件的所属用户和用户组。如果使用 -R 选项,则对整个目录有效递归执行。使用这一命令的用户必须是文件的所属用户,或者超级用户。
appendToFile
格式:sudo -u hdfs hdfs dfs -appendToFile <localsrc> ... <dst>
作用: 追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入.
getmerge
格式:sudo -u hdfs hdfs dfs -getmerge /config/*.xml ./hello.xml
作用:将很多的 hdfs 文件合并成一个大文件
hdfs的高级使用命令
HDFS文件限额配置
在多人共用HDFS的环境下,配置设置非常重要。特别是在Hadoop处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。Hdfs的配额设定是针对目录而不是针对账号,可以 让每个账号仅操作某一个目录,然后对目录设置配置。
hdfs文件的限额配置允许我们以文件个数,或者文件大小来限制我们在某个目录下上传的文件数量或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量。
sudo <