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通信以确认可以写文件并获得接收文件block的datanode,然后,客户端按顺序将文件逐个block传递给相应datanode,并由接收到block的datanode负责向其他datanode复制block的副本。
详细流程:首先向namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在,如果不存在,namenode返回是否可以上传。
Client请求发送第一个块,namenode返回第一个块上传的位置。
client在本地个HDFS中集建立流通到,建立好之后,将第一个 block该传输到哪些datanode服务器上。
client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;
A每传一个packet会放入一个应答队列等待应答
当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。
(3)客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是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 ...]]