zoukankan      html  css  js  c++  java
  • hdfs的datanode工作原理

    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按顺序合并之后返回给我们,我们也就得到完整的文件。

  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8870736.html
Copyright © 2011-2022 走看看