Hadoop(HDFS)

Hadoop是一个开源的分布式系统架构,旨在解决海量数据的存储和计算问题,Hadoop的核心组件包括Hadoop分布式文件系统(HDFS)、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。

文章目录

    • HDFS
      • 优缺点
      • HDFS的读写原理
    • 常用命令
    • HDFS 的 API 操作

HDFS

HDFS在Hadoop中负责数据的存储,是一个分布式文件系统。HDFS的主要角色包括以下几种:

  • NameNode(nn):负责存储文件的元数据,包括文件名、目录结构、文件属性,此外还记录了每个文件的块列表以及这些块分别存储在哪些DataNode上。
  • DataNode (dn):在本地文件系统中保存文件的实际数据块,客户端通过dn对数据块进行读/写操作,同时还存储这些数据块的校验和,以确保数据的完整性。
  • Secondary NameNode (2nn):定期对NameNode的元数据进行备份操作,以防数据丢失。
  • Client:客户端负责先与NameNode交互获取文件的位置信息后,再与DataNode交互,进行数据的读写操作。
    在这里插入图片描述

优缺点

优点:

高容错性:数据会进行多个备份,当其中一个备份丢失时,系统能够自动进行恢复。
处理大规模数据:无论是大规模数据还是大量的文件,都能够有效地进行处理。

缺点:

延迟较高:不适用于快速响应的场景,例如毫秒级别的数据访问无法实现。
小文件存储效率低下:当存储大量小文件时,会大量占用NameNode的内存来记录文件目录和块信息,而NameNode的内存资源是有限的,并且小文件的寻址时间可能会超过实际的读取时间。
写入和修改的限制:不支持多个线程同时对同一个文件进行写入操作,且只能对文件进行追加操作,不能对文件内容进行随机修改。

文件块大小

在Hadoop 1.x版本里,默认的文件块大小为64MB,在2.x和3.x版本中为128MB,当寻址时间为传输时间的百分之一是最佳状态,如果单个文件块过小,那么大文件会被切割为很多块,从而增加寻址时间,反之,若文件块过大,那么传输时间会远大于寻址时间。

HDFS的读写原理

(1)文件写入原理
在这里插入图片描述

(2) 网络拓扑-节点距离计算
在HDFS进行数据写入时,NameNode会选择与待上传数据距离最近的DataNode来接收并存储这些数据。
节点距离的计算方式:两个节点到达最近的共同祖先的距离总和。
在这里插入图片描述

(3)机架感知原理-副本存储节点选择
副本节点选择:

  • 第一个副本在Client所处的节点上;如果客户端在集群外,随机选一个。
  • 第二个副本在另一个机架的随机一个节点。
  • 第三个副本在第二个副本所在机架的随机节点

在这里插入图片描述

(4)读文件原理
在这里插入图片描述

(5)NN 和 2NN 工作原理
NameNode 中的元数据存放在内存中,当对元数据进行更新或者添加操作时,会修改内存中的元数据并追加到 edits log 中,为了防止edits log过大,导致查询效率低的问题,SecondaryNameNode会定时触发checkpoint操作,将NameNode的edits log和fs image合并,生成一个新的fs image,以减少edits log的大小,并将新的fs image传回给NameNode,以提高元数据的查询效率。

(6)DataNode工作原理
在这里插入图片描述

常用命令

(1)查看命令帮助

hadoop fs -help rm

(2)启动Hadoop集群

sbin/start-dfs.shsbin/start-yarn.sh

在这里插入图片描述

(3)创建文件夹

hadoop fs -mkdir /learn

在这里插入图片描述(4)上传文件

  • -put:和copyFromLocal一样,生产环境更多用 put
vim a.txt
aaa
bbb
hadoop fs -put a.txt /learn

在这里插入图片描述在这里插入图片描述

  • -moveFromLocal:从本地移动到 HDFS
hadoop fs -moveFromLocal b.txt /learn
  • -copyFromLocal:从本地文件拷贝文件到 HDFS
hadoop fs -copyFromLocal c.txt /learn
  • -appendToFile:追加一个文件到HDFS已经存在的文件末尾
hadoop fs -appendToFile d.txt /learn/c.txt

(5)下载文件

  • -get:和copyToLocal一样,生产环境更习惯用 get
hadoop fs -get /learn ./
  • -copyToLocal:从 HDFS 拷贝到本地
hadoop fs -copyToLocal /data ./

(6)其他操作

  • -mkdir:创建目录
hadoop fs -mkdir /file
  • -ls: 显示目录信息
hadoop fs -ls /learn

在这里插入图片描述

  • -cat:显示文件内容

在这里插入图片描述

  • -chgrp、-chmod、-chown:修改文件所属权限
hadoop fs -chmod 777 /learn/a.txt

在这里插入图片描述

  • -cp:从 HDFS 的一个路径拷贝到 HDFS 的另一个路径
