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

  • 相关阅读:
    mysql 的安装
    nginx的安装
    修改网站默认目录
    配置yum仓库 安装httpd服务
    安装 VMware Tools
    phpstrom + xdebug 断点调试
    公网IP访问服务器
    mysql in操作和find_in_set函数
    网页授权有时候获取不到openid 的坑
    解决Required Integer parameter 'id' is not present的一种方法
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8870736.html
Copyright © 2020-2023  润新知