知识点
相关文章
更多最近更新
更多HDFS中namenode部分概述
2019-03-28 14:01|来源: 网络
这是一张任何介绍hdfs的文章都会出现的架构图。采用的是master/slave模型,一个hdfs cluster包含一个NameNode和若干的DataNode,NameNode(以下简称nn)是master,主要负责管理hdfs文件系统,具体地包括namespace管理(其实就是目录结构),block管理(其中包括 filename->block,block->ddatanode list的对应关系)。nn提供的是始终被动接收服务的server,主要有三类协议接口:ClientProtocol接口、DatanodeProtocol接口、NamenodeProtocol接口,貌似还有一种,忘记了。DataNode(简称dn)主要是用来存储数据文件,hdfs将一个文件分割成一个个的block,这些block可能存储在一个DataNode上或者是多个DataNode上。dn负责实际的底层的文件的读写,如果客户端client程序发起了读hdfs上的文件的命令,那么首先将这些文件分成block,然后nn将告知client这些block数据是存储在那些dn上的,之后,client将直接和dn交互。
体系结构中还有个节点没画出来,Secondary NameNode,该部分主要是定时对NameNode进行数据snapshots进行备份,这样尽量降低NameNode崩溃之后,导致数据的丢失,其实所作的工作就是从nn获得fsimage和edits把二者重新合并然后发给nn,这样,既能减轻nn的负担又能保险地备份。
好了,下面开始正题。
不管是client还是dn的消息发到nn后最终都会落到FSnamesystem身上,这是一个重量级家伙,如图,对各种服务请求的处理都转交给它完成,它提供了对各种数据结构操作的接口,这些数据结构共同维护了整个namenode的元数据信息。
nn的主要数据结构有:
一个一个介绍。
FSdirectory:
FSDirectory存储整个文件系统的目录状态,对整个目录结构的管理通过调用FSImage和FSEditLog的方法从namenode本地磁盘读取元数据信息和向本地磁盘写入元数据信息,并登记对目录结构所作的修改到日志文件。另外,FSDirectory保存了文件名和数据块的映射关系。
INode是对文件系统目录结构中一个节点的抽象
INodeFile和INodeDirectory均继承自INode类,分别表示文件节点和目录节点。
INodeFile类中最重要的数据结构是BlockInfo blocks[],它记录了一个文件所包含的所有Block,成员方法的操作大都与Block相关
INodefileUnderConstruction表示正在都建的文件
INodeDirectory的关键数据结构是List<INode> children记录了目录下所有的子节点信息
INodeDirectoryWithQuota表示有配额限制的目录,根目录就是这种类型。
FSimage:
把文件和目录的元数据信息持久化地存储到fsimage文件中,每次启动时从中将元数据加载到内存中构建目录结构树,之后的操作记录在edits log中
定期将edits与fsimage合并刷到fsimage中
loadFSImage(File curFile)用于从fsimage中读入Namenode持久化的信息。fsimage中保存的元数据信息格式如下,hdfs加载和写入时都按照该格式进行
fsimage是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息,格式如下,这是网上流传的一张经典图,这是淘宝的一个师兄画的,拿来站沾光。
imageVersion(int)——image版本号
namespaceID(int)——命名空间ID,在namenode的生命期内保持不变,datanode注册时
返回作为其registrationID,每次和namenode通信时都要检查,不认识的namespaceID拒绝连接.
numFiles(16版以后long型)记录文件系统中的文件数
genstamp(long)生成image时间戳
下面是numFiles个文件(目录)信息:
path(String)文件或目录路径
replication(int)副本数,会调用FSEditLog.adjustReplication(replication);调整,目录的为0
mtime(long)修改时间
atime(long)访问时间
blockSize(long)块大小,目录是0
NumBlocks(int)文件包含的块数(imageVersion 9以后的版本numBlocks>=0时表示文件,之前的版本>0时表示文件),目录的为-1,saveINode2Image方法中可以看到
如果是文件,下面是NumBlocks个block的相关信息:
blockId(long):该文件的block的blockid,
numBytes(long):该block的大小
generationStamp(long):该block的时间戳
如果是目录,读入quota信息:
nsQuota(long)命名空间大小配额,默认-1
dsQuota(long)磁盘空间配额,默认-1
下面是权限相关
username(String)文件或目录的所属用户名
groupname(String)组名
permission(short)权限
如果前面的path.length==0,表示根目录,设置根目录的配额,修改时间,访问时间和权限信息。
将这些信息读入内存之后,构造一个文件目录结构树,将表示文件或目录的节点填入到结构中。
然后是加载datanode信息(新版已取消该项)
再之后是加载FilesUnderConstruction.
BlocksMap:
block->datanode的信息没有持久化存储,而是namenode通过datanode的blockreport获取block->datanode list
BlocksMap负责维护了三种信息:
block->datanode list
block->INodeFile
datanode->blocks
这要归功于一个很牛逼的结构:Object[] triplets
他是一个三元组,每个block有几个副本,就有几个三元组。三元组的第一个元素表示该block所属的Datanode,类型是DatanodeDescriptor,通过它获得
block->datanode list
第二/三个元素表示该block所在Datanode上的前/后一个block(前驱和后继),类型是BlockInfo,通过它获得datanode->blocks
借助这个三元组可以找到一个block所属的所有datanode,也可以通过三元组的后两个元素信息找到一个datanode上所有的block。
上面这两个结构介绍之后,nn需要的namespace信息和block信息基本就全了。在nn加载fsimage完成之后,BlocksMap中只有每个block到其所属的datanodes list的对应关系信息还没建立。然后通过dn的blockReport来收集构建。当所有的dn汇报给nn的blockReport处理完毕后,BlocksMap整个结构也就构建完成了。
相关问答
更多-
hadoop,hdfs的namenode中fsimage和edits的合并问题[2022-11-21]
这个不影响读取文件,读取的时候nn会去读取fsimage和edits两个文件来查找文件信息 -
试着回答: 先说明一下: 1. namenode负责管理目录和文件信息,真正的文件块是存放在datanode上。 2. 每个map和reduce(即task)都是java进程,默认是有单独的jvm的,所以不可能同一个类的对象会在不同节点上。 看你的描述是把namenode,datanode和jobtracker,tasktracker有点混了。 所以: 问题1. 分块存放在datanode上 问题2.inputformat是在datanode上,确切的说是在tasktracker中。每个map和reduce ...
-
当我删除[hadoop临时目录] / dfs / namesecondary目录时,我遇到了同样的错误。 对我来说[hadoop临时目录]是core-site.xml中hadoop.tmp.dir的值 I had the same error and it went when I deleted the [hadoop temporary directory] /dfs/namesecondary directory. For me [hadoop temporary directory] is the v ...
-
最重要的是名称节点中的META数据。 数据节点可能具有副本形式的数据副本。 但是如果删除或更改了namenode .META,那么数据应该丢失,因为它是格式化命令。 The most important thing is the META data in your name node. Data nodes might have a copy of the data in the form of replicas. But If the namenode .META is deleted or altere ...
-
格式化hdfs上的namenode后如何格式化datanodes?(How to format datanodes after formatting the namenode on hdfs?)[2022-01-29]
你之前的datanode目录现在已经陈旧了,是的。 您需要手动遍历每个datanode并删除这些目录的内容。 通过Hadoop CLI没有这样的格式命令 默认情况下,数据节点目录是/ tmp下的单个文件夹 否则,您已将XML文件配置在存储数据的位置 HDFS存储数据的地方 Your previous datanode directories are now stale, yes. You need to manually go through each datanode and delete the con ... -
下载osquery https://code.facebook.com/projects/658950180885092 并安装 发出这个命令osqueryi 当出现提示时,使用此sql命令查看所有正在运行的java进程并找到pids SELECT名称,路径,pid FROM进程,其中name =“java”; 你会在Mac上看到这样的东西 +------+-------------------------------------------------------------------------- ...
-
Hadoop Namenode HA和HDFS联合有什么区别(What is difference between Hadoop Namenode HA and HDFS federation)[2023-06-29]
HDFS高可用性和HDFS联合之间的主要区别在于联合中的名称节点彼此不相关。 在HDFS联合中,所有名称节点共享一个元数据池,其中每个名称节点都有自己的池,因此提供了容错功能,即如果联合中的一个名称节点失败,则不会影响其他名称节点的数据。 所以,Federation =多个名称节点,没有相关性。 在HDFS HA的情况下,有两个名称节点 - 主NN和备用NN。 主NN每次都很努力,而Standby NN只是坐在那里,并且偶尔会对主要Namenode的元数据进行冷却和更新,这使得它们相关。 当主要NN厌倦了这 ... -
检查你的/etc/hosts文件,格式应如下所示 127.0.0.1 localhost localhost 192.168.10.11 abc.com abc 192.168.10.12 xyz.com xyz 并检查您的机器hostname Check your /etc/hosts file, format should be like below 127.0.0.1 localhost localhost 192.168.10.11 abc.com ...
-
有些事情是严重错误的。 请检查namenode写入的图像和编辑文件会发生什么。 如果他们没问题 - NameNode可以启动。 另外......存储NN数据的最后一个地方是HDFS - 因为你会得到鸡蛋和鸡肉的问题。 无法访问NN数据HDFS。 Something is seriously wrong. Please check what happen with image and edits file written by namenode. If they are ok - NameNode can s ...
-
理想名称节点内存大小大约是元数据的元数据+操作系统+守护进程大小和处理相关数据的20-30%空间。 您还应该考虑数据进入群集的速率。 如果您有1TB /天的数据,那么您必须考虑更大的内存驱动器,否则您很快就会耗尽内存。 它始终建议在任何时候至少有20%的内存空闲。 这有助于避免名称节点进入完整的垃圾收集。 正如Marco先前指出的那样,您可以参考NameNode垃圾收集配置: GC配置的最佳实践和基本原理 。 在你的情况下256如果你不会获得大量数据并且不会对现有数据进行大量操作,那么看起来很好。 请参阅: ...