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

news2024/12/26 9:05:38

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CircleGeometry 圆形…

替换 Docker.io 的 Harbor 安全部署指南:域名与 IP 双支持的镜像管理解决方案

经过验证 替换 Docker.io 的方式失败了, 以下的过程中还是需要设置 registry-mirrors 才行 以下是一篇详细教程&#xff0c;展示如何基于 openssl.conf 配置生成域名为 registry-1.docker.io 和 IP 地址为 172.16.20.20 的证书&#xff0c;构建 Harbor 服务。 环境准备 系统环境…

【源码编译】windows下mingw64安装以及cmake调用

最近因为安装MIRTK库&#xff0c;太多第三方依赖了&#xff0c;太折磨了&#xff0c;学习了使用Cmake&#xff0c;有些库又需要Fortran编译器&#xff0c;VS2022里面装了但又调用不了&#xff0c;也不知道为什么&#xff0c;最后装的mingw64&#xff0c;记录一下。 1、mingw64安…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111

文章目录 一、算法概念111二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务…

基于AI IDE 打造快速化的游戏LUA脚本的生成系统

前面写了一篇关于使用AI IDE进行C安全开发的博客《使用AI IDE 助力 C 高性能安全开发&#xff01;》&#xff0c; 得到许多同学们的喜欢&#xff0c;今天我们来继续在游戏开发中扩展一下AI的能力&#xff0c;看看能不能给游戏研发团队一些启发。 在游戏研发中&#xff0c;Lua曾…

系统思考VS过度管理

业绩没起来&#xff0c;领导者最容易做的就是抓管理。这样的“抓管理”真的有效吗&#xff1f;当业务还没起飞的时候&#xff0c;过度管理其实是一种伤害。就像一条呼啸而过的鞭子&#xff0c;看起来让团队更“整齐”&#xff0c;但实际上可能打散了协作的节奏。管理的本质是支…

IT运维的365天--021 服务器上的dns设置后不起作用

之前在内网搭建了一个和外网同域名的网站&#xff0c;开发同事今天告诉我&#xff0c;程序调试发现可能服务器不能正常访问自己内网的网站内容。于是&#xff0c;今天的故事开始了。 前面的文章在下面列出&#xff0c;当然不看也问题不大&#xff0c;今天的主题是&#xff1a;…

机器人C++开源库The Robotics Library (RL)使用手册(二)

由于RL库采用跨平台CMake源码,可以轻松在win、ubantu等平台部署、编译,win通常用VS编译器,为了便于使用、阅读,需要将CMake编译成VS工程。 1、准备三个工具:CMake、VS、QT 为了在Windows上编译RL和依赖项,您需要安装一个编译器(例如。,Visual Studio 2017)和跨平台构…

ShaderJoy ——一种可交互的翻页效果【GLSL】

效果视频 Shader 特效——可与鼠标交互的翻页效果 效果图 完整代码 #define pi 3.14159265359 #define radius .1#iChannel0 "file://./images/Woolly_3.png" #iChannel1 "file://./images/Woolly_4.png"void mainImage( out vec4 fragColor, in vec2 fra…

oracle怎样使用logmnr恢复误删除的数据

如果有同事误删除数据了&#xff0c;可以用logmnr挖掘归档日志&#xff0c;生成回滚sql&#xff0c;快速恢复数据&#xff0c;比用整个库的备份恢复要快得多。 一 操作步骤 1.1 创建目录 su - oracle mkdir logmnr create directory logmnr_dir as /home/oracle/logmnr; …

LeetCode:3218. 切蛋糕的最小总开销 I(贪心 Java)

目录 3218. 切蛋糕的最小总开销 I 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 3218. 切蛋糕的最小总开销 I 题目描述&#xff1a; 有一个 m x n 大小的矩形蛋糕&#xff0c;需要切成 1 x 1 的小块。 给你整数 m &#xff0c;n 和两个数…

系统架构师考试 常错题记录 01

1.按照《中华人民共和国著作权法》的权利保护期&#xff08; &#xff09;受到永久保护。 A.发表权 B.修改权 C.复制权 D.发行权 正确答案&#xff1a;B 解析&#xff1a;本题考查知识产权法中的《中华人民共和著作权法》保护期限知识点。 《中华人民共和著作权法》中约定署名权…

实战分享:生产Java服务容器占用内存高问题排查与解决

总框架 一、问题描述 生产上有一个Java应用&#xff0c;在发版后一周内&#xff0c;容器内存指标缓慢上升&#xff0c;最终超过60%触发内存使用告警 二、思路&解决方案 1、日志占用容器内存 &#xff08;1&#xff09;排查JVM占用了多少内存 一般我们惯性思维默认是J…

OpenAI叩响AGI之门: 12天直播精华大放送

01.OpenAI新篇章: 12天直播精华放送 当地时间12月5日-20日&#xff0c;人工智能巨头OpenAI完成了连续12个工作日的12场直播&#xff0c;虽然周末短暂休息了两天&#xff0c;但圣诞节的技术盛宴依然引发了广泛关注。内容密集、干货充足&#xff0c;许多小伙伴们可能感到信息有点…

神经网络-AlexNet

AlexNet是在2012年的ImageNet竞赛后&#xff0c;整理发表的文章&#xff0c;也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示&#xff0c;网络分为了上下两部分&#xff0c;对应两个不同的GPU训练&#xff0c;可以更好的利用GPU算力。只有在特殊的网络层后&#x…

【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控

Beats 收集数据 Beats 是一个免费且开放的平台&#xff0c;集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器 和系统向 Logstash 或 Elasticsearch 发送数据。 虽然利用 logstash 就可以收集日志&#xff0c;功能强大&#xff0c;但由于 Logtash 是基于Java实现…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…

云边端架构的优势是什么?面临哪些挑战?

一、云边端架构的优势 降低网络延迟&#xff1a;在传统集中式架构中&#xff0c;数据需传输到云计算中心处理&#xff0c;导致网络延迟较高。而云边端架构将计算和存储推向边缘设备&#xff0c;可在离用户更近的地方处理数据&#xff0c;大大降低了网络延迟&#xff0c;提升了用…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

Origin教程008:Origin绘制热图

文章目录 练习数据热图练习数据 https://download.csdn.net/download/WwLK123/90185283热图 使用拖拽的方式导入数据: 然后【单击】全选数据: 然后选择【绘图】->【等高线图】->【带标签热图】: 然后勾选【Y数据跨列】: 点击【确定