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 ...]]

原文地址:https://www.cnblogs.com/kw28188151/p/8671342.html