当前位置:   article > 正文

hadoop学习——hdfs指定tmp目录中内容的介绍_hdfs的tmp目录下存放的是什么

hdfs的tmp目录下存放的是什么

hadoop学习——hdfs指定tmp目录中内容的介绍

1、格式化

  已经知道,当执行hadoop格式化指令时,会在指定的tmp目录下,生成dfs目录。它下边具体如下:

[root@hadoop01 dfs]# ls
data  name  namesecondary

  • 1
  • 2
  • 3

  dfs/data目录,是datanode节点存储数据块的目录。

  dfs/namesecondary目录,对于以后集群中是没有用处的,只有伪分布式模式时才会有这个。所以不用关心这个。

  dfs/name目录,该目录会存储着namenode元数据信息。当格式化后,启动hdfs前,在dfs/name/current目录下,会生成一个最初的fsimage_0000000000000000000和类似的文件。具体如下:

[root@hadoop01 current]# ls
fsimage_0000000000000000000  fsimage_0000000000000000000.md5  seen_txid  VERSION
  • 1
  • 2

  fsimage该文件存储的是当前id前的快照数据,包括目录结构、节点信息等。fsimage存储的是整个HDFS的状态,元数据存储在fsimage文件中

  带md5的文件存储的就是对应的同名不带md5fsimage文件的验证和,如果修改了fsimage文件,可以通过md5文件校验和,如果两者不同,则表示已修改。

对文件 md5校验和 可以输入如下命令:
md5sum fsimage_0000000000000000000
  • 1
  • 2

  如果动了该文件,则namenode启动不成功。

  还有一个seed_txid记录是最新的edits_inprogress文件末尾的数字。edits开头的文件,只有在启动后,才会出现。

格式化的危险

  当执行格式化之后,相当于把tmp下的内容清除掉,以前的数据将不存在,另外重新更新了clusterID,该clusterID表示的是当前namenode的标识,如果它变了,那原本连接该namenodedatanode们将找不到它,当然可以将新的clusterID更新到每个datanode里,即可重新连接。

namespaceID=1702901649
clusterID=CID-47d78669-ad45-4fba-88d8-b523754ffab6 //namenode的标识
cTime=0
storageType=NAME_NODE
blockpoolID=BP-18504127-172.16.158.251-1544140849368
layoutVersion=-63
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、启动后

  当启动hdfs后,首先会在dfs/name下生成一个in_use.lock,这个文件的作用可以防止在同一台服务器上启动多个namenode,避免管理紊乱。如下:

[root@hadoop01 name]# ls
current  in_use.lock
  • 1
  • 2

  当启动hdfs后还会在name/current路径下,生成edits文件。如下:

[root@hadoop01 current]# ls
edits_0000000000000000001-0000000000000000002  fsimage_0000000000000000000      seen_txid
edits_inprogress_0000000000000000003           fsimage_0000000000000000000.md5  VERSION

  • 1
  • 2
  • 3
  • 4

  edit文件存储HDFS的操作记录,每次有事务操作时,edits会存储,相当于zookeeper的事务log文件。

  初次启动hdfs时,会有一个默认的editsfsimage的合并时间,达到1分钟之后会进行合并,之后就按照1小时的周期来进行合并。

  文件的命名最后的序号是递增的,每次合并一次即会从上一次合并点到当前时间点合并成一个文件

  在同目录下还有另一个文件即edits_inprogress_0000000000000000003。该文件的作用是记录当前正在执行的事务文件,后边的编号3是以上一次最大的txid+1。只要有操作,就会写到这样的文件里。

  当停止hdfs再启动hdfs时,底层会触发一次rollEdits指令,会触发END_LOG事务,才会在上一个文件中有END_LOG名,然后生成一个新的edits文件。

3、查看元数据文件

  如果想查看该文件,不能直接打开,都是乱码,需要输入下面的命令才能查看:

hdfs oev -i edits_0000000000001 -o edits.xml
hdfs oiv -i fsimage_000000000012 -o fsimage.xml -p XML
  • 1
  • 2

