大数据技术-Hadoop(二)HDFS的介绍与使用

目录

1、HDFS简介

1.1 什么是HDFS

1.2 HDFS的优点

1.3、HDFS的架构

1.3.1、 NameNode

1.3.2、 NameNode的职责

1.3.3、DataNode

1.3.4、 DataNode的职责

1.3.5、Secondary NameNode

1.3.6、Secondary NameNode的职责

2、HDFS的工作原理

2.1、文件存储

2.2 、数据写入

2.3、 数据读取

2.4、 容错机制

2.5、元数据管理

3、HDFS的Shell操作

4、HDFS的API操作

4.1、配置客户端环境变量

4.2、客户端api的使用

5、参考

6、附录

1、window环境下的hadoop依赖

2、完整代码


1、HDFS简介

1.1 什么是HDFS


        HDFS是Hadoop生态系统中的一个分布式文件系统,旨在在集群的廉价硬件上可靠地存储大数据集。HDFS设计为高容错,并为高吞吐量数据访问而优化,适用于在商用硬件上运行的大数据应用。

1.2 HDFS的优点

  • 高容错性:数据通过副本机制存储在多个节点上,确保在硬件故障时数据的高可用性。
  • 高吞吐量:通过批量处理大数据,HDFS优化了数据的读写速度。
  • 可扩展性:通过添加节点,可以轻松扩展HDFS的存储容量和计算能力。
  • 可靠性:通过分布式架构和数据冗余,确保数据在系统故障情况下的完整性和可用性。

1.3、HDFS的架构


HDFS采用主从架构,主要由NameNode和DataNode两类节点组成。

1.3.1、 NameNode


NameNode是HDFS的主节点,负责管理文件系统的命名空间和文件块的映射关系。它存储所有文件和目录的元数据(如文件名、权限、块位置等),并协调客户端对数据的访问请求。

1.3.2、 NameNode的职责


文件系统命名空间管理:管理文件和目录的结构,维护元数据。

  • 块管理:管理文件与块的映射关系,以及块在DataNode上的存储位置。
  • 集群管理:监控DataNode的健康状态,处理节点故障。


1.3.3、DataNode


DataNode是HDFS的工作节点,负责存储实际的数据块。每个DataNode定期向NameNode发送心跳信号,报告其健康状态和存储情况。

1.3.4、 DataNode的职责

  • 数据存储:存储HDFS文件的数据块。
  • 数据块报告:定期向NameNode发送数据块列表,报告其存储情况。
  • 数据块操作:执行客户端请求的读写操作,负责数据块的创建、删除和复制。


1.3.5、Secondary NameNode


Secondary NameNode并不是NameNode的热备份,而是辅助NameNode进行元数据管理的节点。它定期获取NameNode的元数据快照并合并编辑日志,以减轻NameNode的负载。

1.3.6、Secondary NameNode的职责

  • 元数据快照:定期从NameNode获取元数据快照。
  • 合并编辑日志:将元数据快照与编辑日志合并,生成新的元数据文件,减轻NameNode的内存压力。

2、HDFS的工作原理

HDFS通过分布式存储和冗余机制,实现高可靠性和高可用性。以下是HDFS的几个关键工作原理。

2.1、文件存储

HDFS将文件分割成固定大小的块(3.x默认为128MB),并将这些块存储在不同的DataNode上。每个块会被复制到多个DataNode(默认3个副本),以确保数据的可靠性。

2.2 、数据写入

当客户端向HDFS写入数据时,数据首先被分割成块,并通过Pipeline机制写入到多个DataNode。具体步骤如下:

  • 客户端请求NameNode:客户端向NameNode请求写入文件。
  • NameNode分配块和DataNode:NameNode为文件分配数据块并选择存储这些块的DataNode。
  • 客户端写入数据块:客户端将数据块写入第一个DataNode,第一个DataNode再将数据块复制到第二个DataNode,依此类推。
  • 数据块确认:当所有副本写入成功后,客户端接收到确认消息,表示数据写入完成。

2.3、 数据读取

当客户端从HDFS读取数据时,NameNode提供数据块的位置信息,客户端直接从相应的DataNode读取数据。具体步骤如下:

  • 客户端请求NameNode:客户端向NameNode请求读取文件。
  • NameNode返回块位置:NameNode返回文件块所在的DataNode列表。
  • 客户端读取数据块:客户端直接从DataNode读取数据块,并在本地合并这些数据块,恢复成完整的文件。

