1.分布式文件存储系统HDFS——Namenode、源码元数据管理以及checkpoint
2.NameNode HAå®ç°åç
3.创帆云大数据教程2-搭建docker的源码hadoop:namenode及resourceManager
4.原创-namenode配置Federation
5.2. Hadoop中的NameNode的作用是什么?
6.hadoop入门之namenode工作特点介绍
分布式文件存储系统HDFS——Namenode、元数据管理以及checkpoint
HDFS,源码即Hadoop Distributed File System,源码是源码一个为各种分布式计算框架如Spark、MapReduce提供海量数据存储服务的源码小照网站监控源码分布式文件存储系统。HDFS提供了一个统一的源码抽象目录树,通过路径如hdfs://namenode:port/dir-a/a.data,源码客户端可以访问文件。源码
HDFS集群主要由两大角色构成:Namenode和Datanode。源码Namenode是源码主节点,负责管理整个文件系统的源码元数据,处理所有的源码读写请求。
Namenode对元数据的源码管理采用三种形式:内存元数据、fsimage文件和edits文件。源码内存元数据基于内存存储,信息完整。fsimage文件是磁盘元数据的镜像文件,不包含block所在的Datanode信息。edits文件记录数据操作日志,网页的源码文件通过日志可计算出内存元数据。fsimage + edits = 内存元数据。当客户端对HDFS中的文件进行新增或修改时,操作记录首先记入edit日志文件,随后更新内存元数据。
在非HA模式下,Secondary Namenode每隔一定时间检查Namenode上的fsimage和edits文件是否需要合并。触发条件主要由配置参数设定。Secondary Namenode下载最新的fsimage和所有edits文件到本地,加载到内存中进行合并,然后将合并后的fsimage上传到Namenode。
Secondary Namenode的作用有两个:加快Namenode启动和数据恢复。启动时,Namenode合并磁盘上的fsimage文件和edits文件,获取完整元数据。fsimage和edits文件过大,合并过程慢,导致HDFS长时间处于安全模式。SecondaryNamenode的情侣卡源码checkpoint机制可以缓解此问题。此外,当Namenode故障退出需要恢复时,可以从SecondaryNamenode的工作目录中复制fsimage恢复Namenode。但SecondaryNamenode合并后的更新操作的元数据会丢失,因此建议Namenode元数据文件夹放在多个磁盘进行冗余,降低数据丢失风险。
注意SecondaryNamenode在首次合并时需要从Namenode下载fsimage到本地。合并完成后,所持有的fsimage是最新的,无需再从Namenode处获取,只需获取edits文件即可。SecondaryNamenode将要合并的edits和fsimage拷贝到本地,反序列化到内存中计算合并。因此,通常需要将Namenode和SecondaryNamenode部署在不同机器上,且SecondaryNamenode服务器配置要求不低于Namenode。SecondaryNamenode不是Namenode的备服务器,主要职责是进行元数据的checkpoint。
NameNode HAå®ç°åç
åè¨ï¼å¨Hadoop 1.xçæ¬ï¼HDFSé群çNameNodeä¸ç´åå¨åç¹æ éé®é¢ï¼é群åªåå¨ä¸ä¸ªNameNodeèç¹ï¼å®ç»´æ¤äºHDFSææçå æ°æ®ä¿¡æ¯ï¼å½è¯¥èç¹æå¨æå¡å¨å®æºæè æå¡ä¸å¯ç¨ï¼æ´ä¸ªHDFSé群é½å°å¤äºä¸å¯ç¨ç¶æï¼æ大éå¶äºHDFSå¨ç产ç¯å¢çåºç¨åºæ¯ãç´å°Hadoop 2.0çæ¬ææåºäºé«å¯ç¨ (High Availability,国外诱导源码 HA) 解å³æ¹æ¡ï¼å¹¶ä¸ç»è¿å¤ä¸ªçæ¬çè¿ä»£æ´æ°ï¼å·²ç»å¹¿æ³åºç¨äºç产ç¯å¢ã解å³æ¹æ¡ï¼å¨åä¸ä¸ªHDFSé群ï¼è¿è¡ä¸¤ä¸ªäºä¸ºä¸»å¤çNameNodeèç¹ãä¸å°ä¸ºä¸»Namenodeèç¹ï¼å¤äºActiveç¶æï¼ä¸å°ä¸ºå¤NameNodeèç¹ï¼å¤äºStandbyç¶æãå ¶ä¸åªæActive NameNode对å¤æä¾è¯»åæå¡ï¼Standby NameNodeä¼æ ¹æ®Active NameNodeçç¶æååï¼å¨å¿ è¦æ¶åæ¢æActiveç¶æã
ãNameNode HAæ¶æå¾ã
HealthMonitor
å®æ¶è°ç¨NameNodeçHAServiceProtocol RPCæ¥å£(monitorHealthågetServiceStatus)ï¼çæ§NameNodeçå¥åº·ç¶æ并åZKFCåé¦ï¼
ActiveStandbyElector
æ¥æ¶ZKFCçé举请æ±ï¼éè¿Zookeeperèªå¨å®æ主å¤é举ï¼é举å®æååè°ZKFCç主å¤åæ¢æ¹æ³å¯¹NameNodeè¿è¡ActiveåStandbyç¶æçåæ¢ï¼
JouranlNodeé群
å ±äº«åå¨ç³»ç»ï¼è´è´£åå¨HDFSçå æ°æ®ï¼Active NameNode(åå ¥)åStandby NameNode(读å)éè¿å ±äº«åå¨ç³»ç»å®ç°å æ°æ®åæ¥ï¼å¨ä¸»å¤åæ¢è¿ç¨ä¸ï¼æ°çActive NameNodeå¿ é¡»ç¡®ä¿å æ°æ®åæ¥å®ææè½å¯¹å¤æä¾æå¡;
ZKFailoverControllerå¨å¯å¨æ¶åæ¶ä¼åå§åHealthMonitoråActiveStandbyElectoræå¡ï¼åæ¶ä¹ä¼åHealthMonitoråActiveStandbyElector注åç¸åºçåè°æ¹æ³ï¼
HealthMonitoræ£æµNameNodeç两类ç¶æï¼HealthMonitor.StateåHealthMonitor.HAServiceStatusãå¨ç¨åºä¸å¯å¨ä¸ä¸ªçº¿ç¨å¾ªç¯è°ç¨NameNodeçHAServiceProtocol RPCæ¥å£çæ¹æ³æ¥æ£æµNameNode çç¶æï¼å¹¶å°ç¶æçååéè¿åè°çæ¹å¼æ¥éç¥ZKFailoverControllerã
å½HealthMonitoræ£æµå°NameNodeçå¥åº·ç¶ææè§è²ç¶æåçååæ¶ï¼ZKFCä¼æ ¹æ®ç¶æçååå³å®æ¯å¦éè¦è¿è¡ä¸»å¤é举ã
HealthMonitor.Stateç¶æåå导è´çä¸ååç»æªæ½ï¼
HAServiceStatuså¨ç¶ææ£æµä¹ä¸ä» èµ·è¾ å©çä½ç¨ï¼å½HAServiceStatusåçååæ¶ï¼ZKFCä¼å¤æNameNodeè¿åçHAServiceStatusä¸ZKFCæææçæ¯å¦ç¸åï¼å¦æä¸ç¸åï¼ZKFCä¼è°ç¨ActiveStandbyElectorçquitElectionæ¹æ³å é¤å½åå·²ç»å¨ZKä¸å»ºç«ç临æ¶èç¹éåºä¸»å¤é举ã
ZKFCéè¿ActiveStandbyElectorçjoinElectionæ¹æ³åèµ·NameNodeç主å¤é举ï¼è¿ä¸ªè¿ç¨éè¿Zookeeperçåä¸è´æ§å临æ¶èç¹æºå¶å®ç°:
a.å½åèµ·ä¸æ¬¡ä¸»å¤é举æ¶ï¼Zookeeperä¼å°è¯å建临æ¶èç¹ /hadoop-ha/${ dfs.nameservices}/ActiveStandbyElectorLock ï¼Zookeeperçåä¸è´æ§ä¿è¯æç»åªä¼æä¸ä¸ªActiveStandbyElectorå建æåï¼å建æåç ActiveStandbyElector对åºçNameNodeå°±ä¼æ为主NameNodeï¼ActiveStandbyElectoråè°ZKFCçæ¹æ³å°å¯¹åºçNameNodeåæ¢ä¸ºActiveç¶æãèå建失败çActiveStandbyElector对åºçNameNodeæ为å¤NameNodeï¼ActiveStandbyElectoråè°ZKFCçæ¹æ³å°å¯¹åºçNameNodeåæ¢ä¸ºStandbyç¶æ;
b.ä¸ç®¡æ¯å¦é举æåï¼ææActiveStandbyElectoré½ä¼åZookeeper注åä¸ä¸ªWatcheræ¥çå¬è¿ä¸ªèç¹çç¶æååäºä»¶;
c.å¦æActive NameNode对åºçHealthMonitoræ£æµå°NameNodeç¶æå¼å¸¸æ¶ï¼ZKFCä¼å é¤å¨Zookeeperä¸å建ç临æ¶èç¹ActiveStandbyElectorLockï¼è¿æ ·å¤äºStandby NameNodeçActiveStandbyElector注åçWatcherå°±ä¼æ¶å°è¿ä¸ªèç¹ç NodeDeletedäºä»¶ãæ¶å°è¿ä¸ªäºä»¶åï¼ä¼é©¬ä¸å次å建ActiveStandbyElectorLockï¼å¦æå建æåï¼åStandby NameNode被é举为Active NameNodeã
ãé²æ¢èè£ã
å¨åå¸å¼ç³»ç»ä¸èè£å称为å主ç°è±¡ï¼ç±äºZookeeperçâåæ»âï¼é¿æ¶é´çåå¾åæ¶æå ¶å®åå é½å¯è½å¯¼è´åActive NameNodeç°è±¡ï¼æ¤æ¶ä¸¤ä¸ªNameNodeé½å¯ä»¥å¯¹å¤æä¾æå¡ï¼æ æ³ä¿è¯æ°æ®ä¸è´æ§ã对äºç产ç¯å¢ï¼è¿ç§æ åµçåºç°æ¯æ¯çæ§çï¼å¿ é¡»éè¿èªå¸¦çé离ï¼Fencingï¼æºå¶é¢é²è¿ç§ç°è±¡çåºç°ã
ActiveStandbyElector为äºå®ç°fencingé离æºå¶ï¼å¨æåå建 hadoop-ha/dfs.nameservices/ActiveStandbyElectorLock 临æ¶èç¹åï¼ä¼å建å¦å¤ä¸ä¸ª /hadoop−ha/{ dfs.nameservices}/ActiveBreadCrumb æä¹ èç¹ï¼è¿ä¸ªæä¹ èç¹ä¿åäºActive NameNodeçå°åä¿¡æ¯ãå½Active NameNodeå¨æ£å¸¸çç¶æä¸æå¼Zookeeper Session (注æç±äº /hadoop-ha/dfs.nameservices/ActiveStandbyElectorLock æ¯ä¸´æ¶èç¹ï¼ä¹ä¼éä¹å é¤)ï¼ä¼ä¸èµ·å é¤æä¹ èç¹ /hadoop−ha/{ dfs.nameservices}/ActiveBreadCrumb ãä½æ¯å¦æActiveStandbyElectorå¨å¼å¸¸çç¶æä¸å ³éZookeeper Sessionï¼é£ä¹ç±äº /hadoop-ha/${ dfs.nameservices}/ActiveBreadCrumb æ¯æä¹ èç¹ï¼ä¼ä¸ç´ä¿çä¸æ¥ãå½å¦ä¸ä¸ªNameNodeï¼standy => activeï¼é主æåä¹åï¼ä¼æ³¨æå°ä¸ä¸ä¸ªActive NameNodeéçä¸æ¥çActiveBreadCrumbèç¹ï¼ä»èä¼åè°ZKFailoverControllerçæ¹æ³å¯¹æ§çActive NameNodeè¿è¡fencingã
â é¦å ZKFCä¼å°è¯è°ç¨æ§Active NameNodeçHAServiceProtocol RPCæ¥å£çtransitionToStandbyæ¹æ³ï¼çè½å¦å°ç¶æåæ¢ä¸ºStandbyï¼
â¡ å¦æè°ç¨transitionToStandbyæ¹æ³åæ¢ç¶æ失败ï¼é£ä¹å°±éè¦æ§è¡Hadoopèªå¸¦çé离æªæ½ï¼Hadoopç®å主è¦æä¾ä¸¤ç§é离æªæ½ï¼
sshfenceï¼SSH to the Active NameNode and kill the processï¼
shellfenceï¼run an arbitrary shell command to fence the Active NameNodeï¼
åªæå¨æåå°æ§è¡å®æfencingä¹åï¼é主æåçActiveStandbyElectoræä¼åè°ZKFCçbecomeActiveæ¹æ³å°å¯¹åºçNameNodeåæ¢ä¸ºActiveï¼å¼å§å¯¹å¤æä¾æå¡ã
åå®¢ä¸»é¡µï¼ /u/ebbf
创帆云大数据教程2-搭建docker的hadoop:namenode及resourceManager
基于docker搭建namenode与resourceManger的教程
搭建步骤如下:
首先规划容器,Zookeeper已搭建完毕。
建立一个基础容器,使用已制作的镜像,包含SSH、hadoop3.0文件和JDK。镜像环境变量需提前配置。
配置核心文件:修改core-site.xml、hdfs-site.xml和mapred-site.xml,确保使用YARN框架执行MapReduce处理程序。注意,配置mapreduce.application.classpath参数避免运行时错误。
编辑yarn-site.xml并更新worker列表。
将配置好的基础容器提交为镜像,命名为hadoop:base。
使用hadoop:base镜像创建多个容器:nn1、nn2为namenode节点;jn1、jn2、jn3为journalnode节点;rm1、rm2为yarn节点;dd1、开源拼团源码dd2、dd3为datanode节点。
启动容器,以journalnode1为例,其他类似,调整共享目录和容器名称。
登录namenode主节点容器,格式化HDFS和ZKFC,启动HDFS。
在yarn节点上启动yarn服务。
验证HDFS和YARN,运行相应命令检查状态。
至此,namenode与resourceManger搭建完成,下节将讲解HBase部署。
原创-namenode配置Federation
1. 随着集群规模的扩大,达到上千节点,数据存储规模达到P左右,单namespace的性能瓶颈日益凸显。为解决这一问题,集群需配置多个namespace,即实施联邦(Federation)策略。
2. 目前共配置了三个namespace,以确保集群的高效运行。
3. 在配置dfs.namenode.shared.edits.dir属性时,需注意各value值的正确设置。对于其他两个namespace所在的namenode节点,分别应配置为testCluster和testCluster。
4. 在core-site.xml文件中,fs.defaultFS属性应配置为hdfs://testCluster,以指定默认访问的namespace。
5. 在规划的router节点上,通过执行命令hdfs --daemon start dfsrouter来启动联邦服务。服务默认端口为。启动后,可访问如下界面:
- hdfs dfsrouteradmin -add /testClusterRoot testCluster /
- hdfs dfsrouteradmin -add /testClusterRoot testCluster /
- hdfs dfsrouteradmin -add /testClusterRoot testCluster /
6. 具体操作语法命令可参考apache官网。
7. 客户端若希望通过router访问联邦集群,需在hdfs-site.xml文件中进行如下调整:添加新的namespace(testClusterFed),并配置高可用模式。注意,dfs.namenode.rpc-address.testClusterFed.r1属性应配置为router对应的服务,端口为。
8. 调整后,客户端即可通过命令hadoop fs -ls hdfs://testClusterFed/testClusterRoot来访问联邦集群。
2. Hadoop中的NameNode的作用是什么?
NameNode在Hadoop分布式文件系统(HDFS)中扮演着核心角色,它作为一个独立的服务器软件,负责整个系统的名称空间管理和客户端访问控制。它的主要职责是决定文件如何被分割成数据块,并决定这些块应存储在哪个DataNode上,以实现数据的冗余和容错性。通常,一个文件的三个复制块中,第一个在本地机架的不同节点,最后一个在不同机架的节点上存储,以确保数据的安全性。
NameNode在数据操作中并不直接参与实际的I/O,而是管理文件的元数据,如文件映射到DataNode的位置。当用户创建文件时,NameNode会响应提供文件块标识和第一个副本的DataNode IP地址,并通知其他副本的DataNode。为了保障数据的持久性和可靠性,FsImage文件存储着整个名称空间的信息,而EditLog记录所有事务,两份副本都存储在NameNode上,以防数据丢失。
然而,NameNode的单点故障问题是一个挑战,因为它是一个关键服务的集中点。传统的主备模式并不能解决这一问题。为了实现更高的可用性,Hadoop引入了Non-stop NameNode,以确保%的运行时间。NameNode的主要任务还包括维护文件系统的目录结构,以及记录每个文件块在DataNode的临时存储信息,这些信息在系统启动时由DataNode自行重建。
总的来说,NameNode在Hadoop中是至关重要的,它负责管理文件系统的核心逻辑,保证数据的安全、冗余和系统的稳定性。
hadoop入门之namenode工作特点介绍
namenode始终在内存中保存metedata(整个文件系统的目录结构,每个目录有哪些文件,每个文件有哪些分块及每个分块保存在哪个DataNode上),用于处理“读请求”(不需要修改内容)
到有“写请求”到来时,namenode会首先对metedata修改的内容写editlog到磁盘(每一次改变都会同步到磁盘。),成功返回后,才会修改内存,并且向客户端返回。客户端在写数据到每个datanode中。namenode在将metadata写到editlog的时候会同步到磁盘。
Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致(因为非常大),而是每隔一段时间通过合并editlog来更新内容。Secondary namenode就是用来更新fsimage的
secondary namenode的工作流程
1.Secondary通知primary切换editlog(目的合并editlog)
2.Secondary从primary获得fsimage和editlog(通过http)
3.Secondary将fsimage载入内存,然后开始合并editlog
4.Secondary将新的fsimage发回给primary
5.Primary用新的fsimage替换旧的fsimage
什么时候checkpiont?
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认秒。
fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是M。