Hadoop大数据组件——HDFS

HDFS的优缺点

1.优点

1.高容错性:数据可字宗保存多个副本,通过增加副本的形式,提高容错性。
2.适合处理大数据:数据规模可达到GB,TB甚至是PB级的大数据。文件规模可达到百万。
3.可构建在廉价机器上:通过多副本机制,提高可靠性。

2.缺点

1.不适合低延时数据的访问:毫秒级的存储数据时难以实现的。
2.无法高效对大量小文件进行存储。小文件存储的寻址时间会超过读取时间,违反了HDFS的设计目标。同时数据块占用大量内存,而NameNode内存有限。
3.不支持并发写入,文件随即修改。一个人间只能读,不允许多线程同时写,仅支持数据追加操作。

HDFS组成架构

NameNode

1.管理HDFS命名空间
2.配置副本策略
3.管理数据块信息
4.处理客户端读写请求

secondaryNameNode

1.辅助NameNode定期合并Fsimage和Edits文件,并推送至NameNode

DataNode

1.存储十几的数据块
2.执行读写操作
3.向NameNode定期发送心跳

HDFS的文件块大小

1.hadoop1.x版本中,一个block的大小为64M
2.hadoop2.x/hadoop3.x版本中,一个block的大小为128M

文件块大小可调,但如果文件块太小,则会增加寻址时间,减慢HDFS读写速度;若文件快太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需时间,同样会减慢HDFS读写速度。

HDFS Shell操作

常用命令列表

1.hdfs dfs -ls /
2.hdfs dfs -mkdir [hdfsPath]
3.hdfs dfs -put [localPath] [hdfsPath]
4.hdfs dfs -moveFromLocal [localPath] [hdfsPath]
5.hdfs dfs -coprFromLocal [localPath] [hdfsPath]
6.hdfs dfs -appendToFile [localPath] [hdfsPath]
7.hdfs dfs -cat [hdfsPath]
8.hdfs dfs -chmod/-chown/-chgrp [hdfsPath] // 修改文件所属权限
9.hdfs dfs -mv [oldHdfsPath] [newHdfsPath]
10.hdfs dfs -cp [oldHdfsPath] [newHdfsPath]
11.hdfs dfs -tail [hdfsPath] // 显示文件末尾1kb数据
12.hdfs dfs -rm -r [hdfsPath]
13.hdfs dfs -du [hdfsPath]  // 统计文件夹大小信息

HDFS 的 API操作

★注意加载windows依赖,否则无法本地运行

创建文件夹

    @Test
    public void testMkdir() throws URISyntaxException, IOException, InterruptedException {
        // 创建一个文件夹操作
        fs.mkdirs(new Path("/xiyou/huaguoshan"));
    }

HDFS上传操作

    @Test
    public void testPut() throws IOException {
        fs.copyFromLocalFile(false, true, new Path("E:/sunwukong.txt"), new Path("/xiyou/huaguoshan/"));
        // del src:删除源数据  override:是否允许覆盖   Path src:源路径  Path dst:目标路径
    }

HDFS下载操作

    @Test
    public void testOut() throws IOException {
        fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou"), new Path("D:/"), false);
    }

删除目录

    @Test
    public void testRmdir() throws IOException {
        // 删除非空目录
        fs.delete(new Path("hdfs://hadoop102/xiyou"), true);  // 当第二个参数为false时,代表不进行递归删除,不能删除非空目录.
    }

移动HDFS文件

    @Test
    public void testRemove() throws IOException {
        // 修改文件名
        // fs.rename(new Path("hdfs://hadoop102/sanguo"),new Path("hdfs://hadoop102/SanGuo"));
        // 移动文件并更改文件名
        fs.rename(new Path("hdfs://hadoop102/input/word.txt"), new Path("hdfs://hadoop102/cls.txt"));
    }

获取文件详情信息

    @Test
    public void testFileDetails() throws IOException {
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("hdfs://hadoop102/"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("==========" + fileStatus.getPath().getName() + "==========");
            // 读取文件权限
            System.out.println(fileStatus.getPermission());
            // 读取使用者
            System.out.println(fileStatus.getOwner());
            // 读取用户组
            System.out.println(fileStatus.getGroup());
            // 读取内存大小
            System.out.println(fileStatus.getLen());
            // 读取最后的修改时间
            System.out.println(fileStatus.getModificationTime());
            // 读取副本数量
            System.out.println(fileStatus.getReplication());
            // 读取块大小
            System.out.println(fileStatus.getBlockSize());
            // 读取文件名
            System.out.println(fileStatus.getPath().getName());
            // 读取副本位置
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }

判断文件形式

    @Test
    public void testFileType() throws IOException {
        // 判断是目录还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("hdfs://hadoop102/"));
        for (FileStatus status : listStatus) {
            if (status.isFile()) {
                System.out.println("文件:" + status.getPath().getName());
            } else {
                System.out.println("目录:" + status.getPath().getName());
            }
        }
    }

HDFS读写流程

HDFS写数据流程

在这里插入图片描述

1.Client发起写数据请求,向NameNode发送上传请求
2.NameNode接收客户端请求并检查目标文件路径是否正确,回应Client
3.Client请求第一个block的存储位置
4.NameNode返回可存储的DataNode节点
5.Client请求DataNode上传数据信息,建立DataNode的通信管道
6.DataNode逐一应答客户端
7.客户端用过管道,逐一上传
8.数据传输完成

机架感知

HDFS副本选择

1.第一个副本在Client所处节点上。
2.第二个副本在另一台机架的随机节点,增加安全性。
3.第三个读本在第二个副本机架的另一个随机节点,增加效率。
4.之后的副本随机分配在可用机架上,增加高容错。

HDFS读数据流程

在这里插入图片描述

1.客户端向NameNode发送下载请求
2.NameNode检查元数据信息,DataNode地址,返回给哭护短
3.客户端根据源数据信息,向对应的DataNode发送读数据请求
4.DataNode传输数据至Client

NameNode和SecondaryNameNode工作机制

NameNode工作机制

在这里插入图片描述

1.NameNode格式化之后,创建FsImage和Edits文件,启动后,加载日志和镜像文件至内存中
2.客户端对元数据进行增删改操作
3.NameNode记录操作日志,Edits滚动日志
4.SecondaryNameNode定期拷贝Fsimage和Edits文件
5.合并Fsimage和Edits文件至内存中
6.生成新的Fsimage文件
7.当下一次NameNode开启后或者定期拷贝到NameNode
8.修改文件名为FsImage,完成数据的合并

oiv和oev

oiv查看fsimage镜像文件

hdfs oiv -p 文件类型(XML)-i 镜像文件 -o 转换后的文件路径

oev查看Edits文件

hdfs oev -p 文件类型 -i 编辑日志-o 转换后的文件路径

DataNode工作机制

在这里插入图片描述

1.一个数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件,一个时数据本身,一个时源数据的数据块长度,校验和,以及时间戳
2.DataNode启动后定期向NameNode上报所有块信息,默认6个小时

心跳默认三秒一次,向NameNode上报信息

超时时长计算公式

TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval(单位:ms) + 10 * dfs.heartbeat.interval(单位:s)

默认为10分钟+十次心跳

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值