hdfs学习(小麦)

简介: hdfs

HDFS

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

HDFS优缺点

  • 优点

    • 高容错性

      • 数据自动保存多个副本。它通过增加副本的形式,提高容错性
      • 某一个副本丢失以后,它可以自动恢复
    • 适合处理大数据
    • 可构建在廉价机器上,通过多副本机制,提高可靠性
  • 缺点

    • 不适合低延时数据访问,比如毫秒级的存储数据
    • 无法高效的对大量小文件进行存储
    • 不支持并发写入、文件随机修改

HDFS组成架构

HDFS文件块大小

HDFS 中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x 版本中是 128M,老版本中是 64M。

如果寻址时间为 100ms,即查找目标 Block 的时间是 100ms。寻址时间与传输时间的比例为 100 : 1为最佳状态,因此传输时间为 1ms。目前磁盘的传输速率大概在 100MB/s,取个整大概就是 128MB。

客户端操作

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;

public class HdfsClient {

    FileSystem fileSystem = null;

    @Before
    public void init() {
        try {
            fileSystem = FileSystem.get(URI.create("hdfs://hadoop102:9000"), new Configuration(), "djm");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上传文件
     */
    @Test
    public void put() {
        try {
            fileSystem.copyFromLocalFile(new Path("C:\\Users\\Administrator\\Desktop\\Hadoop 入门.md"), new Path("/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载文件
     */
    @Test
    public void download() {
        try {
            // useRawLocalFileSystem表示是否开启文件校验
            fileSystem.copyToLocalFile(false, new Path("/Hadoop 入门.md"), 
                                       new Path("C:\\Users\\Administrator\\Desktop\\Hadoop 入门1.md"), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     */
    @Test
    public void delete() {
        try {
            // recursive表示是否递归删除
            fileSystem.delete(new Path("/Hadoop 入门.md"), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件重命名
     */
    @Test
    public void rename() {
        try {
            fileSystem.rename(new Path("/tmp"), new Path("/temp"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查看文件信息
     */
    @Test
    public void ls() {
        try {
            RemoteIterator<locatedfilestatus> listFiles = fileSystem.listFiles(new Path("/etc"), true);
            while (listFiles.hasNext()) {
                LocatedFileStatus fileStatus = listFiles.next();
                if (fileStatus.isFile()) {
                    // 仅输出文件信息
                    System.out.print(fileStatus.getPath().getName() + "   " + 
                                     fileStatus.getLen() + "   " + fileStatus.getPermission() + "   "  + fileStatus.getGroup() + "   ");
                    // 获取文件块信息
                    BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                    for (BlockLocation blockLocation : blockLocations) {
                        // 获取节点信息
                        String[] hosts = blockLocation.getHosts();
                        for (String host : hosts) {
                            System.out.print(host + "   ");
                        }
                    }
                    System.out.println();
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @After
    public void exit() {
        try {
            fileSystem.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

HDFS写数据流程

剖析文件写入

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

网络拓扑-节点距离计算

在HDFS写数据过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?

机架感知

HDFS机架感知

相关文章
|
6月前
|
存储 分布式计算 固态存储
我们一起学习Hdfs的异构存储
我们一起学习Hdfs的异构存储
|
8月前
|
机器学习/深度学习 缓存 分布式计算
Hadoop基础学习---4、HDFS写、读数据流程、NameNode和SecondaryNameNode、DataNode
Hadoop基础学习---4、HDFS写、读数据流程、NameNode和SecondaryNameNode、DataNode
|
8月前
|
存储 机器学习/深度学习 分布式计算
Hadoop基础学习---3、HDFS概述、HDFS的Shell操作、HDFS的API操作
Hadoop基础学习---3、HDFS概述、HDFS的Shell操作、HDFS的API操作
|
10月前
|
分布式计算 Hadoop 大数据
【大数据学习篇3】HDFS命令操作与MR单词统计
【大数据学习篇3】HDFS命令操作与MR单词统计
114 0
|
分布式计算 Hadoop Java
Hadoop学习(2)-java客户端操作hdfs及secondarynode作用
Hadoop学习(2)-java客户端操作hdfs及secondarynode作用首先要在windows下解压一个windows版本的hadoop 然后在配置他的环境变量,同时要把hadoop的share目录下的hadoop下的相关jar包拷贝到esclipe 然后Build Path 下面上代码 复制代码import java.
1002 0
|
存储 分布式数据库 数据库
一脸懵逼学习HBase---基于HDFS实现的。(Hadoop的数据库,分布式的,大数据量的,随机的,实时的,非关系型数据库)
1:HBase官网网址:http://hbase.apache.org/ 2:HBase表结构:建表时,不需要指定表中的字段,只需要指定若干个列族,插入数据时,列族中可以存储任意多个列(即KEY-VALUE,列名称-列值);一个value可以有多个版本,通过版本号来区分(时间戳) 3:要查询某一...
1439 0