深入分析hadoop hdfs命令之touchz

Posted 健哥说编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入分析hadoop hdfs命令之touchz相关的知识,希望对你有一定的参考价值。


touchz命令

HDFS dfs中,touchz命令会在dfs文件系统中创建一个空的文件,即字节为0的文件。但此时,这个文件在datanode上并不会创建,真到写入数据后,这个文件才会存在。

可见,touchz只会在NameNodeeditslog中写入存在此文件的信息,并不会形成真实的文件。

 

如首先通过touchz创建一个文件:

[wangjian@hadoop31 app]$ hdfs dfs -touchz /a.txt

查看这个文件,确实存在三个副本:

[wangjian@hadoop31 app]$ hdfs dfs -ls /

Found 1 items

-rw-r--r--   3 wangjian supergroup          0 2018-04-08 15:30 /a.txt

 

现在查看任意的DataNode节点的下的文件,并没有发现这个文件:

[wangjian@hadoop31 finalized]$ pwd

/app/datas/datanode-data-dir/current/BP-1582249714-192.168.56.31-1523158779602/current/finalized

[wangjian@hadoop31 finalized]$ ll

总用量 0

 

查看edits的信息:

[wangjian@hadoop31 current]$ ls

edits_inprogress_0000000000000000001  fsimage_0000000000000000000  fsimage_0000000000000000000.md5  seen_txid  VERSION

 

edits log文件转成xml文件并查看里面的内容,以下是转换:

[wangjian@hadoop31 current]$ hdfs oev -i /app/datas/namenode-name-dir/current/edits_inprogress_0000000000000000001 -o ~/02.xml -p XML

[wangjian@hadoop31 current]$ sz ~/02.xml

[wangjian@hadoop31 current]$

 

查看XML里面的内容:(请仔细阅读,你一定会有所收获,部分信息将为您标注)

<?xml version="1.0" encoding="UTF-8"?>

<EDITS>

  <EDITS_VERSION>-63</EDITS_VERSION>

  <RECORD>

    <OPCODE>OP_START_LOG_SEGMENT</OPCODE> 开始一个片段

    <DATA>

      <TXID>1</TXID> 事务ID

    </DATA>

  </RECORD>

  <RECORD>

    <OPCODE>OP_ADD</OPCODE>

    <DATA>

      <TXID>2</TXID>事务ID

      <LENGTH>0</LENGTH> 文件大小0,即长度

      <INODEID>16386</INODEID> IDfsimageINODEID+1获取的值

      <PATH>/a.txt</PATH>  路径

      <REPLICATION>3</REPLICATION> 副本数量

      <MTIME>1523172613147</MTIME>

      <ATIME>1523172613147</ATIME>

      <BLOCKSIZE>134217728</BLOCKSIZE> 块大小

      <CLIENT_NAME>DFSClient_NONMAPREDUCE_1905259059_1</CLIENT_NAME>

      <OVERWRITE>true</OVERWRITE>

      <PERMISSION_STATUS> 权限信息

        <USERNAME>wangjian</USERNAME>

        <GROUPNAME>supergroup</GROUPNAME>

        <MODE>420</MODE>

      </PERMISSION_STATUS>

      <RPC_CLIENTID>bd9d5560-bee5-41b0-a1b5-0d246728dec4</RPC_CLIENTID>

      <RPC_CALLID>2</RPC_CALLID>

    </DATA>

  </RECORD>

  <RECORD>

    <OPCODE>OP_CLOSE</OPCODE>

    <DATA>

      <TXID>3</TXID>

      <LENGTH>0</LENGTH>

      <INODEID>0</INODEID>

      <PATH>/a.txt</PATH>

      <REPLICATION>3</REPLICATION>

      <MTIME>1523172613224</MTIME>

      <ATIME>1523172613147</ATIME>

      <BLOCKSIZE>134217728</BLOCKSIZE>

      <CLIENT_NAME></CLIENT_NAME>

      <CLIENT_MACHINE></CLIENT_MACHINE>

      <OVERWRITE>false</OVERWRITE>

      <PERMISSION_STATUS>

        <USERNAME>wangjian</USERNAME>

        <GROUPNAME>supergroup</GROUPNAME>

        <MODE>420</MODE>

      </PERMISSION_STATUS>

    </DATA>

  </RECORD>

