Hadoop之HDFS的原理和常用命令及API(java)

news2024/12/23 12:45:11
1、简介

        书接上回,上篇博文中介绍如何安装Hadoop和基本配置,本文介绍Hadoop中分布式文件组件--HDFS,在HDFS中,有namenode、datanode、secondnamenode这三个角色,本文将详细介绍这几个组件是如何进行协作的,以及HDFS常用命令和一些api的使用。

HDFS特点:

  • 高容错性:拥有副本机制,提高容错性;
  • 适合处理大数据量:能够处理GB、TB、PB级别的数据量;
  • 数据传输有延迟:不适合低延时数据访问;
  • 不适合大量小文件存储:文件信息都会存储在namenode中,namenode内存空间有限,而且小文件过多会导致磁盘寻址时间长;
  • 不支持文件并发写入、修改:只支持串行写,而且只支持追加,不支持修改。
2、HDFS中几个组件的原理及使用

2.1、NameNode(nn)

        NameNode是master,是HDFS中的管理者,管理HDFS文件的命令空间、文件副本策略、管理数据块映射信息、处理客户端的读写请求等。存储文件数据块元数据信息,NameNode的默认空间为128G,每个block的元数据信息占用150B。

2.2、DataNode(dn)

        datanode是执行NameNode下发的操作命令,存储实际的数据块,执行数据块的读写操作,文件块大小默认是 128Mb ,可通过 dfs.blocksize 参数设置(在 hdfs-site.xml 文件中设置)。

2.3、SecondaryNameNode(2nn)

        SecondaryNameNode并非NameNode的热备份,当NameNode挂掉的时候,辅助回复NameNode;在NameNode正常的时候,辅助NameNode,分摊NameNode工作量。

2.4、NameNode 和 SecondaryNameNode 的工作机制

        NameNode节点因为经常响应客户请求,需要及时获取请求文件的元数据信息。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此HDFS会产生元数据备份文件存储在磁盘中,备份文件为FsImage。

        在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,就能合成元数据。但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode 节点完成,又会效率过低。因此,引入一个新的节点SecondaryNameNode,专门用于FsImage和Edits的合并。

注:第一次启动NameNode格式化后,创建Fsimage和Edits文件。

2.5、hdfs读写原理
2.5.1、读原理

2.5.2、写原理

3、HDFS常用命令

        HDFS命令可以使用 hadoop fs  也可以使用 hdfs dfs 命令。 

# 1、帮助命令
hadoop fs -help 具体命令(例如:rm、get)
# 2、上传文件(拷贝)
hadoop fs -put/copyFromLocal 本地文件 hdfs目录   
hadoop fs -put/copyFromLocal test.txt /test  
# 3、上传文件(剪切)
hadoop fs -moveFromLocal 本地文件 hdfs目录
# 4、追加文件内容
hadoop fs -appendToFile 本地文件 hdfs文件
# 5、下载
hadoop fs -get/copyToLocal HDFS文件 本地文件
# 6、hdfs类似于linux命令的操作
hadoop fs -ls/mv/rm/du/chmod/chown/mkdir/tail/cp/cat ...
4、HDFS的API操作

        关于HDFS操作使用test方式运行代码。

4.1、引入依赖
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>3.2.4</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>3.3.1</version>
</dependency>

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.10.3</version>
    <scope>test</scope>
</dependency>
4.2、搭建测试代码框架

        关于HDFS操作的API,可以使用fs对象进行操作,这些API都可以很快上手。对于HDFS的使用,需要根据使用场景进行一些自定义设置,需要在Configuration中指定即可

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.springframework.boot.test.context.SpringBootTest;
import java.net.URI;
import java.util.Arrays;