2.4、 容错机制

HDFS通过数据块副本机制实现容错。当DataNode发生故障时,NameNode会检测到该DataNode的心跳信号丢失,并在其他健康的DataNode上重新复制丢失的数据块。

2.5、元数据管理

NameNode负责管理文件系统的元数据,包括文件名、目录结构、权限和数据块位置等。为了保证元数据的一致性和持久性,NameNode将元数据存储在内存中,并定期写入到本地磁盘。

3、HDFS的Shell操作

hadoop fs 具体命令 OR hdfs dfs 具体命令

#从本地粘贴到HDFS
hadoop fs -copyFromLocal a.txt /demo
hadoop fs  -put a.txt /

#-rm -r:递归删除目录及目录里面内容;-rm:删除文件或文件夹
hadoop fs -rm -r /demo/a.txt

#-moveFromLocal:从本地剪切粘贴到HDFS
hadoop fs -moveFromLocal a.txt /demo

#-appendToFile:追加一个文件到已经存在的文件末尾
hadoop fs -appendToFile b.txt /demo/a.txt

#-copyToLocal:从HDFS拷贝到本地
hadoop fs -copyToLocal /demo/a.txt /usr/local/hadoop-3.4.0
hadoop fs -get /demo/a.txt /usr/local/hadoop-3.4.0

#显示目录
hadoop fs -ls /demo

#查看内容
hadoop fs -cat /demo/a.txt

#创建路径
hadoop fs -mkdir /demo

#复制
hadoop fs -cp /a.txt /demo/

#-tail:显示一个文件的末尾1kb的数据
hadoop fs -tail /demo/a.txt

#查看大小
hadoop fs -du -h /demo

#-setrep:设置HDFS中文件的副本数量,副本数超过DataNode时,并不会创建那么多副本,只有当有足够的节点数时才会创建
hadoop fs -setrep 2 /demo/a.txt

4、HDFS的API操作

4.1、配置客户端环境变量

配置环境变量

配置path变量

重启电脑使变量生效

4.2、客户端api的使用

package com.xiaojie.hadoop.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Arrays;

@Component
@Slf4j
public class HdfsClientUtil {

    @Value("${wssnail.hdfs.url}")
    private String url;

    @Value("${wssnail.hdfs.user-name}")
    private String userName;

    @Autowired
    private Configuration configuration;

    //创建文件
    public void mkDirs() throws URISyntaxException, IOException, InterruptedException {
        //获取文件系统
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 创建目录
        fs.mkdirs(new Path("/hello/world"));
        // 3 关闭资源
        fs.close();
        log.info("创建目录成功>>>>>>>>>>>>>>>");
    }

    //上传文件
    public void putFile() throws URISyntaxException, IOException, InterruptedException {
        //设置副本数
        configuration.set("dfs.replication", "2");
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 上传文件
        fs.copyFromLocalFile(new Path("d:/hello.txt"), new Path("/"));
        // 3 关闭资源
        fs.close();
    }

    //下载文件
    public void downloadFile() throws URISyntaxException, IOException, InterruptedException {
        // 1 获取文件系统
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 执行下载操作
        // boolean delSrc 指是否将原文件删除
        // Path src 指要下载的文件路径
        // Path dst 指将文件下载到的路径
        // boolean useRawLocalFileSystem 是否开启文件校验
        fs.copyToLocalFile(false, new Path("/hello.txt"), new Path("d:/hello1.txt"), true);

        // 3 关闭资源
        fs.close();

    }

    //移动
    public void renameFile() throws URISyntaxException, IOException, InterruptedException {
        // 1 获取文件系统
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 修改文件名称
        fs.rename(new Path("/hello.txt"), new Path("/hello1.txt"));
        // 3 关闭资源
        fs.close();

    }

    //删除
    public void deleteFile() throws URISyntaxException, IOException, InterruptedException {
        // 1 获取文件系统
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 删除
        fs.delete(new Path("/hello1.txt"), true);
        // 3 关闭资源
        fs.close();
    }