</EDITS>

 

通过上面的日志,可知,touchz操作一个文件,可以分为三个tx 事务。分别是start,addclose。每个事务都拥有独立的txid

 

现在我们查看dataNode节点下是否已经存在这个文件:/a.txt

[wangjian@hadoop31 finalized]$ pwd

/app/datas/datanode-data-dir/current/BP-1582249714-192.168.56.31-1523158779602/current/finalized

[wangjian@hadoop31 finalized]$ ll

总用量 0

 

通过查看可知,在文件内容为0字节的情况下,数据信息只保存在NameNode的元数据中,在DataNode下并没有任何关于此文件的块信息。

 

现在让我们再查看fsimage中的数据:

执行以下命令,将fsimage数据转成XML文件:

[wangjian@hadoop31 current]$ hdfs oiv -i fsimage_0000000000000000000 -o ~/003.xml -p XML

 

然后查看003.xml文件中的内容,并没有/a.txt的内容:

<?xml version="1.0"?>

<fsimage><NameSection>

<genstampV1>1000</genstampV1><genstampV2>1000</genstampV2><genstampV1Limit>0</genstampV1Limit><lastAllocatedBlockId>1073741824</lastAllocatedBlockId><txid>0</txid></NameSection>

<INodeSection><lastInodeId>16385</lastInodeId><inode><id>16385</id><type>DIRECTORY</type><name></name><mtime>0</mtime><permission>wangjian:supergroup:rwxr-xr-x</permission><nsquota>9223372036854775807</nsquota><dsquota>-1</dsquota></inode>

</INodeSection>

<INodeReferenceSection></INodeReferenceSection><SnapshotSection><snapshotCounter>0</snapshotCounter></SnapshotSection>

<INodeDirectorySection></INodeDirectorySection>

<FileUnderConstructionSection></FileUnderConstructionSection>

<SecretManagerSection><currentId>0</currentId><tokenSequenceNumber>0</tokenSequenceNumber></SecretManagerSection><CacheManagerSection><nextDirectiveId>1</nextDirectiveId></CacheManagerSection>

</fsimage>

可见,此时edits中的数据,还没有被持久化到fsimage文件中,目前应该是在内存的fsimage中存在。

 

查看block信息:

$ hdfs fsck /a.txt -files -blocks -locations

Connecting to namenode via http://hadoop31:50070/fsck?ugi=wangjian&files=1&blocks=1&locations=1&path=%2Fa.txt

FSCK started by wangjian (auth:SIMPLE) from /192.168.56.31 for path /a.txt at Sun Apr 08 15:57:52 CST 2018

/a.txt 0 bytes, 0 block(s):  OK

 

 

现在我们重新启动一个hdfs

Stop-dfs.sh

然后再重新启动:

Start-dfs.sh

 

然后再次查看edits中的数据:

[wangjian@hadoop31 current]$ hdfs oev -i edits_0000000000000000001-0000000000000000003 -o ~/041.xml -p XML

[wangjian@hadoop31 current]$ sz ~/041.xml

没有任何的变化.

 

再次查看fsimage中的数据,也没有任何的变化:

[wangjian@hadoop31 current]$ hdfs oiv -i fsimage_0000000000000000000 -o ~/051.xml -p XML

 

现在我们写入一些数据:

[wangjian@hadoop31 current]$ hdfs dfs -appendToFile - /a.txt

Jak

Jack

Mary

Rose

可以通过Ctrl+C停止输入:

[wangjian@hadoop31 current]$ hdfs dfs -cat /a.txt