hadoop fs -cp /learn/a.txt /file
  • -mv:在 HDFS 目录中移动文件
hadoop fs -mv /learn/b.txt /file2
  • -tail:显示一个文件的末尾 1kb 的数据
hadoop fs -tail /learn/a.txt

在这里插入图片描述

  • -rm:删除文件或文件夹
hadoop fs -rm /learn/a.txt

在这里插入图片描述

  • -rm -r:递归删除目录及目录里面内容
hadoop fs -rm -r /learn
  • -du 统计文件夹的大小信息
hadoop fs -du /file2

在这里插入图片描述
7 表示文件大小,21 表示 3个副本的总大小

  • -setrep:设置 HDFS 中文件的副本数量
hadoop fs -setrep 10 /file2

目前只有3台节点,最多也就3个副本,当节点数增加到10时,副本数才能到10。
在这里插入图片描述

HDFS 的 API 操作

(1)创建目录

public class HdfsLearn {@Testpublic void testCreate() throws IOException, URISyntaxException, InterruptedException {Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");fs.mkdirs(new Path("/learn/file.txt"));fs.close();}
}

(2)上传文件

@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {Configuration configuration = new Configuration();configuration.set("dfs.replication", "3");FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");fs.copyFromLocalFile(new Path("D:\\hadoop\\learn.txt"), new Path("/test/file4"));fs.close();
}

(3)下载文件

@Test
public void testCopyToLocalFile() throws IOException,InterruptedException, URISyntaxException{Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");// boolean delSrc 指是否将原文件删除// Path src 指要下载的文件路径// Path dst 指将文件下载到的路径// boolean useRawLocalFileSystem 是否开启文件校验fs.copyToLocalFile(false, new Path("/learn/a.txt"), new Path("D:\\hadoop\\b.txt"), true);fs.close();
}

(4)文件移动或者更名

@Test
public void testRename() throws IOException, InterruptedException, URISyntaxException {Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");fs.rename(new Path("/learn/a.txt"), new Path("/learn/b.txt"));fs.close();
}

(5)删除文件

@Test
public void testDelete() throws IOException, InterruptedException, URISyntaxException{Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");fs.delete(new Path("/file2"), true);fs.close();
}

(6)文件详情查看

@Test
public void testListFiles() throws IOException, InterruptedException, URISyntaxException {Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");// 获取文件详情RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);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(fileStatus.getModificationTime());System.out.println(fileStatus.getReplication());System.out.println(fileStatus.getBlockSize());System.out.println(fileStatus.getPath().getName());// 获取块信息BlockLocation[] blockLocations = fileStatus.getBlockLocations();System.out.println(Arrays.toString(blockLocations));}fs.close();
}

(7)文件判断

@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException {Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://192.168.235.130:8020"), configuration, "liang");// 判断是文件还是文件夹FileStatus[] listStatus = fs.listStatus(new Path("/"));for (FileStatus fileStatus : listStatus) {// 如果是文件if (fileStatus.isFile()) {System.out.println("f:" + fileStatus.getPath().getName());} else {System.out.println("d:" + fileStatus.getPath().getName());}}fs.close();
}

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

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

相关文章

Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数

计算 PDF 文件中的页数对于各种目的都至关重要&#xff0c;例如确定文档长度、组织内容和评估打印要求。除了使用 PDF 查看器了解页数信息外&#xff0c;您还可以通过编程自动执行该任务。在本文中&#xff0c;您将学习如何使用C#通过Spire.PDF for .NET获取 PDF 文件中的页数。…

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

pytest简单使用

一&#xff1a;Mark 1.注册标记 在项目根目录下创建固定名为 pytest.ini 的配置文件&#xff0c;文件格式需要加上 [pytest] &#xff0c;然后通过 markers 注册自定义标记 2.贴上标记 通过pytest加上装饰器&#xff0c;然后pytest.mark.XX配置自定义的标记&#xff0c;一个…

【C++】——多态

一.多态的概念 1.多态 多态(polymorphism)的概念&#xff1a;通俗的来说&#xff0c;就是多种形态。多态分为静态多态(编译时多态)和动态多态(运行时多态)&#xff0c;而我们讲的多态大部分都是动态多态。 静态多态主要就是我们前面了解过的函数模板和函数重载&#xff0c;它…

Linux基础4-进程4(环境变量,命令行参数详解)

上篇文章:Linux基础4-进程3(进程优先级&#xff0c;竞争&#xff0c;独立&#xff0c;并行&#xff0c;并发&#xff0c;进程切换)-CSDN博客 本章重点: Linux中环境变量的理解和使用 目录 一. 环境变量概念和查看环境变量 1.1 环境变量概念 1.2 查看环境变量 二. 获取环境变…

【复平面】-复数相乘的几何性质

文章目录 从数学上证明1. 计算乘积 z 1 ⋅ z 2 z_1 \cdot z_2 z1​⋅z2​2. 应用三角恒等式3. 得出结果 从几何角度证明1.给出待乘的复数 u i u_i ui​2.给出任意复数 l l l3.复数 l l l 在不同坐标轴下的表示图 首先说结论&#xff1a; 在复平面中&#xff0c;两个复数&a…

如何将现有VUE项目所有包更新到最新稳定版

更新有风险,Enter要谨慎!!! 要将项目中的所有 npm 包更新到最新稳定版&#xff0c;可以使用 npm-check-updates 工具。以下是具体步骤&#xff1a; 步骤一&#xff1a;安装 npm-check-updates 首先&#xff0c;全局安装 npm-check-updates 工具&#xff1a; npm install -g…

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 2.函数 2.1 统计函数-count a.count(区域&#xff0c;区域&#xff0c;......) 统计数量&#xff0c;只针…

(linux驱动学习 - 12). IIC 驱动实验

目录 一.IIC 总线驱动相关结构体与函数 1.i2c_adapter 结构体 2.i2c_algorithm 结构体 3.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_adapter 4.向系统注册设置好的 i2c_adapter 结构体 - i2c_add_numbered_adapter 5.删除 I2C 适配器 - i2c_del_adapter 二.IIC 设…

华为ensp防火墙配置(纯享版)

文章目录 前言一、拓扑结构二、配置步骤1.路由器配置&#xff08;路由器代替互联网&#xff09;2.server和pc配置3.防护墙配置4.测试 总结 前言 防火墙是生活和项目中不可或缺的一部分&#xff0c;本篇文章对华为的ensp防火墙配置做一个总结。在之前的dhcp配置中有软件的下载地…

996引擎 - 活捉NPC

996引擎 - 活捉NPC 引擎触发 - 引擎事件(QF)事件处理模块 GameEvent测试文件参考资料 引擎触发 - 引擎事件(QF) cfg_game_data 配置 ShareNpc1 可以将QM和机器人的触发事件全部转到 QF 引擎触发是通用的,TXT的所有触发转换成小写后在LUA中就可使用,如说明书中缺省可反馈至对接群…

如何借助AI 来提高开发效率

前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是大规模语言模型&#xff08;如 GPT 系列&#xff09;的崛起&#xff0c;软件开发领域正在经历一场革命。AI 大模型不仅在代码生成方面展现出强大的能力&#xff0c;还在测试、维护和创新等多个环…

QML项目实战:自定义Button

目录 一.添加模块 ​1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Button 1.颜色背景设置 2.设置渐变色背景 3.文本设置 4.点击设置 5.阴影设置 三.效果 1.当enabled为true 2.按钮被点击时 3.当enabled为false 四.代码 一.添加模块 1.QtQuick.Con…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)本地搜索接入方案

一、方案概述 当用户使用应用/元服务时&#xff0c;开发者可以按照标准意图Schema向系统共享数据&#xff0c;并支持意图调用&#xff08;空调用与传参调用&#xff09;&#xff0c;以实现用户点击卡片后&#xff0c;可后台执行功能&#xff08;例如播放指定歌曲&#xff09;或…

CyclicBarrier使用详解及遇到的坑

上一篇文章讲的是关于是使用CountDownLatch实现生成年底报告遇到的问题&#xff0c;这个计数器和CyclicBarrier也有类似功能&#xff0c;但是应用场景不同。 一、应用场景 CountDownLatch&#xff1a; 有ABCD四个任务&#xff0c;ABC是并行执行,等ABC三个任务都执行完…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不通服务pod内部间访问 1、service 在K8S中&#xff0c;Service是一种抽象&#xff0c;定义了一组Pod的逻辑集合和访问这些Pod的策略。首先&#xff0c;我们需…

资产管理系统:SpringBoot技术实现

企业资产管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业资产管理系统的开发全过程。通过分析企业资产管理系统方面的不足&#xff0c;创建了一个计算机管理企业资产管理系统的方案。文章介绍了企…

I.MX6U 裸机开发5.准备C环境并用C语言控制LED

I.MX6U 裸机开发5.准备C环境并用C语言控制LED 一、C运行环境1. 设置处理器模式2. CPSR 寄存器CPSR 寄存器结构模式位MRS 指令MSR 指令 3. 设置SP指针设置 SP 指针示例 保存和恢复 SP 指针示例 4. 跳转到C语言 二、程序编写1. 启动文件 start.S2. main.h 定义寄存器3. 主程序mai…

c++设计模式demo

模式设计原则 依赖倒置原则 ⾼层模块不应该依赖低层模块&#xff0c;⼆者都应该依赖抽象 &#xff1b; 抽象不应该依赖具体实现&#xff0c;具体实现应该依赖于抽象&#xff1b; ⾃动驾驶系统公司是⾼层&#xff0c;汽⻋⽣产⼚商为低层&#xff0c;它们不应该互相依赖&#x…