Hadoop笔记2 HDFS

HDFS

在一个操作系统中可能存不下海量的数据,那么可以将其分配到更多的操作系统管理的磁盘中,但是不方便管理和维护。
分布式文件管理系统可以管理多台机器上的文件,HDFS就是一种分布式文件管理系统。
HDFS:Hadoop Distributed File System
它是一个文件系统,用于存储文件,通过目录树来定位文件,其次,它是分布式的,由很多台服务器联合起来实现其功能,集群中的服务器有各自的角色。
适合一次写入,多次读取的场景,不支持文件的修改。

优点:
高容错(副本机制)
适合处理大数据
可构建在廉价机器上

缺点:
不适合低延时数据访问
无法对大量小文件有效存储(浪费大量NameNode内存空间)
不支持并发写入,随机修改(支持文件追加)

架构

在这里插入图片描述
要避免大量的小文件。

Client: 就是客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一 个- -个的Block, 然后进行上传;
(2)与NameNode交互, 获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4) Client提供一 -些命令 来管理HDFS,比如NameNode格式化;
(5) Client可以通过一 -些命令来访问HDFS,比如对HDFS增删查改操作;

Secondary NameNode:并非NameNode的热备。 当NameNode挂掉的时候, 它并不
能马.上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;
(2)在紧急情况下,可辅助恢复NameNode。

块大小

HDFS的文件在物理存储上是分块存储,可以通过参数(dfs.blocksize)配置,大小主要取决于磁盘传输速率,
2.x默认为128M,1.x为64M

shell指令

hadoop fs

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

API操作

mvn

 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.2</version>
        </dependency>
    </dependencies>

上传

@Test
    public void uploadTest() throws URISyntaxException, IOException, InterruptedException {
        Configuration configuration = new Configuration();
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://bigdata01:9000"),configuration,"root");

        fileSystem.copyFromLocalFile(false ,new Path("D:/bigdata/floor.txt"),new Path("/user/bigdata/floor.txt"));
        fileSystem.close();
        System.out.println("ok");
    }

下载

 @Test
    public void downloadTest()throws URISyntaxException, IOException, InterruptedException{
        Configuration configuration = new Configuration();
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://bigdata01:9000"),configuration,"root");

        fileSystem.copyToLocalFile(false,new Path("/client/test/"),new Path("C:/Users/zjj/Desktop/2.txt"),true);
        fileSystem.close();
        System.out.println("ok");

    }

获取文件信息

 @Test
    public void listFilesTest()throws URISyntaxException, IOException, InterruptedException
    {
        Configuration configuration = new Configuration();
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://bigdata01:9000"),configuration,"root");

        RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/client"), true);
        while (iterator.hasNext())
        {
           LocatedFileStatus item = iterator.next();
           System.out.println(item.getPath());
           System.out.println(item.getOwner());
           System.out.println(item.getAccessTime());
           System.out.println(item.getBlockLocations());
           System.out.println(item.getPermission());
           System.out.println(item.getLen());

            BlockLocation[] blockLocations = item.getBlockLocations();
            for (BlockLocation blockLoaction:blockLocations)
            {
                System.out.println(blockLoaction.getNames());
                System.out.println(blockLoaction.getLength());
                System.out.println(blockLoaction.getTopologyPaths());
                System.out.println(blockLoaction.getHosts());
            }
        }
    }

文件夹删除

 @Test
    public void delTest()throws URISyntaxException, IOException, InterruptedException{
        Configuration configuration = new Configuration();
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://bigdata01:9000"),configuration,"root");

        fileSystem.delete(new Path("/0508/"), true);
        fileSystem.close();
        System.out.println("ok");

    }

文件名更改

 @Test
    public void renameTest()throws URISyntaxException, IOException, InterruptedException{
        Configuration configuration = new Configuration();
        FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://bigdata01:9000"),configuration,"root");

        fileSystem.rename(new Path("/banzhang.txt"), new Path("/banhua.txt"));
        fileSystem.close();
        System.out.println("ok");

    }

判断是文件还是文件夹

@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException{
	Configuration configuration = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"), configuration, "root");
		
	FileStatus[] listStatus = fs.listStatus(new Path("/"));
	for (FileStatus fileStatus : listStatus) {
		if (fileStatus.isFile()) {
				System.out.println("f:"+fileStatus.getPath().getName());
			}else {
				System.out.println("d:"+fileStatus.getPath().getName());
			}
		}
	fs.close();
}

写数据流程

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

读数据流程

1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

副本节点选择

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication

For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack, another on a different node in the local rack, and the last on a different node in a different rack.

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值