Jak

Jack

Mary

Rose

 

现在查看在各DataNode真实的磁盘下是否已经保存了数据:

[wangjian@hadoop31 subdir0]$ pwd

/app/datas/datanode-data-dir/current/BP-1582249714-192.168.56.31-1523158779602/current/finalized/subdir0/subdir0

[wangjian@hadoop31 subdir0]$ ll

总用量 8

-rw-rw-r--. 1 wangjian wangjian 19 4月   8 16:09 blk_1073741825

-rw-rw-r--. 1 wangjian wangjian 11 4月   8 16:09 blk_1073741825_1001.meta

 

可见已经有块的信息了。

[wangjian@hadoop31 subdir0]$ cat blk_1073741825

Jak

Jack

Mary

Rose

由于数据并不多,所以这个块里面保存了a.txt中的所有数据。查看其他DataNode相同Linux目录下,也保存了相同的信息。

 

查看edits日志文件,通过查看已经发出有了两个日志文件:

[wangjian@hadoop31 current]$ pwd

/app/datas/namenode-name-dir/current

[wangjian@hadoop31 current]$ ll

总用量 2076

-rw-rw-r--. 1 wangjian wangjian 1048576 4月   8 15:30 edits_0000000000000000001-0000000000000000003

-rw-rw-r--. 1 wangjian wangjian      42 4月   8 16:09 edits_0000000000000000004-0000000000000000005

-rw-rw-r--. 1 wangjian wangjian 1048576 4月   8 16:09 edits_inprogress_0000000000000000006

-rw-rw-r--. 1 wangjian wangjian     325 4月   8 15:24 fsimage_0000000000000000000

-rw-rw-r--. 1 wangjian wangjian      62 4月   8 15:24 fsimage_0000000000000000000.md5

-rw-rw-r--. 1 wangjian wangjian     395 4月   8 16:09 fsimage_0000000000000000005

-rw-rw-r--. 1 wangjian wangjian      62 4月   8 16:09 fsimage_0000000000000000005.md5

-rw-rw-r--. 1 wangjian wangjian       2 4月   8 16:09 seen_txid

-rw-rw-r--. 1 wangjian wangjian     206 4月   8 15:24 VERSION

 

 

通过fsck检查文件块信息:

$ hdfs fsck /a.txt -files -locations -blocks

Connecting to namenode via http://hadoop31:50070/fsck?ugi=wangjian&files=1&locations=1&blocks=1&path=%2Fa.txt

FSCK started by wangjian (auth:SIMPLE) from /192.168.56.31 for path /a.txt at Sun Apr 08 16:36:37 CST 2018

/a.txt 19 bytes, 1 block(s):  OK

0. BP-1582249714-192.168.56.31-1523158779602:blk_1073741825_1001 len=19 repl=3 [DatanodeInfoWithStorage[192.168.56.32:50010,DS-b88ec783-ce92-4cb9-b433-4b9eba8a04bc,DISK], DatanodeInfoWithStorage[192.168.56.33:50010,DS-fc96c5c6-bcb0-4f30-a6ed-2b7e0d03268b,DISK], DatanodeInfoWithStorage[192.168.56.31:50010,DS-96c8025b-5397-4ecc-ac26-6463e645fd56,DISK]]

 

通过上面的代码,就可以很清楚的看到 编号为0block块保存在三个不同的节点上。

 

结论:

  touchz 创建的文件,只会写edits日志文件,当没有数据时,不会存在于DataNode上。

  只有有数据以后,才会真实的形成block块,保存到不同的DataNode节点上。

 

 


以上是关于深入分析hadoop hdfs命令之touchz的主要内容,如果未能解决你的问题,请参考以下文章

大数据之hadoop深入学习

深入理解Hadoop之HDFS架构

Hadoop之深入HDFS原理<一>

深入理解HDFS 一

HDFS命令实现分析

Hadoop之HDFS原理及文件上传下载源码分析(下)