    //查看
    public void listFiles() throws URISyntaxException, IOException, InterruptedException {
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();

            System.out.println("========" + fileStatus.getPath() + "=========");
            System.out.println("文件权限:" + fileStatus.getPermission());
            System.out.println("所有者:" + fileStatus.getOwner());
            System.out.println("所属分组:" + fileStatus.getGroup());
            System.out.println("文件长度:" + fileStatus.getLen());
            System.out.println("文件修改时间:" + simpleDateFormat.format(fileStatus.getModificationTime()));
            System.out.println("副本数:" + fileStatus.getReplication());
            System.out.println("blockSize: " + fileStatus.getBlockSize() / 1024 / 1024 + "M");
            System.out.println("文件名称信息:" + fileStatus.getPath().getName());

            // 获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println("块信息:" + Arrays.toString(blockLocations));
        }
        // 3 关闭资源
        fs.close();

    }

    //文件文件夹判断
    public void isFile() throws URISyntaxException, IOException, InterruptedException {
        FileSystem fs = FileSystem.get(new URI(url), configuration, userName);
        // 2 判断是文件还是文件夹
        FileStatus[] listStatus = fs.listStatus(new Path("/"));

        for (FileStatus fileStatus : listStatus) {

            // 如果是文件
            if (fileStatus.isFile()) {
                System.out.println("文件名称:" + fileStatus.getPath().getName());
            } else {
                System.out.println("目录名称:" + fileStatus.getPath().getName());
            }
        }
        // 3 关闭资源
        fs.close();

    }

}

完整代码:见附录

5、参考

https://blog.csdn.net/weixin_42175752/article/details/140097992

6、附录

1、window环境下的hadoop依赖

链接: https://pan.baidu.com/s/1nFIMXRlVpOrt5ahenq_Prg?pwd=c23a

2、完整代码

https://gitee.com/whisperofjune/spring-boot.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目的5种搭建方式(以idea2017为例)

目录 1. idea中使用官方API 2. idea中使用阿里云API 3. 在spring官网创建 4. 在阿里云官网创建 5. Maven项目改造成springboot项目 SpringBoot项目的创建细分一共有5种&#xff0c;其实主要分为以下三种&#xff1a; ①使用开发工具idea创建springboot项目&#xff08; Sp…

Android 设置铃声和闹钟

Android设置铃声和闹钟使用的方法是一样的&#xff0c;但是要区别的去获取对应的权限。 统一权限&#xff0c;不管是设置闹钟还是铃声&#xff0c;他们都需要一个系统设置权限如下: //高版本需要WRITE_SETTINGS权限//此权限是敏感权限&#xff0c;无法动态申请&#xff0c;需要…

三维扫描在汽车/航空行业应用

三维扫描技术应用范围广泛&#xff0c;从小型精密零件到大型工业设备&#xff0c;都能实现快速、准确的测量。 通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维…

optuna和 lightgbm

文章目录 optuna使用1.导入相关包2.定义模型可选参数3.定义训练代码和评估代码4.定义目标函数5.运行程序6.可视化7.超参数的重要性8.查看相关信息9.可视化的一个完整示例10.lightgbm实验 optuna使用 1.导入相关包 import torch import torch.nn as nn import torch.nn.functi…

【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?

文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品&#xff0c;包括不限于vividime desktop&#xff0c;vividime z-suit&#xff0c;vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…

