好程序员大数据学习路线分享HDFS学习总结

好程序员大数据学习路线分享HDFS学习总结HDFS介绍

 

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设计,还支持MasterFailover,而且Block大小改为1M,有意要调优处理小文件。(Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。)

2.  使用缓存或多master设计可以降低client的数据请求压力,以减少延时。

3. 横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,形成一个大的Hadoop集群。google也是这么干过的。

 

HDFSShell命令

 

| **-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文件系统路径 本地文件系统路径`      *<易错>*  psHDFS有一个和putget类似的而方法 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. 检查点节点,表面上看SecondaryNameNodeNameNode的备份,实际上SecondaryNameNode的主要作用并不是备份

2. 主要职责:定期合并fsimageedit log ,并推送给NameNode

 

问题引入:一个已经 运行十年的集群,最近的fsimage(镜像)是NameNode十年前格式化产生,这么多年的操作日志被edit log(日志)记录已达几百T。那么问题来了,如果我要重启这个集群,这么大日志文件,必定要重启很久,我们的时间并不充裕该 如何解决这个问题?

 

*<问题提取:只要NameNode不格式化或重新启动,fsimage将保持原始状态,edits会不断的增加 >*

 

此时我们引入Secondary NameNode, 把PN中的edit log fsimageSNmerge,此时PN还会继续产生新的日志,记录合并和合并期间的操作,合并之后新fsimage会拷贝回PN,循环上面的操作.以此能保持edit log文件处于比较小的状态,fsimage的时间点也不会太久远

 

**fsimage是如何产生的呢?**

 

HDFS系统要开始运行的时候需要先对NameNode进行一次格式化,那么第一次格式化就会产生一个fsimage文件,但是这个文件是个空文件,NameNode启动的时候会加载fsimage 然后执行edit log加载到内存中,然后立刻向磁盘中写一个新的fsimage文件,这个fsimage就是一个最新的储存信息

 

**紧急情况时,可以辅助恢复NameNode**

 

namenodesecondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据

 

HDFS读写数据流程

 

HDFS读数据流程

 

简单版本

 

客户端将要读取的文件路径发送给namenodenamenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件


猜你喜欢

转载自blog.51cto.com/14479068/2431084