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文件记录数据操作日志,jspxcms 完整源码通过日志可计算出内存元数据。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。