十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
好程序员大数据学习路线分享HDFS学习总结,HDFS介绍
创新互联专业为企业提供曾都网站建设、曾都做网站、曾都网站设计、曾都网站制作等企业网站建设、网页设计与制作、曾都企业网站模板建站服务,10年曾都做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
HDFS(Hadoop Distributed File System)是分布式文件系统,是Hadoop项目的核心子项目.
设计思想:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析。
HDFS的重要特性
1. HDFS中的文件在物理上是**分块存储**(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M
2. HDFS文件系统会给客户端提供一个**统一的抽象目录树**,客户端通过路径来访问文件
3. **目录结构及文件分块信息(元数据)**的管理由namenode节点承担
4. 文件的各个block的存储管理由datanode节点承担
5. HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改
HDFS的优点
1. 高可靠性
Hadoop按位存储和处理数据的能力强
2. 高扩展性
Hadoop是在可用的计算机集群中分配数据完成计算计算任务
3. 高效性
Hadoop能够在节点之间动态的移动数据,并保证每个节点的动态平衡
4. 高容错性
Hadoop能够自动保存的多个副本,并且能够自动将失败的任务重新分配
HDFS的缺点
1. 不适合低延迟访问,不能快速访问
HDFS是单Master的,所有的对文件的请求都要经过它,当请求多时,肯定会有延时。它适合高吞吐率的场景,就是在某一时间内写入大量的数据
2. 无法高效存储大量小文件
存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息(元数据)
3. 不支持多用户写入即任意修改文件
仅支持数据append(追加),不支持文件随意修改
针对HDFS缺点可能的改进措施
1. 多Master设计,正在研发中的GFS II也要改为分布式多Master设计,还支持Master的Failover,而且Block大小改为1M,有意要调优处理小文件。(Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。)
2. 使用缓存或多master设计可以降低client的数据请求压力,以减少延时。
3. 横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,形成一个大的Hadoop集群。google也是这么干过的。
HDFS的Shell命令
| **-help** 输出命令的手册 |
| :----------------------------------------------------------- |
| **-ls** 显示目录信息 `hadoop fs -ls hdfs://hadoop-server01:9000/` ps:这些参数中,所有的hdfs**路径都可以简写 -->`hadoop fs -ls /` 等同于上一条命令的效果|
| **-put** 向HDSF上传文件`hdfs dfs -put本地文件路径HDFS文件系统路径` *<易错:记 源路径→目的路径>* |
| **-get** 将HDFS文件系统中的文件下载回来 `hdfs dfs -get HDFS文件系统路径 本地文件系统路径` *<易错>* ps:HDFS有一个和put和get类似的而方法copyFromlocal相当于put和copyTolocal相当于get |
| **-cat** 查看HDFS文件系统中的文件内容 `hdfs dfs -cat HDFS文件系统中文件的路径` ps:不要查看非文件|
| **-cp** HDFS文件系统中进行复制操作 `hdfs dfs -cp源HDFS文件系统中的文件路径 目标HDFS文件系统中的路径` |
| **-mv** HDFS文件系统中的文件进行移动操作 `hdfs dfs -mv源HDFS文件系统中的文件路径 目标HDFS文件系统中的路径` ps: 将源文件移动目标路径,这个命令可允许有多个源路径,此时目标路径必须是一个文件夹(目录)不允许不同的文件系统互相移动文件|
| **-du** 查看HDFS文件系统中文件的大小 `hdfs dfs -du HDFS文件系统中路径中的一个文件` |
| **-mkdir** 在HDSF系统中创建文件夹mkdir创建文件夹 ps:递归创建+`-p` |
| **-rm** 删除HDFS文件系统中的目录或文件 `hdfs dfs -rm HDFS文件系统路径` `hdfs dfs -rm -r HDFS文件系统路径` ps: 只能是单个文件 或 空目录,若参数文件夹中有多个文件 加-r |
| **-chmod** 更改文件的权限 `hdfs dfs -chmod -R权限值HDFS文件系统路径下的文件夹` ps: 所有每三位可以作为一个八进制处理777是满权限rwx,+R之后, 文件夹下的所有子文件和文件夹都会被修改|
| **-appendTofile** 追加一个文件到已经存在文件的末尾`hadoop fs -appendTofile ./hello.txt /hello.txt` |
| **-getmerge** 合并下载多个文件`hadoop fs -getmerge /aaa/log.* ./log.sum` |
| **-df** 统计文件系统的可用空间信息`hadoop fs -df -h /` |
| |
HDFS的工作机制
在了解工作机制之前,我们先来看看几个重要角色:
NameNode
1. master,它是一个管理者,维护着整个文件系统的文件目录树
2. 储存数据库(Block)映射信息,保存元数据信息包括:文件的所属权,文件的权限,文件大小,时间(Block列表,Block偏移量),位置信息
3. 主要职责:处理客户端读写请求,收集DateNode汇报的Block列表信息<*不会保存到本地系统中*>
**DateNode**
1. Slave,它是一个从节点,简单理解就是NameNode的奴隶
2. 存储用户的文件块数据
3. 主要职责:定期向NameNode汇报自身所持有的block信息(心跳机制),执行数据块的读/写操作
Secondary NameNode
1. 检查点节点,表面上看SecondaryNameNode是NameNode的备份,实际上SecondaryNameNode的主要作用并不是备份
2. 主要职责:定期合并fsimage和edit log,并推送给NameNode
问题引入:一个已经 运行十年的集群,最近的fsimage(镜像)是NameNode十年前格式化产生,这么多年的操作日志被edit log(日志)记录已达几百T。那么问题来了,如果我要重启这个集群,这么大日志文件,必定要重启很久,我们的时间并不充裕该 如何解决这个问题?
*<问题提取:只要NameNode不格式化或重新启动,fsimage将保持原始状态,edits会不断的增加>*
此时我们引入Secondary NameNode, 把PN中的edit log 和fsimage在SN中merge,此时PN还会继续产生新的日志,记录合并和合并期间的操作,合并之后新fsimage会拷贝回PN中,循环上面的操作.以此能保持edit log文件处于比较小的状态,fsimage的时间点也不会太久远
**fsimage是如何产生的呢?**
HDFS系统要开始运行的时候需要先对NameNode进行一次格式化,那么第一次格式化就会产生一个fsimage文件,但是这个文件是个空文件,NameNode启动的时候会加载fsimage 然后执行edit log加载到内存中,然后立刻向磁盘中写一个新的fsimage文件,这个fsimage就是一个最新的储存信息
**紧急情况时,可以辅助恢复NameNode**
namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据
HDFS读写数据流程
HDFS读数据流程
简单版本
客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件