datanode的作用:
(1)提供真實文件數據的存儲服務。
(2)文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序對文件進行划分並編號,划分好的每一個塊稱一個Block。HDFS默認Block大小是128MB,以一個256MB文件,共有256/128=2個Block.
配置在hdfs-site.xml中配置: dfs.block.size
(3)不同於普通文件系統的是,HDFS中,如果一個文件小於一個數據塊的大小,並不占用整個數據塊存儲空間Replication。多復本。默認是三個。也可以在hdfs-site.xml中配置:
如下修改副本數量為1(因為只有一個節點):
<property> <name>dfs.replication</name> <value>1</value> </property>
下面進行測試:
(1)首先刪除hdfs所有的所有文件:
[root@localhost ~]# hadoop fs -ls hdfs://localhost:9000/ Found 4 items -rwxrwxrwx 1 hadoop supergroup 37667 2018-04-11 03:29 hdfs://localhost:9000/install.log drwx------ - root supergroup 0 2018-04-11 03:54 hdfs://localhost:9000/tmp drwxr-xr-x - root supergroup 0 2018-04-11 03:54 hdfs://localhost:9000/user drwxr-xr-x - root supergroup 0 2018-04-11 05:35 hdfs://localhost:9000/wordcount [root@localhost ~]# hadoop fs -rm -r hdfs://localhost:9000/* #刪除文件 18/04/17 07:36:47 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted hdfs://localhost:9000/install.log 18/04/17 07:36:47 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted hdfs://localhost:9000/tmp 18/04/17 07:36:47 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted hdfs://localhost:9000/user 18/04/17 07:36:47 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes. Deleted hdfs://localhost:9000/wordcount [root@localhost ~]# hadoop fs -ls hdfs://localhost:9000/ [root@localhost ~]#
(2)上傳一個文件:
[root@localhost java]# ll total 140228 drwxr-xr-x. 8 uucp 143 4096 Jun 16 2014 jdk1.7.0_65 -rw-r--r--. 1 root root 143588167 Apr 10 21:18 jdk-7u65-linux-i586.tar.gz [root@localhost java]# hadoop fs -put ./jdk-7u65-linux-i586.tar.gz / #上傳文件到hdfs根目錄 [root@localhost java]# hadoop fs -ls / Found 1 items -rw-r--r-- 1 root supergroup 143588167 2018-04-17 07:41 /jdk-7u65-linux-i586.tar.gz
(3)到本地hdfs存放文件的地方查看文件:
[root@localhost finalized]# pwd #hdfs存放文件的地方 /opt/hadoop/hadoop-2.4.1/data/dfs/data/current/BP-1623988768-127.0.0.1-1523440267982/current/finalized [root@localhost finalized]# ll #查看文件 total 141324 -rw-r--r--. 1 root root 134217728 Apr 17 07:41 blk_1073741855 -rw-r--r--. 1 root root 1048583 Apr 17 07:41 blk_1073741855_1031.meta -rw-r--r--. 1 root root 9370439 Apr 17 07:41 blk_1073741856 -rw-r--r--. 1 root root 73215 Apr 17 07:41 blk_1073741856_1032.meta
(1)發現/opt/hadoop/hadoop-2.4.1/data/dfs/data/current/BP-1623988768-127.0.0.1-1523440267982/current/finalized是hdfs存放文件的路徑。
(2)存放的文件以blk_blkId命名,且一個文件對應一個元數據信息,且同一個文件的不同blk的blkId(block ID)是連續的。上面上傳的文件被分成2個block
(3)上面的blk_1073741855是第一個block,大小為134217728,計算:134217728/1024/1024=128,也就是第一個blk的大小正好的128M。加上下面的blk正好是文件的大小
或者
以下面這種方式查看文件大小:
[root@localhost finalized]# du -h ./* 128M ./blk_1073741855 1.1M ./blk_1073741855_1031.meta 9.0M ./blk_1073741856 72K ./blk_1073741856_1032.meta
(4)實際上block就是文件,只是因為文件被拆分,所以如果我們如果將文件合並就可以像處理原始文件一樣處理文件。這也是hdfs的機制,將文件按默認塊大小分割開,最后按照順序將塊合並組成源文件。
將文件拷貝到用戶工作目錄:
[root@localhost finalized]# cp ./blk_1073741855 ~/ [root@localhost finalized]# cp ./blk_1073741856 ~/
合並兩個block並查看合並后的文件大小:(合並后的大小等於上傳的源文件大小)
[root@localhost ~]# cat ./blk_1073741856 >> ./blk_1073741855 #合並文件 [root@localhost ~]# ll | grep blk -rw-r--r--. 1 root root 143588167 Apr 17 07:54 blk_1073741855 -rw-r--r--. 1 root root 9370439 Apr 17 07:53 blk_1073741856
查看文件類型並且解壓縮文件:
[root@localhost ~]# file ./blk_1073741855 #查看文件類型 ./blk_1073741855: gzip compressed data, from Unix, last modified: Mon Jun 16 20:50:25 2014 [root@localhost ~]# tar -zxvf ./blk_1073741855
解壓縮后結果:
[root@localhost ~]# ls anaconda-ks.cfg blk_1073741855 blk_1073741856 install.log install.log.syslog jdk1.7.0_65 startHadoop.sh test [root@localhost ~]# pwd /root [root@localhost ~]# cd jdk1.7.0_65/bin/ [root@localhost bin]# ./java -version java version "1.7.0_65" Java(TM) SE Runtime Environment (build 1.7.0_65-b17) Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode)
總結:
datanode實際上是將文件按block分開,每個block的大小可以設定,默認每個block為128M(一個block對應一個meta元數據信息),也就是如果文件不夠128M是一個block,如果是129M就會被分成兩個block(第一個128M,第二個1M)。當我們訪問文件的時候,hdfs會將block按順序合並之后返回給我們,我們也就得到完整的文件。