[项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结

目录 编写http_server模块 1. 引入cpp-httplib到项目中 2. cpp-httplib的使用介绍 3. 正式编写http_server 九、添加日志到项目中 十、编写前端模块 十一. 详解传 gitee 十二、项目总结 项目的扩展 写在前面 [项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 |…

项目练习:若依系统的svg-icon功能实现

文章目录 一、svg图片准备二、自定义Svg组件三、svg插件开发四、Svg组件使用 一、svg图片准备 src/assets/icons/svg 其中svg目录里&#xff0c;存放了所需要的图片 index.js import Vue from vue import SvgIcon from /components/SvgIcon// svg component// register glob…

水库大坝三维模型的开发和使用3Dmax篇

成果图 开发过程 工具插件three.js先加载模型做水体衔接水位测量标尺水位标记断面标记大坝监测点打点 上代码&#xff0c;技术交流V: bloxed <template><div class"box w100 h100"><el-row :gutter"20" v-loading"loading"e…

Win10提示“缺少fbgemm.dll”怎么办?缺失fbgemm.dll文件的修复方法来啦!

fbgemm.dll文件的作用 fbgemm.dll&#xff08;Facebook GEMM library&#xff09;是一个动态链接库文件&#xff0c;它主要用于优化矩阵乘法运算&#xff0c;提高计算性能。虽然它不是Windows 10系统的核心组件&#xff0c;但在某些应用程序或游戏中&#xff0c;尤其是那些需要…

Petalinux使用QSPI FLASH引导启动

目录 1. 预分配Flash空间 1.1 大小估计 1.2 其他注意事项 2. 配置Flash分区 3. 配置各主要文件在Flash中的地址范围 4. 配置boot.scr的偏移 5. 修改U-Boot环境变量在Flash的偏移量 6. 配置设备树中的Flash 7. 开启对EXT4分区管理的支持(根据需要) 8. 编译u-boot 9.…

Android——自定义按钮button

项目中经常高频使用按钮&#xff0c;要求&#xff1a;可设置颜色&#xff0c;有圆角且有按下效果的Button 一、自定义按钮button button的代码为 package com.fslihua.clickeffectimport android.annotation.SuppressLint import android.content.Context import android.gra…

黑龙江等保测评费用怎么收?

‌黑龙江二级等保测评费用‌&#xff1a;费用区间大致在3万至6万人民币之间&#xff0c;具体费用取决于测评机构的定价策略、所提供的服务内容以及企业的实际需求‌&#xff0c;服务内容包括防火墙、Web应用防火墙(WAF)、堡垒机、日志审计、漏洞扫描以及等保安全整改等‌。 ‌…

中文拼写检测纠正 Read, Listen, and See Leveraging Multimodal Information 论文

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

vue2 elementui if导致的rules判断失效

优化目标 和 目标转化出价必填的 切换的时候还会隐藏掉 这时候的if语句会导致rules判断失效 我的办法是把判断拉到外面 别放在el-form-item里 <section v-if"unitForm.baseTarget OCPM && unitForm.cpaTargetOptions ! undefined && unitForm.cpaTa…

前端(Ajax)

1.客户端请求 向https://jsonplaceholder.typicode.com/users发送get请求 const xhr new XMLHttpRequest(); console.log(xhr.readyState); xhr.open(‘get’, ‘https://jsonplaceholder.typicode.com/users’) console.log(xhr.readyState); xhr.send(); console.log(xhr.…

uboot, s5pv210 , main_loop 分析(16)

main_loop 的代码如下&#xff1a; 4443 void main_loop (void)42 {41 #ifndef CONFIG_SYS_HUSH_PARSER E 40 ▎ static char lastcommand[CONFIG_SYS_CBSIZE] { 0, }; ■ Use of undeclared identifier CONFIG_SYS_CBSIZE39 ▎ int len;38 ▎ int rc 1;37 ▎ …

信号强劲,通信清晰:北斗三号多模对讲机TD70——专业通信解决方案

在边防海防等国家安全的关键领域&#xff0c;通信的稳定性和可靠性关乎着任务的成败和战士们的安全。北斗三号多模对讲机TD70&#xff0c;凭借其卓越的性能和全面的功能&#xff0c;成为了边防海防通信的利器&#xff0c;守护着国家安全的前沿哨兵。 一、三网融合&#xff0c;…

Arduino驱动DS18B20测量环境温度

DS18B20是一款高精度的单总线数字温度传感器&#xff0c;具体参数如下表所示&#xff1a; 参数名称 参数特性 测温范围 -55~125℃ 测量精度 在-10~85℃范围内的误差为0.5℃ 分辨率 9~12位数字信号&#xff0c;分辨率分别为0.5℃、0.25℃、0.125℃和0.0625℃ 通信方式 …

vector快慢指针+例题详解

1.快慢指针 例题 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从…

C++--------效率和表示

C 效率和表示 效率 时间效率&#xff1a;在 C 中&#xff0c;不同的数据结构和算法有着各异的时间复杂度。例如&#xff0c;访问数组元素的时间复杂度是 O ( 1 ) O(1) O(1)&#xff0c;而遍历链表查找元素的时间复杂度最坏情况下是 O ( n ) O(n) O(n)。选择合适的算法与数据…