深入分析hadoop hdfs命令之touchz
Posted 健哥说编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入分析hadoop hdfs命令之touchz相关的知识,希望对你有一定的参考价值。
touchz命令
在HDFS dfs中,touchz命令会在dfs文件系统中创建一个空的文件,即字节为0的文件。但此时,这个文件在datanode上并不会创建,真到写入数据后,这个文件才会存在。
可见,touchz只会在NameNode的editslog中写入存在此文件的信息,并不会形成真实的文件。
如首先通过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> 此ID是fsimage中INODEID+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,add和close。每个事务都拥有独立的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]]
通过上面的代码,就可以很清楚的看到 编号为0的block块保存在三个不同的节点上。
结论:
touchz 创建的文件,只会写edits日志文件,当没有数据时,不会存在于DataNode上。
只有有数据以后,才会真实的形成block块,保存到不同的DataNode节点上。
以上是关于深入分析hadoop hdfs命令之touchz的主要内容,如果未能解决你的问题,请参考以下文章