其中-i为输入文件,-o为输出文件。表示将该文件转换成xml等可读的文件。如果转换成功后,打开同目录下的edits.xml,打开成功后即可看到内容,具体如下:


<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
  <EDITS_VERSION>-63</EDITS_VERSION>
  <RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
    <DATA>
      <TXID>5</TXID>
    </DATA>
  </RECORD>
  <RECORD>
    <OPCODE>OP_END_LOG_SEGMENT</OPCODE>
    <DATA>
      <TXID>6</TXID>
    </DATA>
  </RECORD>
</EDITS>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

  如上图,hdfs有事务id的概念,当hdfs每接收一个事务操作(比如:mkdir put mv),都会分配响应的事务id,然后写到edits文件中。每生成一个这样的文件,edits文件中都会以START_LOG开头,当一个edits文件写完后,会以END_LOG结尾。即在START_LOGEND_LOG之间。

上传文件底层会拆分成如下事务:
1、OP_ADD将文件假如到指定的HDFS目录下,并以_copying结尾,表示此文件还未写完。
2、ALLOCATE_BLOCK_ID为文件分配块ID
3、SET_GENSTAMP_V2为块生成时间戳版本号,是全局唯一的。
4、ADD_BLOCK写块数据。
5、OP_CLOSE,表示块数据写完
6、OP_RENAME_OLD将文件重命名。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4、fsimage文件介绍

  文件和目录的元数据信息持久化存储到fsimage文件中,hdfs每次启动时从中将元数据加载到内存中构建目录结构树,之后的操作记录在edit log中,并定期将editfsimage合并刷到fsimage中。loadFSImage(File curFile)用于从fsimage中读入namenode持久化的信息。fsimage中保存的元数据信息格式如下,hdfs加载和写入时都按照该格式进行:

12345
ImageVersionNameSpaceIdNumFilesgenStamp
PathBlockNumsmtimeatime
BlokIdBlockSizeBlockNumBytesStorgeInfogenStamp
nsquotadsquotausernamegroupnamepermission

具体如下:

  1. ImageVersion Fsimage文件的版本号,每生成一个新的Fsimage文件,就会有一个版本号。
  2. NameSpaceId :namenode的命名空间id,用于标识namenode。每当执行一次格式执行令时,就会生成新的
  3. NumFiles:整个HDFS存储的文件数。
  4. genStamp:有目录创建的时间戳,块生成的时间戳。
  5. path:文件路径
  6. BlockNums:文件的块数量
  7. mtime:上传时间
  8. atime:访问时间
  9. BlockId:块编号
  10. BlockSize:切块大小(128MB)
  11. BlockNumBytes:块的实际大小
  12. StorgeInfo:块存储的datanode节点信息
  13. nsquota:目录的命名空间大小配合,默认是-1 表示目录可以无限存储
  14. dsquota:目录的磁盘空间存储配额,默认是-1
  15. username:目录的创建者
  16. groupname:目录创建者的属组
  17. permission:目录的权限

  HDFS启动时,会将这些信息读入内存之后,构造一个文件目录结构树,将表示文件或目录的节点填入到结构中。

5、写入操作(从文件级别来看)

  1. 如果有写入操作,则先将操作写到edits文件中。
  2. 如果edits文件写成功了。再将操作更新到内存中。为了防止操作产生丢失。
  3. 在内存中写入成功后,会给客户端一个成功的反馈。
  4. 在达到触发条件的时候,才会将操作更新到fsimage
  5. 内存中的元数据=edits+fsimage
触发条件:

1、文件大小:在hdfs中可以通过fs.checkpoint.size(在core-site.xml)控制文件的大小。这个属性默认是64m,意味着edits文件如果达到64m之后,就会触发合并。

2、定时更新:在hdfs中可以通过fs.checkpoint.period来控制更新时间,默认值是3600s,意味着每隔1个小时进行合并。

3、hdfs重启的时候,也会触发更新。–进入安全模式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/581534
推荐阅读
相关标签
  

闽ICP备14008679号