@SpringBootTest(classes = TestHDFS.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class TestHDFS {
    FileSystem fs;
    @BeforeAll
    public void init() throws  Exception{
        Configuration configuration = new Configuration();
        URI uri = new URI("hdfs://192.168.0.66:8020");
        fs = FileSystem.get(uri, configuration);
    }
    @AfterAll
    public void destory() throws Exception{
        fs.close();
    }

    @Test
    public void getStatus() throws Exception{
        FileStatus[] fileStatuses = fs.listStatus(new Path("/test/test.txt"));
        for(FileStatus status : fileStatuses){
            System.out.println(status.getPath());
            System.out.println("is directory" + status.isDirectory());
            System.out.println("is file" + status.isFile());
        }
    }

    @Test
    public void getFiles() throws Exception{
        RemoteIterator<LocatedFileStatus> statusRemoteIterator = fs.listFiles(new Path(("/test")), true);
        while (statusRemoteIterator.hasNext()) {
            LocatedFileStatus status = statusRemoteIterator.next();
            System.out.println(Arrays.toString(status.getBlockLocations()));
            System.out.println(status.getPath());
            System.out.println(status.isFile());
            System.out.println(status.getBlockSize());
            System.out.println(status.getOwner());
        }

    }
}
5、HDFS配置

        在HDFS中有几种配置文件:

  1. hdfs-default.xml:定义HDFS默认参数;
  2. hdfs-site.xml:在 etc/hadoop目录下,可以自定义配置;
  3. 在java项目中的resources目录下 hdfs-site.xml:自定义配置;
  4. 在java代码中的Configuration中指定。

几种配置文件的优先级为:1 < 2 < 3 < 4。在使用过程中需要根据使用场景来自定义参数。

6、总结

         本文详细介绍HDFS读写以及NameNode和SecondaryNameNode之间如何协调工作的原理,让大家对HDFS有了进一步了解,同时介绍HDFS一些常用命令,可以帮助我们使用命令直接操作HDFS,最后介绍如何将HDFS引入到项目中,如何在代码中实现HDFS的操作。关于更多Hadoop组件相关知识,将在后续持续更新。

       

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

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

相关文章

PHP一键预约便捷高效咨询小程序系统源码

一键预约&#xff0c;开启便捷高效咨询新时代 —— 你的专属咨询小程序 &#x1f680; 【开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷新体验】 在这个快节奏的时代&#xff0c;时间就是金钱&#xff0c;效率就是生命。你还在为寻找咨询服务而四处奔波&#xff0c;或是为了预…

社区团购小程序系统源码+界面diy+分销+团长+供应商+拼团+菜谱+秒杀+预售+配送,开启社区营销新模式

社区团购小程序类似美团优选,兴盛优选平台.是一款针对小区居民开发的在线购物平台&#xff0c;旨在为用户提供便捷、实惠的购物体验&#xff1b;同时还提供了“限时抢购”和“优惠券营销”等多种实惠的购物体验&#xff0c;是小区居民们的不二之选。 一、 特点与优势 社区化运…

SprinBoot+Vue健康管管理微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

k8s - Volume 简介和HostPath的使用

K8S 的持久化 K8S 实现持久化存储的方法有很多种 例如 卷 (Volume), 持久卷(PV), 临时卷(EV) 等&#xff0c; 还有很多不常用的选项上图没有列出来 其中Volume 本身也分很多种 包括 Secret, configMap(之前的文章covered了)&#xff0c; hostPath, emptyDir等 本文主要focus…

[工具使用]ellisys

工具打开&#xff1a; 1.连接ellisys电源&#xff0c;ellisys Computer接口USB连接电脑&#xff0c;Logic接口与板子出信号的GPIO口连接 工具配置 1.点击"Configure" 2.在打开的Recording options中选择Wireless选项卡 2.选择Wired选项卡​ i.勾选Logic transit…

十五、多线程(基础)

文章目录 一、线程介绍1.1 程序1.2 进程1.3 线程 二、线程使用2.1 创建线程的两种方式2.2 继承Thread类创建线程2.3 实现Runnable接口创建线程2.4 多线程执行2.5 继承Thread vs 实现 Runnable的区别2.6 线程终止 三、线程方法3.1 常用方法3.2 用户线程和守护线程 四、线程生命周…

MindSearch CPU-only 版部署

准备 创建环境 申请获取硅基流动 API Key 测试 hugging face 上传 /workspaces/codespaces-blank git clone https://huggingface.co/spaces/<你的名字>/<仓库名称>把token挂到仓库上&#xff0c;让自己有写权限 务必先初始化 git init git remote add space h…

打架监测识别摄像机

打架监测识别摄像机 是一种基于人工智能和图像识别技术的智能监控设备&#xff0c;旨在实时监测环境中的暴力冲突和打架行为。这种摄像机通常被广泛应用于监狱、学校、公共交通和其他管理需要的场所&#xff0c;以预防和控制不良事件的发生。 打架监测识别摄像机能够自动识别出…

try里面放return,finally还会执行吗?

引言 喜欢请点赞&#xff0c;支持点在看。 关注牛马圈&#xff0c;干货不间断。 趣聊 今天&#xff0c;在与同事讨论编程语言特性时&#xff0c;我们谈到了一个有趣的话题&#xff1a;在JavaScript中&#xff0c;finally块中的return语句是否会覆盖try块中的return。我首先通过…

【STM32项目设计】STM32F411健康助手--硬件SPI (硬件NSS/CS)驱动st7735--1.8寸TFT显示屏(1)

#include "lcd_driver.h"static uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);//液晶IO初始化配置 void LCD_Driver_Init(void) {SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 使能 LCD_SPI 及GPIO 时钟 *//*!< SPI_LCD…

程序员学CFA——财务报告与分析(七)

财务报告与分析&#xff08;七&#xff09; 存货存货的初始确认简介初始确认存货的初始入账成本费用化支出 发出存货的计量发出存货的计价方法个别计价法先进先出法后进先出法加权平均法总结对比 存货盘点方法实地盘存法永续盘存法总结归纳 后进先出法的特殊问题后进先出储备后…

安全测试|AWVS渗透测试神器工具详解,零基础入门到精通,收藏这一篇就够了

前言 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的自动化网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的网站安全&#xff0c;检测流行安全漏洞。它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型…

终于有人将多模态重点内容做成了动画

CLIP是入门多模态的最佳选择&#xff0c;后续多模态模型基本上都延续了它的思想&#xff1a;分别用图像编码器和文本编码器将图像和文本编码到一个共享的特征空间中&#xff0c;然后通过多模态融合方法将配对的图像文本特征向量拉进。 [1] 给定 ↳ 一个包含3个文本-图像对的小…

C++期末知识点概述

《大学 C知识点概述》 在大学的计算机课程中&#xff0c;C作为一门重要的编程语言&#xff0c;有着广泛的应用和丰富的知识点。 一、基础语法 数据类型&#xff1a;C包含多种数据类型&#xff0c;如整数类型&#xff08;int、short、long 等&#xff09;、浮点类型&#xff…

shell脚本编写之传参

我们知道命令可以带参数&#xff0c;同样脚本文件运行时也可以带有参数。 1、脚本内获取参数 脚本内获取参数的格式为&#xff1a;$n n代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推。 举例&#xff0c;仍然…

新手必看 | 信息收集打点篇

0x1 前言 本篇文章主要是汇总自己在以往的信息收集打点中的一些总结&#xff0c;然后给师傅们分享下个人信息打点的各种方式&#xff0c;以及使用工具的快、准、狠的重要性。让师傅们在后面的一些红队和众测包括src的项目中可以拿到一个不错的结果。 0x2 信息打点方向 探讨下…

天气数据爬取

目录 历史气象数据获取浏览器访问模拟 历史气象数据获取 主要的python包 requests BeautifulSoup re pandas lxml 浏览器访问模拟 根据浏览器Request-Header参数&#xff0c;让request模拟浏览器行为 import requests from bs4 import BeautifulSoup import re import pandas…

Qt 实战(10)MVD | 10.1、MVD机制详解

文章目录 一、MVD机制1、MVC设计模式1.1、简介1.2、优缺点分析 2、什么是MVD&#xff1f;2.1、简介2.2、核心角色 前言&#xff1a; 在Qt框架中&#xff0c;MVD&#xff08;Model-View-Delegate&#xff09;机制是一种用于实现数据与用户界面分离的重要设计模式。它源于经典的M…

python 下载油管视频的评论

先说结果: 2024年9月2日上午, 能运行&#xff01; 起因(目的): Not Like Us 这首歌&#xff0c; 1.5亿播放量&#xff0c;34万个评论。 有时候很想知道大家都说了什么。 Youtube 也是互联网的一霸&#xff0c; 大公司。 想爬人家的数据&#xff0c; 先做好失败的心理准备。 …

不同框架下跑yolov10(pt、onnx_runtime、tensorrt)

不同框架下跑yolov10&#xff08;pt、onnx_runtime、tensorrt&#xff09; (qq.com)