关于hdfs:HDFS架构篇
1、NameNode启动2、DataNode启动3、文件上传4、文件下载
1、NameNode启动2、DataNode启动3、文件上传4、文件下载
面对企业级数据量,单机容量太小,无奈存储海量的数据,这时候就须要用到多台机器存储,并对立治理散布在集群上的文件,这样就造成了分布式文件系统。HDFS是Hadoop下的分布式文件系统技术,Ceph是能解决海量非结构化数据存储的对象存储技术,本文将对他们的架构原理、个性和优缺点做介绍。 — 分布式文件系统HDFS —HDFS全称为Hadoop Distributed File System,在2006年由Doug Cutting公布了第一个版本,是运行在通用硬件上的分布式文件系统。它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。HDFS的推出给过后的行业提供了一个低成本、高可扩大的数据存储计划,尤其实用于互联网行业的海量用户拜访日志的存储和检索需要,因而一经推出就受到了互联网行业的欢送,以Yahoo为代表的互联网企业疾速构建了基于HDFS的企业数仓,从而减速了Hadoop在互联网行业内的疾速落地(起初这个Yahoo团队独立进去创建了Hortonworks)。尔后通过3~4年的疾速倒退,海内的大型企业都开始拥抱HDFS,各种新型利用场景开始呈现并发明了较大的业务价值。从2009年开始,国内的Hadoop利用开始呈现,并最早在运营商和互联网行业落地。作为Hadoop体系的最胜利的我的项目,HDFS曾经在各种大型在线服务和数据存储系统中失去广泛应用,曾经成为私有化部署畛域海量数据存储的施行规范。 HDFS通过一个高效的分布式算法,将数据的拜访和存储散布在大量服务器之中,在牢靠地多备份存储的同时还能将拜访散布在集群中的各个服务器之上。在构架设计上,NameNode治理元数据,包含文件目录树,文件->块映射,块->数据服务器映射表等。DataNode负责存储数据、以及响应数据读写申请;客户端与NameNode交互进行文件创建/删除/寻址等操作,之后间接与DataNode交互进行文件I/O。 HDFS通过正本机制保证数据的存储平安与高牢靠,默认如上图所示配置为3正本,每个数据块散布在不同的服务器之上。在用户拜访时,HDFS将会计算应用网络最近的和访问量最小的服务器给用户提供拜访。HDFS反对文件的创立、删除、读取与追加,对于一个较大的文件,HDFS将文件的不同局部寄存于不同服务器之上。在拜访大型文件时,零碎能够并行从服务器阵列中的多个服务器并行读入,减少了大文件读入的拜访带宽。通过以上实现,HDFS通过分布式计算的算法,将数据拜访均摊到服务器阵列中的每个服务器的多个数据拷贝之上,单个硬盘或服务器的吞吐量限度都能够冲破,提供了极高的数据吞吐量。 HDFS将文件的数据块调配信息寄存在NameNode服务器之上,文件数据块的信息散布地寄存在DataNode服务器上。当整个零碎容量须要裁减时,只须要减少DataNode的数量,HDFS后续通过balance算法将数据块搬迁到新的DataNode实例中。通过以上实现,HDFS能够做到在不进行服务的状况下横向扩容和数据从新散布。HDFS文件系统假如系统故障(服务器、网络、存储故障等)是常态,并通过多方面措施来保证数据的可靠性。数据在写入时被复制多份,能够通过用户自定义的复制策略散布到物理地位不同的服务器上;数据在读写时将主动进行数据的校验,一旦发现数据校验谬误将从新进行复制。 受限于过后的需要背景和硬件能力程度,HDFS也有一些显著的架构问题,随着技术和需要的演进而逐步成为瓶颈。通过NameNode来治理元数据有它的架构问题,首先是服务高可用问题,在Hadoop 1.0时代这是最大的架构问题,不过在2013年Hadoop 2.0中通过Master-Slave的形式得以解决;另外每个存储的文件都必须在NameNode的内存中保护一个描述符从而占据内存空间,当文件数据量太大时就会受限于单个NameNode的内存资源从而导致性能瓶颈(个别单个集群文件数量在亿级别以上时),社区在2017年推出的Hadoop 2.9版本提供HDFS Router Federation性能,通过不同的NameService解决挂载在HDFS上不同目录下的文件的形式来缓解这个问题。 存储老本问题对于大型HDFS集群是个更大的问题,HDFS的三正本策略保障了性能和存储老本的平衡,适宜于热数据和温数据的存储和解决,对于冷数据存储来说老本就偏高,尤其与对象存储类的解决方案相比。开源社区直到2019年Hadoop 3.0里才推出了Erasure Code技术(星环科技在2014年推出HDFS EC技术),但因为推出工夫较晚和技术成熟度等起因,目前并没有大规模落地。与云计算的存储技术交融是另外一个重要的架构问题,私有云有成熟的云存储计划,绝对HDFS老本更低,与云平台的调度零碎协调的更好,而HDFS只能定位作为云上的企业存储的一个细分计划之一。如各个云平台都推出EMR(Elastic MapReduce)类产品,如Google Dataproc,阿里云EMR等,但总体受欢迎度比拟个别,短少与云上其余数据分析与解决零碎的全方位的买通和互联。 从2012年开始,国内重点行业的中大型企业都曾经开始了大数据的布局,到2019年像金融、运营商、能源、政府公安等重要行业大部分企业都曾经构建了基于HDFS的数据存储系统,推动了一批重点的数字化利用的推广。如金融行业的ODS、历史数据存储、数据湖、科技监管类利用,运营商的经分系统、电子围栏、数字营销零碎等,都曾经是宽泛应用的业务零碎。因为国内外行业需要的差异性以及对私有云的接受程度不同,HDFS在国内依然是一个十分重要的数据存储技术,也领有更好的技术和利用生态,因而有着更为欠缺的技术生命力。 — 对象存储Ceph —对象存储的设计指标是为了解决海量非结构化数据的存储问题,如邮件、图谱、视频、音频以及其余多媒体文件,并在社交、挪动等利用中大量被应用,此外也大量被用于数据备份和灾备场景。 在业务开发层个别提供基于S3协定的开发接口,这套API提供了一整套的RESTful API,能够让利用能够通过HTTP PUT或GET命令来操作数据对象,每个对象有个本人的拜访地址。与HDFS等文件类存储采纳目录构造或多层级树形构造不同,对象存储在物理存储上个别采纳一个扁平的数据存储构造,每个对象都是一个包含元数据、数据和惟一标识ID的齐备数据形容,这样利用能够十分不便的去找到并拜访这个数据对象,在存储的治理上也绝对比较简单,尤其是大部分利用场景下数据对象都存储在远端的云服务器上。对象存储管理软件会将所有的硬盘资源形象为一个存储池,用于数据的物理化存储。绝对于文件类存储,对象存储相对来说老本更低,但绝对数据分析的性能不佳,须要配套各种剖析的缓存技术来能提供比拟好的数据分析性能。 Ceph是一个开源的对象存储我的项目,诞生于2004年,提供对象、块和文件存储,其中对象存储性能在业内十分受欢迎,在国内曾经有很多私有化云平台的对象存储生产落地案例。一个Ceph的存储集群个别包含三个局部:Ceph存储集群服务端:在Ceph存储集群服务端架构中外围组件有Monitor服务、OSD(Object Storage Daemons)服务和Manager服务等。其中Mon服务用于保护存储系统的硬件逻辑关系,次要是服务器和硬盘等在线信息。Mon服务通过集群的形式保障其服务的可用性。OSD服务用于实现对磁盘的治理并实现真正的数据读写,通常一个磁盘对应一个OSD服务。Ceph Clients:以library形式提供的客户端,能够用于拜访Ceph服务端,它提供了3种协定来拜访,包含对象存储的RADOSGW、块存储端的RBD以及文件存储的CephFS。Ceph 协定:用于服务端和Client的通信协议。 因为一个分布式存储集群治理的对象数量十分多,可能是百万级甚至是千万级以上,因而OSD的数量也会比拟多,为了有好的管理效率,Ceph引入了Pool、Place Groups(PGs)、对象这三级逻辑。PG是一个资源池的子集,负责数据对象的组织和地位映射,一个PG负责组织一批对象(数据在千级以上)。同时一个PG会被映射到多个OSD,也就是由多个OSD来负责其组织的对象的存储和查问,而每个OSD都会承载大量的PG,因而PG和OSD之间是多对多的映射关系。 当用户要将数据存储到Ceph集群时,存储数据会被宰割成多个对象(Ceph的最小存储单元),每个对象都有一个惟一的id,每个对象的大小是能够配置的,默认为4MB。Ceph通过借鉴的CRUSH哈希算法,将若干个对象映射到PG上,造成一个对象与PG的逻辑组合,并依据PG所在的Pool的正本数,将数据复制到多个OSD上,保证数据的高可用。 图片来源于:https://www.wenjiangun.com/blog/952/在集群的可扩展性上,Ceph能够做到简直线性扩大。CRUSH 通过一种伪随机的形式将数据进行散布,因而 OSD 的利用就可能精确地通过二项式建模或者惯例形式调配。无论哪一个都能够获得完满的随机过程。随着 PG 的减少,差别就降落:对于每个 OSD 100 个 PG的状况下,标准差是 10%;对于1000 个的状况下为 3%。线性的散布策略极好地将负载在集群中均衡。CRUSH 通过卸载所有的调配碎片到一个特定的 OSD 上从而来修改这样的问题。与哈希以及线性策略不同,CRUSH 同时也最小化了数据在集群扩大产生的迁徙,同时又保障了负载的均衡。CRUSH 的计算复杂度为 O(log(n))(对于有 n 个 OSD 的集群),因而只须要 10 几个微秒就能够使集群增长到好几千个 OSDs。 值得关注的是,Ceph客户端所有的读写操作都须要通过代理节点,一旦集群并发量较大,代理节点就容易成为单点瓶颈。在数据的一致性方面,Ceph只能反对数据的最终一致性。 — 小结—本文从架构和原理介绍了高度容错性、高吞吐量的分布式文件系统HDFS,和解决海量非结构化数据存储的对象存储技术Ceph(当初各项技术倒退比拟快,可能存在技术形容跟最新技术倒退状况不太统一的状况)。那么在特定场景下,数据的疾速查问、疾速写入和可扩展性也是必不可少的,下一篇咱们将介绍搜索引擎技术和宽表存储技术。 ...
敞开所有hadoop,zk节点stop-dfs.shzk.sh stop顺次启动所有节点journalnodehdfs --daemon start journalnode任一节点格式化namenodehdfs namenode -format启动hdfs --daemon start namenode其余节点同步namenode信息hdfs namenode -bootstrapStandby其余节点启动namenodehdfs --daemon start namenode启动zk集群zk.sh start初始化zkfchdfs zkfc -formatZK敞开hadoop集群stop-dfs.sh启动hadoop集群start-dfs.sh
本期话题本期分享将介绍分布式文件系统 HDFS(Hadoop Distributed File System)在 Shopee 如何从一个小型集群倒退到由数千个节点组成的联邦集群,以及在这一过程中咱们遇到的问题与解决措施。 通过本期分享,你将可能理解到: HDFS 的根本设计等相干常识;Shopee Data Infra 团队为什么改良,以及如何改良 HDFS 的可扩展性;HDFS 的常见问题和解决方案。 嘉宾简介Yiyang,大数据工程师 来自 Shopee Data Infrastructure 团队,热衷于 HDFS、Ozone 等存储系统相干的研发。 叮!来自直播小助手的揭示⏰ 直播工夫 2022年7月21日 19:00-20:00 直播地址 戳这里预约 Zoom 直播 -> 查收邮件,获取链接 Zoom 会议号:959 2107 0966明码:116335*可通过 Zoom 桌面端、挪动端以及 PC 端浏览器退出直播间;无需 Zoom 账号,无需登录即可退出直播间,并可能发送发问,参加互动。 有奖征集欢送大家间接在「Shopee技术团队」公众号留言,就「HDFS」相干话题向 Yiyang 发问;也可在流动当天来直播间现场参加互动。嘉宾自己将在分享完结后的 Q&A 环节与大家一起聊聊这些话题。 咱们为发问被选中的观众筹备了 Shopee 周边礼包盲盒各一份,获奖名单将于流动当天在直播间揭晓。
学习了应用命令 hdfs haadmin -failover 手动进行故障转移,在该模式下,即便现役 NameNode 曾经生效,零碎也不会主动从现役 NameNode 转移到待机 NameNode,上面学习如何配置部署 HA 主动进行故障转移。主动故障转移为 HDFS 部署减少了两个新组件:ZooKeeper 和 ZKFailoverController(ZKFC)过程,如图 3-20 所示。ZooKeeper 是保护大量协调数据,告诉客户端这些数据的扭转和监督客户端故障的高可用服务。HA 的主动故障转移依赖于 ZooKeeper 的以下性能: 1)故障检测:集群中的每个 NameNode 在 ZooKeeper 中保护了一个长久会话,如果机器解体,ZooKeeper 中的会话将终止,ZooKeeper 告诉另一个 NameNode 须要触发故障转移。 2)现役 NameNode 抉择:ZooKeeper 提供了一个简略的机制用于惟一的抉择一个节点为 active 状态。如果目前现役 NameNode 解体,另一个节点可能从 ZooKeeper 取得非凡的排外锁以表明它应该成为现役 NameNode。 ZKFC 是主动故障转移中的另一个新组件,是 ZooKeeper 的客户端,也监督和治理 NameNode 的状态。每个运行 NameNode 的主机也运行了一个 ZKFC 过程,ZKFC 负责: 1)衰弱监测:ZKFC 应用一个健康检查命令定期地 ping 与之在雷同主机的 NameNode,只有该 NameNode 及时地回复衰弱状态,ZKFC 认为该节点是衰弱的。如果该节点解体,解冻或进入不衰弱状态,衰弱监测器标识该节点为非衰弱的。 2)ZooKeeper 会话治理:当本地 NameNode 是衰弱的,ZKFC 放弃一个在 ZooKeeper 中关上的会话。如果本地 NameNode 处于 active 状态,ZKFC 也放弃一个非凡的 znode 锁,该锁应用了 ZooKeeper 对短暂节点的反对,如果会话终止,锁节点将主动删除。 ...
咱们晓得hdfs是hadoop体系上的文件系统,负责具体的数据文件存储,且如果一旦hdfs文件被误删除后,尤其是重要数据,对公司来说影响十分大。所以须要提前做一些平安预防措施,例如应用Hdfs Trash机制,或者重要目录利用Hdfs SnapShot性能,而后针对于删除的文件或者目录能够通过trash或者SnapShot机制来进行复原,如果数据的确曾经删除了(例如间接通过hadoop api进行delete,未配置SnapShot),如果想复原数据,就须要疾速采取肯定的措施了。上面咱们来别离介绍下这些复原数据的应用形式与机制。 Hdfs Trash(回收箱) 对于线上生产环境的HDFS,开启回收站性能是必不可少的。该性能相似于linux零碎的回收站设计,HDFS会为每个用户创立一个专属的回收站目录(/user/${user.name}/.Trash),用户删除文件时,实际上是被挪动到了回收站目录。用于预防当用户误删HDFS上的数据时,可能及时从回收站复原这些数据(当然回收站是防不住删库跑路的)。 应用这种形式的前提是在hdfs下面开启trash性能,默认是没有开启的。interval的值默认为0,单位是分钟。只须要在hadoop的配置文件core-site.xml中增加上面的内容: <!--Enable Trash --><property> <name>fs.trash.interval</name> <value>120</value></property><property> <name>fs.trash.checkpoint.interval</name> <value>120</value></property> 增加好上述内容后,不须要重启后台程序,间接就会失效。执行删除操作后,会先将文件挪动到以后操作用户的.Trash/Current目录上面。 Hdfs SnapShot(快照) hadoop从2.1版本后开始反对HDFS快照(SnapShot)性能, 快照创立瞬时性:除去inode的查问工夫,算法耗费O(1)复杂度。 只有在对快照批改时才会耗费额定内存:内存应用O(M),M是被批改的文件或者目录数。 DataNode的block不被复制:快照文件记录block列表和文件大小。不做数据的拷贝复制。 快照不会对失常HDFS操作产生不利影响:所有的批改都依照工夫倒序排序,因而以后数据总能被间接拜访到。快照数据是依据与以后数据进行变更局部的差值计算得来的。 应用实例: 应用形式: 创立快照:hdfs fs -allowSnapshot /testhdfs fs -put test.txt /testhdfs fs -createSnapshot /test import_data 将test文件删除:hdfs fs -rmr /test/test.txt 误删除后就能够应用快照目录进行复原:hdfs fs -cp /test/.snapshot/import-data/test.txt /text复原数据 然而如果间接调用hadoop delete api进行删除操作,是默认不会走trash机制的,同时也未配置快照性能的状况下,文件所对应的block数据曾经开始真正从底层文件系统层面进行删除,此时须要疾速的做出决断进行复原操作。因为须要进行数据服务(nn、dn),所以须要综合思考,去衡量复原数据和停服对线上服务的影响两者之间的利害关系。 首先梳理下hdfs delete的流程,如下图: 咱们能够看到hdfs delete流程中很多环节都是异步进行操作的,所以如果想复原数据,须要立刻做出决定是否进行停服,能够复原的数据量也取决于操作与停服间隔时间,还有集群的忙碌水平,所以可能复原全副或者局部数据,如果工夫过了很久了,在集群规模比拟大、集群比拟闲暇的状况下,可复原的数据量百分比就不能太乐观了。上面咱们来阐明下具体复原步骤(阐明:操作的前提是有删除操作之前的fsimage元数据,同时须要有备用的新集群): 及时进行hdfs集群服务(nn、dn),阻止block数据从os上进一步被删除;由上述的hdfs delete流程可知namenode删除block指令是通过datanode心跳一批批下发的,且datanode是通过异步线程删除block数据, 所以须要立刻进行服务过程,阻止datanode上的block文件进一步被删除; 拷贝删除数据前的元数据fsimage文件,并在新集群namenode加载2.1) 通过hdfs审计log找到删除操作开始的确切工夫点; 2.2) 从fsimage备份的多个版本中,找到删除操作工夫点前的fsimage; 2.3) 停掉新集群所有过程(保留journalnode),初始化新环境; 2.4) 停掉所有journalnode过程,在image目录替换为备份的fsimage文件,替换imaeg、edits、和所有journalnode目录下的VERSION文件为生产环境上的VERSION文件; 2.5) 启动namenode过程; ...
问题JuiceFS 是一个基于对象存储的分布式文件系统,在之前跟对象存储比拟的文章中曾经介绍了 JuiceFS 可能保证数据的强一致性和极高的读写性能,因而齐全能够用来代替 HDFS。然而数据平台整体迁徙通常是一个费时费力的大工程,须要做到迁徙超大规模数据的同时尽量不影响下层业务。上面将会介绍如何通过 JuiceFS 的迁徙工具来实现平滑迁徙 HDFS 中的海量数据到 JuiceFS。 平滑迁徙计划数据平台除了咱们在 HDFS 上理论看到的文件以外,其实还有一些同样重要的信息,也就是所谓的「元数据」,这些元数据存储在相似 Hive Metastore 这样的零碎里。因而当咱们议论数据迁徙时不能把这两种数据拆分开来,必须同时思考,迁徙完数据当前须要同时更新 Hive 表或者分区的地位(LOCATION)信息,如果任何一种数据出了问题都会对业务方造成影响。 为了保证数据和元数据的一致性,通常的做法是在迁徙完数据当前同步更新元数据中的地位信息,但当数据规模比拟大,并且业务又可能更新数据时,很难保证数据拷贝和更新地位信息是个原子操作,迁徙过程中可能导致数据失落,影响整体迁徙的可靠性。甚至须要以暂停业务为代价来实现,或者在业务中采纳双写等机制来实现在线迁徙,侵入业务逻辑,费时费力。 如果可能在迁徙过程中为数据拜访提供对立的门路来屏蔽理论的数据地位,实现元数据和实在数据地位的解耦,将会大大降低整体迁徙的危险。文件系统的符号链接就能够达到这个成果,JuiceFS 也反对符号链接,并且反对跨文件系统的符号链接,借助它能够为多个文件系统提供对立的拜访入口,造成对立命名空间。 符号链接是操作系统中广泛应用的概念,你能够通过符号链接实现在一个目录树中治理扩散在各个中央的数据。对应的,咱们也能够通过 JuiceFS 的符号链接个性实现在一个文件系统中治理多个存储系统。其实符号链接这个性能早在 2013 年 Hadoop 社区就曾经想要在 HDFS 上实现(HADOOP-10019),但遗憾的是目前为止还没残缺反对。借助符号链接即可在 JuiceFS 上治理包含但不限于 HDFS、对象存储在内的各种存储系统,外表上看起来拜访的是 JuiceFS,但理论拜访的是底层实在的存储。 同时,JuiceFS 的原子重命名(rename)操作也能在数据迁徙过程中施展关键作用。JuiceFS 通过符号链接来跳转回原始数据,但当数据齐全拷贝过去当前须要笼罩这个符号链接,这个时候原子重命名就能保证数据的安全性和可靠性,避免出现数据失落和损坏。 此外,JuiceFS 还能够通过配置文件和非凡的标记文件来动静感知到迁徙过程,并在新增和删除文件时进行额定的查看,确保新创建的文件也会呈现在迁徙后的目录中,并且确保要删除的文件也能从新零碎中删掉。对于更简单的重命名操作,也有相似的机制来保障正确性。 有了方才介绍的 JuiceFS 的这些个性,就能够实现在数据迁徙时别离迁徙数据和元数据,同时整个迁徙过程对于业务是齐全通明的。上面解说具体的迁徙操作步骤。 操作步骤步骤一:将 JuiceFS 作为 HDFS 的拜访入口在 JuiceFS 上给 HDFS 的所有第一级目录(或文件)创立对应的符号链接(假设不会再在 HDFS 根目录创立内容),之后通过 jfs://name/<path> 就能残缺拜访 HDFS 外面的内容,两者是齐全等价的。如下图所示。 步骤二:应用 JuiceFS 来拜访 HDFS 中的数据这一步有两种实现办法。第一种是批改 Hive Metastore 中表或者分区的 LOCATION 为对应的 JuiceFS 门路,例如之前是 hdfs://ns/user/test.db/table_a,新门路则为 jfs://name/user/test.db/table_a。第二种办法是将 fs.hdfs.impl 批改为 com.juicefs.MigratingFileSystem,这样能够维持 LOCATION 不变。 ...
HDFS(Hadoop Distributed File System)分布式文件存储系统,次要为各类分布式计算框架如Spark、MapReduce等提供海量数据存储服务,同时HBase、Hive底层存储也依赖于HDFS。HDFS提供一个对立的形象目录树,客户端可通过门路来拜访文件。HDFS集群分为两大角色:Namenode、Datanode(非HA模式会存在Secondary Namenode)NamenodeNamenode是HDFS集群主节点,负责管理整个文件系统的元数据,所有的读写申请都要通过Namenode。元数据管理Namenode对元数据的治理采纳了三种模式:1) 内存元数据:基于内存存储元数据,元数据比拟残缺2) fsimage文件:磁盘元数据镜像文件,在NameNode工作目录中,它不蕴含block所在的Datanode 信息3) edits文件:数据操作日志文件,用于连接内存元数据和fsimage之间的操作日志,可通过日志运算出元数据fsimage + edits = 内存元数据留神:当客户端对hdfs中的文件进行新增或批改时,操作记录首先被记入edit日志文件,当客户端操作胜利后,相应的元数据会更新到内存元数据中 能够通过hdfs的一个工具来查看edits中的信息bin/hdfs oev -i edits -o edits.xml查看fsimagebin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml 元数据的checkpoint(非HA模式)Secondary Namenode每隔一段时间会查看Namenode上的fsimage和edits文件是否须要合并,如触发设置的条件就开始下载最新的fsimage和所有的edits文件到本地,并加载到内存中进行合并,而后将合并之后取得的新的fsimage上传到Namenode。checkpoint操作的触发条件次要配置参数: dfs.namenode.checkpoint.check.period=60 #查看触发条件是否满足的频率,单位秒dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondarydfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir} 以上两个参数做checkpoint操作时,secondary namenode的本地工作目录,次要解决fsimage和edits文件的dfs.namenode.checkpoint.max-retries=3 #最大重试次数dfs.namenode.checkpoint.period=3600 #两次checkpoint之间的工夫距离3600秒dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录 checkpoint作用 放慢Namenode启动Namenode启动时,会合并磁盘上的fsimage文件和edits文件,失去残缺的元数据信息,但如果fsimage和edits文件十分大,这个合并过程就会十分慢,导致HDFS长时间处于平安模式中而无奈失常提供服务。SecondaryNamenode的checkpoint机制能够缓解这一问题数据恢复Namenode和SecondaryNamenode的工作目录存储构造完全相同,当Namenode故障退出须要从新复原时,能够从SecondaryNamenode的工作目录中将fsimage拷贝到Namenode的工作目录,以复原Namenode的元数据。然而SecondaryNamenode最初一次合并之后的更新操作的元数据将会失落,最好Namenode元数据的文件夹放在多个磁盘下面进行冗余,升高数据失落的可能性。注意事项:SecondaryNamenode只有在第一次进行元数据合并时须要从Namenode下载fsimage到本地。SecondaryNamenode在第一次元数据合并实现并上传到Namenode后,所持有的fsimage已是最新的fsimage,无需再从Namenode处获取,而只须要获取edits文件即可。SecondaryNamenode从Namenode上将要合并的edits和fsimage拷贝到本人以后服务器上,而后将fsimage和edits反序列化到SecondaryNamenode的内存中,进行计算合并。因而个别须要把Namenode和SecondaryNamenode别离部署到不同的机器下面,且SecondaryNamenode服务器配置要求个别不低于Namenode。SecondaryNamenode不是充当Namenode的“备服务器”,它的次要作用是进行元数据的checkpointDatanodeDatanode作为HDFS集群从节点,大数据培训负责存储管理用户的文件块数据,并定期向Namenode汇报本身所持有的block信息(这点很重要,因为,当集群中产生某些block正本生效时,集群如何复原block初始正本数量的问题)。对于Datanode两个重要的参数:通过心跳信息上报参数<property><name>dfs.blockreport.intervalMsec</name><value>3600000</value><description>Determines block reporting interval in milliseconds.</description></property> Datanode掉线判断时限参数Datanode过程死亡或者网络故障造成Datanode无奈与Namenode通信时,Namenode不会立刻把该Datanode断定为死亡,要通过一段时间,这段时间称作超时时长。HDFS默认的超时时长为10分钟30秒。如果定义超时工夫为timeout,则超时时长的计算公式为:timeout = 2 heartbeat.recheck.interval(默认5分钟) + 10 dfs.heartbeat.interval(默认3秒)。<property><name>heartbeat.recheck.interval</name> 单位毫秒<value>2000</value></property><property><name>dfs.heartbeat.interval</name> 单位秒<value>1</value></property> HDFS读写数据流程理解了Namenode和Datanode的作用后,就很容易了解HDFS读写数据流程,这个也是面试中常常问的问题。HDFS写数据流程留神:1.文件block块切分和上传是在客户端进行的操作2.Datanode之间自身是建设了一个RPC通信建设pipeline3.客户端先从磁盘读取数据放到一个本地内存缓存,开始往Datanode1上传第一个block,以packet为单位,Datanode1收到一个packet就会传给Datanode2,Datanode2传给Datanode3;Datanode1每传一个packet会放入一个应答队列期待应答4.当一个block传输实现之后,客户端会告诉Namenode存储块结束,Namenode将元数据同步到内存中 Datanode之间pipeline传输文件时,个别依照就近可用准则a) 首先就近筛选一台机器b) 优先选择另一个机架上的Datanodec) 在本机架上再随机筛选一台HDFS读数据流程留神:Datanode发送数据,是从磁盘外面读取数据放入流,以packet为单位来做校验客户端以packet为单位接管,先在本地缓存,而后写入指标文件客户端将要读取的文件门路发送给namenode,namenode获取文件的元信息(次要是block的寄存地位信息)返回给客户端,客户端依据返回的信息找到相应datanode一一获取文件的block并在客户端本地进行数据追加合并从而取得整个文件HDFSHA机制HA:高可用,通过双Namenode打消单点故障。双Namenode协调工作的要点:元数据管理形式须要扭转a) 内存中各自保留一份元数据b) edits日志只能有一份,只有active状态的Namenode节点能够做写操作c) 两个Namenode都能够读取editsd) 共享的edits放在一个共享存储中治理(qjournal和NFS两个支流实现,图中以放在一个共享存储中治理(qjournal和为例)须要一个状态治理功能模块a) 实现了一个zk failover,常驻在每一个Namenode所在的节点b) 每一个zk failover负责监控本人所在Namenode节点,利用zk进行状态标识,当须要进行状态切换时,由zk failover来负责切换,切换时须要避免brain split景象的产生
咱们在HDFS - 什么是元数据中提到了,元数据会存在与内存和磁盘中,内存为了进步响应速度,磁盘是为了长久化保证数据的平安,然而写磁盘的速度绝对于内存是慢了几个数量级的,如果NameNode每次都要把数据落到磁盘上那是没方法解决那么多客户端的申请的,所以NameNode用了双缓冲机制以及分段加锁。所谓双缓冲就是定义了两个内存块,一个是bufCurrent,用于以后写入元数据的,一个是bufReady,用于写入磁盘的,两个内存块都是512k。 第一把锁线程1会先获取锁,而后会看看以后有没有在替换缓存(这里通过isAutoSyncScheduled来判断),如果没有,就去获取一个全局惟一的事务ID,这个ID是递增的。拿到事务ID后,就开始写入bufCurrent,写完后判断bufCurrent是否超过了512k,如果没有,线程1的流程就完结了(前面完结的背景是红色的)。因为线程2,3,4在线程1没开释锁的时候,都会始终等到,如果线程2,3,4拿到了锁,也会持续下面线程1的操作。因为这个锁里的操作都是基于内存的,所以速度就会十分块。咱们假如线程4写完后,发现bufCurrent内存超过了512k,此时就会把isAutoSyncScheduled设置为true,阐明要开始替换内存了,其余线程就不能做以上的操作了。这里的bufCurrent就是线程1,2,3,4写入的数据。这个时候,线程5进来并拿到锁,咱们给拿锁的过程色彩标深一点,发现要开始替换内存了,于是他就是wait状态。 第二把锁咱们假如接下来获取到锁的是线程4。他发现此时并没有其余线程替换内存(这里通过isSyncRunning判断),于是他就开始bufCurrent和bufReady的内存进行了替换,替换后,bufCurrent的数据就清空了。在这里还会把isSyncRunning设置true,而后isAutoSyncScheduled设置为false,最初就唤醒wait的线程。线程4唤醒其余线程后,他就开始把bufReady的数据写入磁盘,这个操作是很耗时的,所以并没有加锁,然而他是运行状态,所以下图标记为绿色。这里的bufReady就是线程1,2,3,4写入的数据。此时是线程5获取了锁,发现内存替换结束了,开始往bufCurrent写数据。尔后线程6拿到了锁,此时bufCurrent又超过了512k了,就会把isAutoSyncScheduled设置为true,阐明开始替换内存,其余线程就不能往bufCurrent写入数据了。然而他发现isSyncRunning为true,阐明有其余线程在写磁盘了,所以他就开始wait。 第三把锁此时线程4写完了磁盘,而后他获取到锁,就会把synctxid更改为本人的事务ID,而后赋值isSyncRunning为false,阐明磁盘写入实现了。最初唤醒其余wait的线程。此时线程6从新拿到了锁,他发现isSyncRunning为false了,那就是阐明其余线程曾经把本人的内容刷入磁盘了,所以线程6开始了下面线程4的操作,替换内存,写入磁盘。 总结第一把锁,次要是判断isAutoSyncScheduled以及对isAutoSyncScheduled的赋值,这个次要是阐明bufCurrent和bufReady开始替换内存了。第二把锁,次要是判断isSyncRunning以及对isSyncRunning和isAutoSyncScheduled的赋值。isSyncRunning是用来判断是否在写磁盘,isAutoSyncScheduled用来判断是否在替换内存,如果在替换,就不能写入bufCurrent,如果在写磁盘,那就不能写磁盘。第三把锁,赋值isSyncRunning,阐明磁盘写入实现。这期间最耗时的操作并没有加锁,其余内存操作的加锁,然而速度比拟快,采纳在这种分段加锁的形式和双缓冲机制,大大提高了性能。
HDFS简介HDFS是Hadoop外围组成, 是分布式存储服务HDFS是分布式文件系统中的一种 HDFS的重要概念HDFS通过对立的命名空间目录树来定位文件另外, 它是分布式的, 由很多服务器联结起来实现其性能. 集群中的服务器有各自的角色(分布式实质是拆分, 各司其职)典型的Master/Slave架构HDFS的架构是典型的Master/Slave构造HDFS集群往往是一个NameNode+多个DataNode组成NameNode是集群的主节点, DataNode是集群的从节点分块存储(block机制)HDFS中的文件在物理是分块存储(block)的, 块的大小能够通过配置参数来指定Hadoop2.x版本中默认的block大小是128M命名空间(NameSpace)HDFS反对传统的档次型文件组织构造.用户或者应用程序能够创立目录, 而后将文件保留在这些目录里.文件系统命名空间的层次结构和大多数现有的文件系统相似: 用户能够创立, 删除, 挪动或重命名文件NameNode负责保护文件系统的命名空间, 任何对文件系统命名空间或属性的批改都将被NameNode记录下来 NameNode元数据管理咱们把目录构造及文件分块地位叫做元数据NameNode的元数据记录每一个文件所对应的block信息(block的id, 以及所在的DataNode节点)DataNode数据存储文件的各个block的具体存储管理由DataNode节点来承当一个block会有多个DataNode来存储, DataNode会定时向NameNode来汇报本人持有的block信息正本机制为了容错, 文件的所有block都会有正本每个文件的block大小和正本系数都是可配置的应用程序能够指定某个文件的正本数目正本系数能够在文件创建的时候指定, 也能够在之后扭转正本数量默认是3个一次写入, 屡次读出HDFS设计成适应一次写入, 屡次读出的场景, 且不反对文件的随机批改 . (反对追加写入, 不反对随机更新)正因为如此, HDFS适宜用来做大数据分析的底层存储, 并不适宜用来做网盘等利用 (批改不不便, 提早大, 网络开销大, 老本太高)HDFS架构 NameNode: HDFS集群的管理者, Master 保护治理HDFS的命名空间(NameSpace)保护正本策略记录文件块(Block)的映射信息负责解决客户端读写申请DataNode: NameNode下达命令, DataNode执行实际操作, Slave 保留理论的数据块负责数据块的读写Client: 客户端 上传文件到HDFS的时候, Client负责将文件切分成Block, 而后进行上传申请NameNode交互, 获取文件的地位信息读取或写入文件, 与DataNode交互Client能够应用一些命令来治理HDFS或拜访HDFS HDFS读写解析HDFS读数据流程 客户端通过Distributed FileSystem向NameNode申请下载文件, NameNode通过查问元数据找到文件块所在的DataNode地址筛选一台DataNode(就近准则, 而后随机)服务器, 申请读取数据DataNode开始传输数据给客户端 (从磁盘外面读取数据输出流, 以Packet为单位来做校验)客户端以Packet为单位接管, 先在本地缓存, 而后写入指标文件HDFS写数据流程 客户端通过Distributed FileSystem模块向NameNode申请上传文件, NameNode查看指标文件是否已存在, 父目录是否存在NameNode返回是否能够上传客户端申请第一个Block上传到哪几个DataNode服务器上NameNode返回3个DataNode节点, 别离是dn1, dn2, dn3客户端通过FSDataOutputStream模块申请dn1上传数据, dn1收到申请会持续调用dn2, 而后dn2调用dn3, 将这个通信管道建设实现dn1, dn2, dn3逐级应答客户端NN与2NNNN故障解决Hadoop的限额与归档以及集群平安模式