IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 大数据技术Hadoop(HDFS)详细又精简的总结(案例、代码、图片)齐全 -> 正文阅读

[大数据]大数据技术Hadoop(HDFS)详细又精简的总结(案例、代码、图片)齐全

HDFS

第一章HDFS概述

1.1 HDFS产生背景

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

HDFS只是分布式文件管理系统中的一种

1.2 HDFS定义

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

1.3 HDFS组成架构

1.客户端上传或下载 都需要先找NameNode
写入 读取
2.NameNode将数据所在节点返回客户端

3.客户端到指定节点进行上传/下载

1.4 HDFS文件块大小

HDFS的文件在物理上是分块存储(Block)

在这里插入图片描述

思考:为什么块的大小不能设置太小,也不能设置太大?

(1)HDFS的块设置太小,会增加寻址时间,程序一致在找块开始的位置

(2)HDFS的块设置太大,磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间,导致程序在处理这块数据时,会非常慢

总结:HDFS块的大小设置主要取决于磁盘传输速率

第2章 HDFS的Shell操作

2.3 常用命令实操

2.3.2 上传

-put:从本地文件系统中拷贝文件到HDFS路径去

hadoop fs -put /opt/moudule/hadoop/aaa.txt /input

将linux中的/opt/moudule/hadoop/aaa.txt文件上传到HDFS的/input目录下

2.3.3 下载

-get:从HDFS下载文件到本地

hadoop fs -get /input/aa.txt /opt/module/hadoop

将HDFS的/input/aa.txt下载到linux中的/opt/module/hadoop

2.3.4 HDFS直接操作

类似Linux操作,直接操作HDFS

1)-ls: 显示目录信息

hadoop fs -ls /

2)-mkdir:在HDFS上创建目录

hadoop fs -mkdir -p /sanguo/shuguo

3)-mv:在HDFS目录中移动文件

hadoop fs -mv /liubei.txt /sanguo/shuguo

4)-du统计文件夹的大小信息

hadoop fs -du -s -h /sanguo/shuguo

5)-setrep:设置HDFS中文件的副本数量

hadoop fs -setrep 10 /sanguo/shuguo/liubei.txt

第3章 HDFS客户端操作

package com.dai.hdfs;

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

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

public class HDFSDemo1 {
    private FileSystem fs;
    /*final URI uri : HDFS的地址
    final Configuration conf :配置信息
    final String user : 操作的用户
    */
    @Before
    public void before() throws IOException, InterruptedException, URISyntaxException {
        URI uri = new URI("hdfs://hadoop102:9820");
        Configuration conf = new Configuration();
        fs = FileSystem.get(uri,conf,"atguigu");
    }

