Hadoop之分布式文件系统,你了解吗?更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
HDFS
1.HDFS 入门
1.1 背景
面对各行各业日益增长的数据量,普通的机器无论在存储空间还是管理能力上都显得力不从心。既然单台机器的资源有限,那么增加机器的方式是否可行?答案是肯定的,于是乎出现了分布式的概念。分布式文件管理系统便可以将一堆机器组合在一起,并隐藏细节,让用户感觉与之前单机储存文件毫无差别,但其实文件是通过网络来访问的。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
1.2 简介
1) 官方称:HDFS可以运行在廉价的服务器上,为海量的数据存储提供了高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征。
2)HDFS基于开源的GFS开发实现。
3)HDFS的默认存储单位是数据块Block,默认数据块大小是64MB。文件存储时会分成一个个数据块,但是当一个小文件没达到数据块大小时,文件是多大就占用多大的空间。
4)NameNode称为元数据节点,管理保存所有的节点信息、文件信息等等。它的一些系统文件我们需要了解:edits保存了一些操作信息;fsimage是名字空间文件。
5) 数据节点DataNode是存储数据的地方,一个文件会被分成若干个数据块储存在对应的数据节点上。数据节点的系统文件:以blk_开头无后缀的文件保存的就是数据块,以blk_开头以.meta结尾的文件则保存对应数据块的属性信息,subdir开头的目录保存的也是数据块相关信息(数据块太多了,就一起放在这种目录下)。
6) 从元数据节点Secondary Name Node虽然名字中有个「从」字,但并非是备份,而是与Name Node各司其职,它主要的作用是隔一段时间合并一下日志文件等,并帮助Name Node将内存中的元数据信息checkpoint到硬盘上。
checkpoint即检查点,保存某一刻内存数据到硬盘的文件中。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
1.3 优点
1) 可以处理超大文件(MB到TB级别)
2) 对于服务器要求不高,Hadoop集群可部署在廉价的机器上节约项目成本,因为它的多副本,使你不必担心宕机等意外事故带来的影响。
3) 一次写入,多次读取。
4) 现在还支持对已有文件追加内容。
1.4 缺点
1) 不适合低延迟数据访问,即访问数据时间可能会长一些。
2) 不适合存储大量小文件。因为存储一个文件,其元数据会保存在NameNode中,而NameNode的内存决定了HDFS储存文件的上限,大量小文件会耗费资源。
文件存储后,其元数据(文件的相关信息,如创建日期,文件大小,存储路径等等)会保存在
NameNode中。一个小文件和一个大文件的元数据大小是差不多的,元数据存储满后,不再接受文件存储。如果存储大量的小文件,会导致存储空间上的浪费,还会增加NameNode的压力,从而影响集群性能。可以采用Sequence File等方式对小文件进行合并,或者使用Name Node Federation的方式改善。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
1.5 设计目标
1) 集群中管理数量庞大的服务器,如何做到错误检测,快速、自动恢复是核心目标。
2) 需要高数据传输带宽,保证支撑数以千万计的文件。
3) 需要支持大文件存储。
4) 移动计算而非移动数据。
1.6 架构
1)HDFS采用master/slave架构。
2) 一个HDFS集群由一个NameNode和一些DataNode组成,NameNode相当于控制中心,负责管理文件系统的名字空间、数据块与数据节点的映射以及数据节点的调度。DataNode则负责处理实际的客户端读写的请求,存储数据。
2.HDFS 基本操作
2.1 HDFS shell
先启动
Hadoop才能使用
1) 列出文件目录,同ls:
hadoop fs -ls 目录路径
递归的查看文件可以使用
-R参数# 列出 /data 下的所有文件hadoop fs -ls -R /data
2) 在HDFS中创建文件夹
hadoop fs -mkdir 文件夹名称
如果想嵌套(级联)的创建目录,可以使用
-p参数
3) 上传文件到HDFS
hadoop fs -put 本地文件路径 HDFS文件路径
4) 从HDFS上下载文件
hadoop fs -get HDFS文件路径 本地路径
5) 查看HDFS上某个文件内容
hadoop fs -cat HDFS上文件路径
6) 统计目录下各文件的大小
hadoop fs -du 目录路径
7) 删除HDFS上某个文件或文件夹
hadoop fs -rm 文件hadoop fs -rmdir 文件夹
8) 帮助命令
hadoop fs -help 命令
3.HDFS 运行原理
3.1 读流程
客户端通过RPC调用NameNode的相关方法,如果客户端身份验证成功,会获取到要读取的文件对应的数据块保存在哪些DataNode上;客户端向DataNode发起读取的请求,获取数据(客户端读取的是连续的流,但实际过程是先到最近的DataNode读取数据,读取完之后连接关闭,再去读取下一个DataNode上的数据块);当所有的数据读取完成后,资源关闭。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
3.2 写流程
客户端向NameNode发起RPC请求创建文件,NameNode验证用户权限、检测文件是否存在,最终创建一条元数据信息,然后客户端开始向DataNode保存数据,进行切分并完成第一个副本的创建,再将其复制到其他的节点上,直到所有的节点完成后,关闭连接。
3.3 副本
HDFS上文件对应的数据块保存有多个副本,并为其提供容错机制,当副本丢失或者宕机时,能够快速自动恢复。但是要注意,我们需要对副本系数进行设置,而且此系数一经写入,不可更改。
3.3.1 摆放策略
第一个副本放置在上传文件的Data Node上,如果是在集群外提交,则根据磁盘速度以及CPU效率选取一个节点。
第二个副本放在与第一个副本不同机架的节点上。
第三个副本放在与第二个副本相同机架的不同节点上。
更多的副本就随机放在节点中。
3.4 负载均衡
1) 如果某个DataNode上空闲空间低于临界点,按照负载均衡策略,系统会自动将数据转移到其他空闲的DataNode上。
2) 如果对某个文件的请求突然增加,有可能启动一个计划来创建该文件新的副本,最后再重新平衡集群中其他数据。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
3)HDFS会调整存储分布以均衡IO性能,平衡IO负载,平均数据,平衡集群。
4)Hadoop的bin/start-balancer.sh脚本可以启动均衡服务。使用-threshold参数设置判断集群是否平衡的阈值;使用hdfs-site.xml文件中的dfs.balance.bandwidth设置Balancer运行时允许占用的带宽。
4.HDFS 高级知识
4.1 序列化机制
1) 序列化:将对象转化为字节流,以便在网络上传输或者写在磁盘上持久化存储。
2) 反序列化:将字节流转回成对象。
3)Hadoop中多个节点进程间通讯是通过RPC完成的,所以需要序列化机制。
4)Hadoop序列化中,用户可以复用对象,减少了java对象的分配和回收,提高应用效率。
4.2 Sequence File
4.2.1 概述
前面我们介绍过,当HDFS中保存有大量的小文件时,NameNode压力会很大,使得存储的元数据信息非常多,而Sequence File则可以将小文件合并。
1)Sequence File是Hadoop提供的一种对二进制文件的支持。
2) 二进制文件直接将键值对序列化到文件中。
3) 使用Sequence File进行存储的文件,占用空间会大于原数据,因为为了查找方便,Sequence File的存储中添加了一些额外的信息,使得数据增大。
4.2.2 特点
1) 支持压缩。分为基于Record和Block压缩,前一种只压缩值不压缩键,后一种则是键和值都压缩。默认为无压缩,每个记录(Record)是由它的记录长度(字节数)、键的长度、键和值组成。
2) 对于MapReduce任务十分友好,因为文件可以被切分,使用Map Task并行处理可大幅提高作业的执行效率。
3) 使用简单,因为Hadoop提供了API,业务逻辑中应用便捷。
4.3 Map File
Map File是排序过的Sequence File,由index和data两部分组成。index是文件的数据索引,主要记录了每个Record的key值以及该Record在文件中的偏移位置。在Map File被访问的时候,索引文件会先被加载到内存,通过index映射关系可快速定位到指定Record所在文件位置。所以Map File比Sequence File检索效率更高,缺点便是维护多余的index数据,占用了部分内存。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
学习自《基于Hadoop与Spark的大数据开发实战》
排版:小闫
图片素材:小闫
文案:小闫
长按扫描下方二维码即刻关注小闫



原文始发于微信公众号(全栈技术精选):Hadoop学习笔记(二)之HDFS