zoukankan      html  css  js  c++  java
  • Hadoop之HDFS

    1.HDFS的设计模式:分而治之,将大文件,分布式存放在大量的服务器上,以便使用分而治之的方式对海量数据进行运算分析和处理。

    2.大数据系统中的作用:为各类提供运算和存储。

    3.HDFS:采用文件分片,副本存储,将元数据存储在namenode中,将真正的数据块存储在datanode中

    4.HDFS是一个文件系统并且是分布式的,用于数据的存储,通过统一的命名空间,有多台机器提供个各种角色。

      HDFS中的文件分块存储的默认大小是128M,之前的版本是64M,这个参数可以通过配置文件进行设置

      HDFS通过抽象的统一的目录树,客户端可以通过路径来访问文件

      HDFS的元数据保存在NameNode中,将块存储在datanode中,namenode保存着每一个文件的块信息。

      HDFS是一次写入,多次写出,不可以进行修改的,但是可以追加。

       我之前以为可以做网盘,但是后来在单机测试的时候,比较慢,我以为是我电脑太垃圾,后来查资料,网上的资料也说不可以做,大致的理由如下

      首先它的延迟比较大,一次写入多次写出,不可以进行修改,网络开销大,并且成本也是很高的。

    5.HDFS的基本命令

    (1)显示文件下的目录:hadoop fs -ls /        解释:hadoop fs这个是hadoop中命令的格式, 斜杠是它的根目录

    (2)格式参数命令

     [-appendToFile <localsrc> ... <dst>]

            [-cat [-ignoreCrc] <src> ...]

            [-checksum <src> ...]

            [-chgrp [-R] GROUP PATH...]

            [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]

            [-chown [-R] [OWNER][:[GROUP]] PATH...]

            [-copyFromLocal [-f] [-p] <localsrc> ... <dst>]

            [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]

            [-count [-q] <path> ...]

            [-cp [-f] [-p] <src> ... <dst>]

            [-createSnapshot <snapshotDir> [<snapshotName>]]

            [-deleteSnapshot <snapshotDir> <snapshotName>]

            [-df [-h] [<path> ...]]

            [-du [-s] [-h] <path> ...]

            [-expunge]

            [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]

            [-getfacl [-R] <path>]

            [-getmerge [-nl] <src> <localdst>]

            [-help [cmd ...]]

            [-ls [-d] [-h] [-R] [<path> ...]]

            [-mkdir [-p] <path> ...]

            [-moveFromLocal <localsrc> ... <dst>]

            [-moveToLocal <src> <localdst>]

            [-mv <src> ... <dst>]

            [-put [-f] [-p] <localsrc> ... <dst>]

            [-renameSnapshot <snapshotDir> <oldName> <newName>]

            [-rm [-f] [-r|-R] [-skipTrash] <src> ...]

            [-rmdir [--ignore-fail-on-non-empty] <dir> ...]

            [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]

            [-setrep [-R] [-w] <rep> <path> ...]

            [-stat [format] <path> ...]

            [-tail [-f] <file>]

            [-test -[defsz] <path>]

            [-text [-ignoreCrc] <src> ...]

            [-touchz <path> ...]

            [-usage [cmd ...]]

    (3)-ls :显示目录信息         

    hadoop fs -ls /

    (4)mkdir:创建目录,如果多级目录使用 -p 

    创建一个目录
    hadoop fs -mkdir /kw
    
    创建二个目录
    hadoop fs -mkdir - p /kw

    (5)moveFromLocal :本地裁剪粘贴,HDFS裁剪粘贴

    hadoop fs -moveFromLocal /home/kw/kw.txt /kw/demo1
    hadoop fs -moveFromLocal /kw/demo1 /home/kw/kw.txt

    (6)appendToFile:追加一个文件到一个文件之后  【HDFS是可以修改的,不可以插入,只可以追加】

    hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop:9000/hello.txt

    (7)-cat显示内容

    hadoop  fs  -cat /hello.txt

    (8)-tail:显示文件末尾

    hadoop fs -tail /1.txt

    *(9)chgrp、chmod 、chown功能和Linux一样,主要是权限控制

    hadoop fs -chmod 666 /1.txt

    其他可以根据help进行测试练习。

    注意:有时候可以看到hdfs dfs -ls / :这种就是只适用于HDFS的命令。

    6.HDFS的工作机制

     知道原理可以解决使用中的一些问题。

    (1)概述:HDFS有两大角色:namenode和datanode,namenode负责整个文件系统的元数据信息,文件按照固定的大小切成若干的数据块,每一个块保存到系统不同的节点上,为了防止数据的丢失,和数据恢复,在datanode和namenode启动的时候向namenode报告信息,这个时候是安全模式,超过80%的时候就退出安全模式,也可以通过手动的设置退出安全模式,并且namenode接受客户端的请求。

    (2)客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件blockdatanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到blockdatanode负责向其他datanode复制block的副本。 

      详细流程:首先向namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在,如果不存在,namenode返回是否可以上传。

          Client请求发送第一个块,namenode返回第一个块上传的位置。

          client在本地个HDFS中集建立流通到,建立好之后,将第一个 block该传输到哪些datanode服务器上。

          client请求3dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端

          client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给BB传给C

          A每传一个packet会放入一个应答队列等待应答

          当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。  

     

    (3)客户端将要读取的文件路径发送给namenodenamenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件。

    代码实现上传:

        @Test
           public void fun1() throws IOException {
            Configuration configuration = new Configuration();
            FileSystem fileSystem = FileSystem.get(configuration);
           //数据是可以运行成功的,只不过没将数据复制到集群中,只是在本地的当前目录。 
        fileSystem.copyFromLocalFile(
    new Path("c:/1.txt"), new Path("/2.txt")); fileSystem.close(); }


    //如果需要将数据复制到集群中去,必须通过配置,然后将数据复制就可以将数据复制到集群中去。
    @Test public void fun1() throws Exception { FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.220.10:9000"), new Configuration(), "root"); fileSystem.copyFromLocalFile(new Path("c:/1.txt"), new Path("/2.txt")); fileSystem.close(); }

    测试下载:

    public void Down() throws IOException, InterruptedException, URISyntaxException
        {
            //得到一个文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.220.10:9000"), new Configuration(), "root");
            //上传文件
            fileSystem.copyToLocalFile(new Path("/2.txt"), new Path("D:/"));
            fileSystem.close();    
        }

    其他操作可以根据上面的魔板进行书写

     

     [-appendToFile <localsrc> ... <dst>]

            [-cat [-ignoreCrc] <src> ...]

            [-checksum <src> ...]

            [-chgrp [-R] GROUP PATH...]

            [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]

            [-chown [-R] [OWNER][:[GROUP]] PATH...]

            [-copyFromLocal [-f] [-p] <localsrc> ... <dst>]

            [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]

            [-count [-q] <path> ...]

            [-cp [-f] [-p] <src> ... <dst>]

            [-createSnapshot <snapshotDir> [<snapshotName>]]

            [-deleteSnapshot <snapshotDir> <snapshotName>]

            [-df [-h] [<path> ...]]

            [-du [-s] [-h] <path> ...]

            [-expunge]

            [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]

            [-getfacl [-R] <path>]

            [-getmerge [-nl] <src> <localdst>]

            [-help [cmd ...]]

            [-ls [-d] [-h] [-R] [<path> ...]]

            [-mkdir [-p] <path> ...]

            [-moveFromLocal <localsrc> ... <dst>]

            [-moveToLocal <src> <localdst>]

            [-mv <src> ... <dst>]

            [-put [-f] [-p] <localsrc> ... <dst>]

            [-renameSnapshot <snapshotDir> <oldName> <newName>]

            [-rm [-f] [-r|-R] [-skipTrash] <src> ...]

            [-rmdir [--ignore-fail-on-non-empty] <dir> ...]

            [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]

            [-setrep [-R] [-w] <rep> <path> ...]

            [-stat [format] <path> ...]

            [-tail [-f] <file>]

            [-test -[defsz] <path>]

            [-text [-ignoreCrc] <src> ...]

            [-touchz <path> ...]

            [-usage [cmd ...]]

  • 相关阅读:
    2014年工作总结
    正则表达式语法规则
    按照事务类型分析 DB2 事物的性能
    DB2定位锁等待
    深入研究线程池
    WebSphere应用服务器内存泄漏探测与诊断工具选择最佳实践
    一次WebSphere性能问题诊断过程
    WebSphere Application Server诊断和调优
    将 Spring 和 Hibernate 与 WebSphere Application Server 一起使用
    Websphere Application Server 环境配置与应用部署最佳实践
  • 原文地址:https://www.cnblogs.com/kw28188151/p/8671342.html
Copyright © 2011-2022 走看看