    @After
    public void after(){
        try {
            if(fs!=null){
                fs.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
//HDFS文件上传
    
    @Test
    public void test() throws IOException {
        /*copyFromLocalFile(boolean delSrc, boolean overwrite,
                                Path src, Path dst)
           delSrc : 是否删除源文件
           overwrite :如果目标文件已经存在是否覆盖。
                true : 覆盖
                false : 不覆盖,如果目标文件存在则报错。
            src : 源文件路径(本地路径)
            dst : 目标文件路径(HDFS路径)
         */
        fs.copyFromLocalFile(false,false,new Path("G:\\0521\\06-hadoop\\2.资料\\01_jar包\\jdk-8u212-linux-x64.tar.gz"),
                                new Path("/input"));
    }

    
//HDFS文件下载
    
    @Test
    public void test1() throws IOException {
       /*
       copyToLocalFile(boolean delSrc, Path src, Path dst,
                    boolean useRawLocalFileSystem)
          delSrc : 是否删除源文件(HDFS)
          src : 源文件路径(HDFS)
          dst : 目标文件路径(本地)
          useRawLocalFileSystem : 是否使用RawLocalFileSystem
        */
        fs.copyToLocalFile(false,new Path("/input/testtt.txt"),new Path("E:\\test"),false);
    }

    
//HDFS文件夹删除
    
    @Test
    public void test2() throws IOException {
        /*
            delete(Path f, boolean recursive)
            f : 目标文件或目录的路径
            recursive : 如果是目录必须为true,文件true和false都可以
         */
        fs.delete(new Path("/test.txt"),false);
    }

//HDFS文件名更改或移动
    
    @Test
    public void test3() throws IOException {
        /*
        改名和移动文件
        */
        fs.rename(new Path("/testtt.txt"),new Path("/input"));
    }

    
//HDFS文件详情查看
    
    @Test
    public void test4() throws IOException {
        /*  final Path f
            final boolean recursive*/
        RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(new Path("/"), true);
        while (remoteIterator.hasNext()){
            LocatedFileStatus fileStatus = remoteIterator.next();
            System.out.println("文件名字为"+fileStatus.getPath().getName()+"=================");
            System.out.println("文件长度为"+fileStatus.getLen());
            System.out.println("文件权限为"+fileStatus.getPermission());
            System.out.println("文件的分组为"+fileStatus.getGroup());
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println("文件块信息为"+Arrays.toString(blockLocations));
        }
    }


//HDFS文件和文件夹判断
    
    @Test
    public void test5() throws IOException {
        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus files : fileStatuses){
            if(files.isFile()){
                System.out.println(files.getPath().getName()+"是一个文件");
            }else if(files.isDirectory()){
                System.out.println(files.getPath().getName()+"是一个目录");
            }
        }
    }
    /*
        通过流的方式实现上传和下载
    */
    @Test
    public void test6() throws IOException {
        //1.上传
        //读 --- 普通文件流
        FileInputStream fls = new FileInputStream("E:\\test\\newsanguo.txt");
        //写 ---通过文件系统对象创建
        FSDataOutputStream fds = fs.create(new Path("/newsanguo"));
        //InputStream in, OutputStream out,int buffSize, boolean close
        IOUtils.copyBytes(fls,fds,1024,true);
    }


    @Test
        //2.下载
    public void test7() throws IOException {
        //写 ---文件管理系统处理的流
        FSDataInputStream fsl = fs.open(new Path("/newsanguo"));
        //读 ---一般的流
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\test\\123.TXT");

        IOUtils.copyBytes(fsl,fileOutputStream,1024,true);
    }

在这里插入图片描述

第4章 HDFS的数据流

4.1 HDFS写数据流程

4.1.1 剖析文件写入

1.客户端创建FileSystem,向NameNode请求上传文件

2.NameNode接受客户端携带的参数(例如果文件已经存在是否覆盖等)

3.NameNode相应可以上传文件

4.客户端请求上传第一块文件,请求返回DataNode

5.NameNode根据客户端设置的副本数量决定返回几个DataNode

6.NameNode返回DataNode1,DataNode2,DataNode3,表示采用这三个节点存储数据

7.客户端创建流并向DataNode请求传输通道

8.DataNode应答成功

9.客户端对文件进行上传

10.关闭流

在这里插入图片描述

(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步)

4.1.3 机架感知(副本存储节点选择)

在这里插入图片描述

4.2 HDFS读数据流程

在这里插入图片描述

(1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址

(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据

(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)

(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件

第5章 NameNode和SecondaryNameNode

5.1 NN和2NN工作机制

5.1.1第一次启动NameNode格式化

在这里插入图片描述

5.1.2不是第一次启动NameNode

断电后,内存中的元数据清空,内存会重新从Edit_in progress 和 fsimage中加载元数据

在这里插入图片描述

1)第一阶段:NameNode启动

(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对元数据进行增删改。

2)第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

(2)Secondary NameNode请求执行CheckPoint。

(3)NameNode滚动正在写的Edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到NameNode。

(8)NameNode将fsimage.chkpoint重新命名成fsimage

checkPoint:询问NN是否需要进行将元素据拷背到磁盘的操作

5.1.3CheckPoint的触发条件

1)定时时间到

2)Edits中的数据满了

5.3 CheckPoint时间设置

1)通常情况下,SecondaryNameNode每隔一小时执行一次

[hdfs-default.xml]

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>

2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次

<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
<description>操作动作次数</description>
</property>

<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
<description> 1分钟检查一次操作次数</description>
</property >

5.5 集群安全模式

在这里插入图片描述

1)基本语法

集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。

(1)bin/hdfs dfsadmin -safemode get		(功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter  	(功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave	(功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait	(功能描述:等待安全模式状态)

第6章 DataNode

6.1 DataNode工作机制

在这里插入图片描述

(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳

(2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息

(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令(如复制块数据到另一台机器,或删除某个数据块), 如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用

(4)集群运行中可以安全加入和退出一些机器

6.2 数据完整性

6.4 服役新数据节点

1)需求

随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。

1.修改ip地址和hostname

2.works不是决定谁是集群中的节点,只是决定了在群起(start-dfs.sh,start-yarn.sh)的时候去启动哪些节点。

3.要将hadoop105中的data,logs,/tmp/*删除。

4.所有节点的hosts都要有hadoop105

6.5 退役旧数据节点

6.5.1 添加白名单

添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。

配置白名单的具体步骤如下:

  1. 在NameNode的/opt/module/hadoop-3.1.3/etc/hadoop目录下创建dfs.hosts文件在文件下添加主机名称

2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性(并重启NameNode)

<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts</value>
</property>

6.5.2 黑名单退役

在黑名单上面的主机都会被强制退出

1)在NameNode的/opt/module/hadoop-3.1.3/etc/hadoop目录下创建dfs.hosts.exclude文件,在文件中添加主机名称(要退役的节点)

2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性(并重启NameNode)

<property>
<name>dfs.hosts.exclude</name>
      <value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts.exclude</value>
</property>

参考资料:
尚硅谷大数据技术之Hadoop(HDFS)
(作者:尚硅谷大数据研发部)
版本:V3.0

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:22:15  更:2021-07-16 11:24:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 22:36:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码