大数据技术-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;@Autowiredprivate 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.mzph.cn/news/891048.shtml

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

相关文章

在 C# 中优化 JPEG 压缩级别和文件大小

此示例可让您检查不同 JPEG 压缩级别的图像质量。使用文件菜单的打开命令加载图像文件。然后使用“JPEG 压缩指数 (CI)”组合框选择压缩级别。程序将图像保存到具有该压缩级别的临时文件中&#xff0c;并显示生成的图像和文件大小。 该程序的关键是以下SaveJpg方法&#xff0c;…

Pandas02

Pandas01: Pandas01 文章目录 内容回顾1 数据的读取和保存1.1 读写Excel文件1.2 读写CSV1.3 读写Mysql 2 DataFrame 数据查询2.1 筛选多列数据2.2 loc 和 iloc2.3 query查询方法和isin 方法 3 DataFrame增 删 改数据3.1 增加一列数据3.2 删除一行/一列数据3.3 数据去重3.4 数据…

Flink定时器

flink的定时器都是基于事件时间&#xff08;event time&#xff09;或事件处理时间&#xff08;processing time&#xff09;的变化来触发响应的。对一部分新手玩家来说&#xff0c;可能不清楚事件时间和事件处理时间的区别。我这里先说一下我的理解&#xff0c;防止下面懵逼。…

Docker中的分层(Layer)

docker中有分层的概念&#xff0c;如下图所示 上面是容器层&#xff08;Container layer&#xff09;&#xff0c;下面是镜像层&#xff08;Image layers&#xff09;。 镜像层的内容是静态的&#xff0c;读和写的操作&#xff0c;都是在容器层发生&#xff0c;专门为容器的读…

RoboMIND:多体现基准 机器人操纵的智能规范数据

我们介绍了 RoboMIND&#xff0c;这是机器人操纵的多体现智能规范数据的基准&#xff0c;包括 4 个实施例、279 个不同任务和 61 个不同对象类别的 55k 真实世界演示轨迹。 工业机器人企业 埃斯顿自动化 | 埃夫特机器人 | 节卡机器人 | 珞石机器人 | 法奥机器人 | 非夕科技 | C…

python报错ModuleNotFoundError: No module named ‘visdom‘

在用虚拟环境跑深度学习代码时&#xff0c;新建的环境一般会缺少一些库&#xff0c;而一般解决的方法就是直接conda install&#xff0c;但是我在conda install visdom之后&#xff0c;安装是没有任何报错的&#xff0c;conda list里面也有visdom的信息&#xff0c;但是再运行代…

C语言性能优化:从基础到高级的全面指南

引言 C 语言以其高效、灵活和功能强大而著称&#xff0c;被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而&#xff0c;要写出高性能的 C 语言代码&#xff0c;需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术&#xff0c;并通过…

go多版本管理工具g win安装配置

go多版本管理工具g 基本介绍仓库安装配置配置环境配置系统变量配置path变量测试使用配置完环境变量之后&#xff0c;打开终端进行测试使用查看 g 的环境变量配置&#xff0c;g env 为环境变量配置&#xff0c;g -v为当前版本信息查看可下载列表下载安装指定版本go&#xff0c;并…

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…

细说STM32F407单片机通过IIC读写EEPROM 24C02

目录 一、操作说明 二、工程配置 1、时钟、DEBUG、GPIO、USART6、NVIC、Code Generator 2、 IIC2 &#xff08;1&#xff09;Master Features组&#xff0c;主设备参数 &#xff08;2&#xff09;Slave Features组&#xff0c;从设备参数 三、软件设计 1、KELED 2、E…

神经网络-Inception

Inception网络是由Google开发的一种深度卷积神经网络架构&#xff0c;旨在解决计算机视觉领域中的图像分类和物体识别任务。 Inception网络最初在2014年被提出&#xff0c;并在ImageNet图像分类挑战赛上取得了很好的结果。其设计灵感来自于模块化的思想&#xff0c;将不同尺度…

PyTorch Instance Normalization介绍

Instance Normalization(实例归一化) 是一种标准化技术,与 Batch Normalization 类似,但它对每个样本独立地对每个通道进行归一化,而不依赖于小批量数据的统计信息。这使得它非常适合小批量训练任务以及图像生成任务(如风格迁移)。 Instance Normalization 的原理 对每…

国内独立开发者案例及免费送独立开发蓝图书

独立开发者在国内越来越受到关注&#xff0c;他们追求的是一种自由且自给自足的工作状态。 送这个&#xff1a; 少楠light&#xff08;Flomo、小报童、如果相机&#xff09;&#xff1a;他们是独立开发者的典范&#xff0c;不仅开发了多款产品&#xff0c;还坚信“剩者为王”…

【小程序】自定义组件的data、methods、properties

目录 自定义组件 - 数据、方法和属性 1. data 数据 2. methods 方法 3. properties 属性 4. data 和 properties 的区别 5. 使用 setData 修改 properties 的值 自定义组件 - 数据、方法和属性 1. data 数据 在小程序组件中&#xff0c;用于组件模板渲染的私有数据&…

MATLAB用find函数结合all,any函数高效解决问题

如本节中最后提到的问题&#xff0c;我们输出后还需要判断&#xff0c;不是特别的一目了然&#xff0c;这时候我们可以再加上 f i n d find find函数直接标记序号并输出。首先我们先来了解 f i n d find find的用法&#xff0c; f i n d ( a ) find(a) find(a)表示将矩阵或向量…

2022博客之星年度总评选开始了

作者简介&#xff1a;陶然同学 专注于Java领域开发 熟练掌握Java、js等语言的“Hello World” CSDN原力计划作者、CSDN内容合伙人、Java领域优质作者、Java领域新星作者、51CTO专家、华为云专家、阿里云专家等 &#x1f3ac; 陶然同学&#x1f3a5; 由 陶然同学 原创&#…

vue2 升级为 vite 打包

VUE2 中使用 Webpack 打包、开发&#xff0c;每次打包时间太久&#xff0c;尤其是在开发的过程中&#xff0c;本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…

20241227在ubuntu20.04.6系统中,如何用watch命令每秒钟调用nvidia-smi来监控GPU

watch -n 1 nvidia-smi 20241227在ubuntu20.04.6系统中&#xff0c;如何用watch命令每秒钟调用nvidia-smi来监控GPU 2024/12/27 17:04 缘起&#xff1a;在ubuntu20.04.6系统中&#xff0c;使用M6000显卡来跑whisper&#xff0c;显存拉满/占用巨大&#xff0c;但是CPU占用比低&…

[江科大STM32] 第五集STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 再添加一些文件&#xff0c;自己看路径 然后去 复习这三文件 打开KEIL add existing那个&#xff0c;添加已经存在的文件 还有5个.c.h文件也要添加进来 回到KEIL 点击旁边的settings 如果你用寄存器开发就建到这里就可…

Bitmap(BMP)图像信息分析主要说明带压缩的形式

文章目录 参考资料Bitmap图片结构Bitmap图片组成实例说明 参考资料 微软官方-位图存储 Bitmap图片结构 序号名称说明1Bitmap File HeaderBitmap文件头2Bitmap Info HeaderBitmap信息头3Color Palette Data调色板数据4Bitmap Image Data图像数据 说明 Bitmap文件头的大小为…