Hadoop HDFS分布式文件系统怎么理解


本篇内容介绍了“Hadoop HDFS分布式文件系统怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪一种,需要看我们具体的实现类,在我们实际工作中,用到的最多的就是HDFS(分布式文件系统)以及LocalFileSystem(本地文件系统)了。在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统。HDFS(Hadoop Distributed File System)是 Hadoop 项目的一个子项目。是 Hadoop 的核心组件之一, Hadoop 非常适于存储大型数据 (比如 TB 和 PB),其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件,并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。HDFS文件系统HDFS是一个主/从(Mater/Slave)体系结构,由三部分组成: NameNodeDataNode 以及 SecondaryNamenode:NameNode 负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个 DataNode 上存储多个副本,默认为3个。Secondary NameNode 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。最主要作用是辅助 NameNode 管理元数据信息。首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。1. master/slave 架构(主从架构)HDFS 采用 master/slave 架构。一般一个 HDFS 集群是有一个 Namenode 和一定数目的 Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。2. 分块存储HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在 hadoop2.x 版本中是 128M。3. 名字空间(NameSpace)HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。4. NameNode 元数据管理我们把目录结构及文件分块位置信息叫做元数据。NameNode 负责维护整个 HDFS 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的 id,及所在的 DataNode 服务器)。5. DataNode 数据存储文件的各个 block 的具体存储管理由 DataNode 节点承担。每一个 block 都可以在多个 DataNode 上。DataNode 需要定时向 NameNode 汇报自己持有的 block 信息。 存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)6. 副本机制为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。7. 一次写入,多次读出HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。
正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为修改不方便,延迟大,网络开销大,成本太高。如果没有配置 hadoop 的环境变量,则在 hadoop 的安装目录下的bin目录中执行以下命令,如已配置 hadoop 环境变量,则可在任意目录下执行helplslsrmkdirputmoveFromLocalcopyFromLocalappendToFilemoveToLocalgetgetmergecopyToLocalmvrmcpcattailtextchmodchowndfducountsetrepexpunge (慎用)在多人共用HDFS的环境下,配置设置非常重要。特别是在 Hadoop 处理大量资料的环境,如果没有配额管理,很容易把所有的空间用完造成别人无法存取。HDFS 的配额设定是针对目录而不是针对账号,可以让每个账号仅操作某一个目录,然后对目录设置配置。HDFS 文件的限额配置允许我们以文件个数,或者文件大小来限制我们在某个目录下上传的文件数量或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量。结果:在设置空间配额时,设置的空间至少是 block_size * 3 大小生成任意大小文件的命令:清除空间配额限制安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在,当整个系统达到安全标准时,HDFS自动离开安全模式。30s安全模式操作命令HDFS 将所有的文件全部抽象成为 block 块来进行存储,不管文件大小,全部一视同仁都是以 block 块的统一大小和形式进行存储,方便我们的分布式文件系统对文件的管理。所有的文件都是以 block 块的方式存放在 hdfs 文件系统当中,在 Hadoop 1 版本当中,文件的 block 块默认大小是 64M,Hadoop 2 版本当中,文件的 block 块大小默认是128M,block块的大小可以通过 hdfs-site.xml 当中的配置文件进行指定。1) 一个文件有可能大于集群中任意一个磁盘
10T*3/128 = xxx块 2T,2T,2T 文件方式存—–>多个block块,这些block块属于一个文件2) 使用块抽象而不是文件可以简化存储子系统3) 块非常适合用于数据备份进而提供数据容错能力和可用性通常 DataNode 从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在 DataNode 的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。例如:
连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。 用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组。例如:一个文件 130M,会被切分成2个block块,保存在两个block块里面,实际占用磁盘130M空间,而不是占用256M的磁盘空间hdfs的文件权限机制与linux系统的文件权限机制类似r:read w:write x:execute
权限x对于文件表示忽略,对于文件夹表示是否有权限访问其内容如果linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsanHDFS文件权限的目的,防止好人做错事,而不是阻止坏人做坏事。HDFS相信你告诉我你是谁,你就是谁为了保证block块的安全性,也就是数据的安全性,在hadoop2当中,文件默认保存三个副本,我们可以更改副本数以提高数据的安全性、在hdfs-site.xml当中修改以下配置属性,即可更改文件的副本数HDFS 文件写入过程Client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件是否已存在,父目录是否存在,返回是否可以上传;Client 请求第一个 block 该传输到哪些 DataNode 服务器上;NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配, 返回可用的 DataNode 的地址如:A, B, C;Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在 HDFS 上存放三份, 存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。Client 请求 3 台 DataNode 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline ),A 收到请求会继续调用 B,然后 B 调用 C,将整个 pipeline 建立完成, 后逐级返回 client;Client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位(默认64K),A 收到一个 packet 就会传给 B,B 传给 C。A 每传一个 packet 会放入一个应答队列等待应答;数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上, 逐个发送 ack(命令正确应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client;当一个 block 传输完成之后,Client 再次请求 NameNode 上传第二个 block,重复步骤 2;在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺。这里的想法是将两个节点间的带宽作为距离的衡量标准。节点距离:两个节点到达最近的共同祖先的距离总和。例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不同机架上的节点)Distance(/d1/r1/n1, /d2/r4/n2)=6(不同数据中心的节点)机架感知2) Hadoop2.7.2 副本节点选择第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。第二个副本和第一个副本位于相同机架,随机节点。第三个副本位于不同机架,随机节点。HDFS 文件读取过程Client向NameNode发起RPC请求,来确定请求文件block所在的位置;NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;最终读取来所有的 block 会合并成一个完整的最终文件。从 HDFS 文件读写过程中,可以看出,HDFS 文件写入时是串行写入的,数据包先发送给节点A,然后节点A发送给B,B在给C;而HDFS文件读取是并行的, 客户端 Client 直接并行读取block所在的节点。NameNode 工作机制namenode工作机制第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。客户端对元数据进行增删改的请求。namenode记录操作日志,更新滚动日志。namenode在内存中对数据进行增删改查。secondary namenodesecondary namenode询问 namenode 是否需要 checkpoint。直接带回 namenode 是否检查结果。secondary namenode 请求执行 checkpoint。namenode 滚动正在写的edits日志。将滚动前的编辑日志和镜像文件拷贝到 secondary namenode。secondary namenode 加载编辑日志和镜像文件到内存,并合并。生成新的镜像文件 fsimage.chkpoint。拷贝 fsimage.chkpoint 到 namenode。namenode将 fsimage.chkpoint 重新命名成fsimage。所有的元数据信息都保存在了FsImage与Eidts文件当中,这两个文件就记录了所有的数据的元数据信息,元数据信息的保存目录配置在了 hdfs-site.xml 当中客户端对hdfs进行写文件时会首先被记录在edits文件中。edits修改时元数据也会更新。每次hdfs更新时edits先更新后客户端才会看到最新信息。fsimage:是namenode中关于元数据的镜像,一般称为检查点。一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。随着edits内容增大,就需要在一定时间点和fsimage合并。使用命令 hdfs oiv查看命令 hdfs oevsecnonaryNN通知NameNode切换editlog。secondaryNN从NameNode中获得FSImage和editlog(通过http方式)。secondaryNN将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage。secondaryNN将新的fsimage发回给NameNode。NameNode用新的fsimage替换旧的fsimage。完成合并的是 secondarynamenode,会请求namenode停止使用edits,暂时将新写操作放入一个新的文件中(edits.new)。secondarynamenode从namenode中通过http get获得edits,因为要和fsimage合并,所以也是通过http get 的方式把fsimage加载到内存,然后逐一执行具体对文件系统的操作,与fsimage合并,生成新的fsimage,然后把fsimage发送给namenode,通过http post的方式。namenode从secondarynamenode获得了fsimage后会把原有的fsimage替换为新的fsimage,把edits.new变成edits。同时会更新fsimage。hadoop进入安全模式时需要管理员使用dfsadmin的save namespace来创建新的检查点。secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上。fsimage与edits的合并时机取决于两个参数,第一个参数是默认1小时fsimage与edits合并一次。第一个参数:时间达到一个小时fsimage与edits就会进行合并第二个参数:hdfs操作达到1000000次也会进行合并第三个参数:每隔多长时间检查一次hdfs的操作次数为了保证元数据的安全性,我们一般都是先确定好我们的磁盘挂载目录,将元数据的磁盘做RAID1namenode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。具体配置方案:hdfs-site.xml在我们的secondaryNamenode对namenode当中的fsimage和edits进行合并的时候,每次都会先将namenode的fsimage与edits文件拷贝一份过来,所以fsimage与edits文件在secondarNamendoe当中也会保存有一份,如果namenode的fsimage与edits文件损坏,那么我们可以将secondaryNamenode当中的fsimage与edits拷贝过去给namenode继续使用,只不过有可能会丢失一部分数据。这里涉及到几个配置选项namenode保存fsimage的配置路径namenode保存edits文件的配置路径secondaryNamenode保存fsimage文件的配置路径secondaryNamenode保存edits文件的配置路径接下来我们来模拟namenode的故障恢复功能杀死namenode进程: 使用jps查看namenode的进程号 , kill -9 直接杀死。删除namenode的fsimage文件和edits文件。根据上述配置, 找到namenode放置fsimage和edits路径. 直接全部rm -rf 删除。拷贝secondaryNamenode的fsimage与edits文件到namenode的fsimage与edits文件夹下面去。
根据上述配置, 找到secondaryNamenode的fsimage和edits路径, 将内容 使用cp -r 全部复制到namenode对应的目录下即可。重新启动namenode, 观察数据是否存在。datanode工作机制一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。(dfs.blockreport.intervalMsec)。心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。集群运行中可以安全加入和退出一些机器。数据完整性当DataNode读取block的时候,它会计算checksum。如果计算后的checksum,与block创建时值不一样,说明block已经损坏。client读取其他DataNode上的block。datanode在其文件创建后周期验证checksum。掉线时限参数设置datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒dfs.heartbeat.interval的单位为秒DataNode的目录结构和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。在/opt/hadoop-2.6.0-cdh6.14.0/hadoopDatas/datanodeDatas/current这个目录下查看版本号具体解释:storageID:存储id号。clusterID集群id,全局唯一。cTime属性标记了datanode存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为0;但是在文件系统升级之后,该值会更新到新的时间戳。datanodeUuid:datanode的唯一识别码。storageType:存储类型。layoutVersion是一个负整数。通常只有HDFS增加新特性时才会更新这个版本号。datanode多目录配置datanode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。具体配置如下:
– 只需要在value中使用逗号分隔出多个存储目录即可需求说明:随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。复制一台新的虚拟机出来将我们纯净的虚拟机复制一台出来,作为我们新的节点修改mac地址以及IP地址关闭防火墙,关闭selinux更改主机名四台机器更改主机名与IP地址映射node04服务器关机重启node04安装jdk然后解压jdk安装包,配置环境变量解压hadoop安装包将 香港云主机node01关于hadoop的配置文件全部拷贝到node04创建dfs.hosts文件node01编辑hdfs-site.xml添加以下配置在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性刷新namenodenode01执行以下命令刷新namenode更新resourceManager节点node01执行以下命令刷新resourceManagernamenode的slaves文件增加新服务节点主机名称node01编辑slaves文件,并添加新增节点的主机,更改完后,slaves文件不需要分发到其他机器上面去单独启动新增节点使用负载均衡命令,让数据均匀负载所有机器创建dfs.hosts.exclude配置文件在namenod所在服务器的/export/servers/hadoop-2.6.0-cdh6.14.0/etc/hadoop目录下创建dfs.hosts.exclude文件,并添加需要退役的主机名称编辑namenode所在机器的hdfs-site.xml编辑namenode所在的机器的hdfs-site.xml配置文件,添加以下配置刷新namenode,刷新resourceManager节点退役完成,停止该节点进程等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役。从include文件中删除退役节点node01执行一下命令刷新namenode,刷新resourceManager从namenode的slave文件中删除退役节点如果数据负载不均衡,执行以下命令进行均衡负载所有的数据都是以一个个的block块存储的,只要我们能够将文件的所有block块全部找出来,拼接到一起,又会成为一个完整的文件,接下来我们就来通过命令将文件进行拼接:上传一个大于128M的文件到hdfs上面去我们选择一个大于128M的文件上传到hdfs上面去,只有一个大于128M的文件才会有多个block块。这里我们选择将我们的jdk安装包上传到hdfs上面去。node01执行以下命令上传jdk安装包web浏览器界面查看jdk的两个block块id这里我们看到两个block块id分别为1073742699和1073742700那么我们就可以通过blockid将我们两个block块进行手动拼接了。根据我们的配置文件找到block块所在的路径4. 执行block块的拼接“Hadoop HDFS分布式文件系统怎么理解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 数据库中间件的原理是什么

本篇内容主要讲解“数据库中间件的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库中间件的原理是什么”吧!数据库中间件设计要点要能解析SQL能支持读写分离能支持从库读的负载均衡支持分库操作支持分表操作支…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 09/12 10:48
Next 09/12 10:48

相关推荐