Hadoop 分布式存储系统介绍

Hadoop的HDFS以及YARN简介 Hadoop的HDFS以及YARN简介 Hadoop分布式系统简介 Hadoop是分布式的系统架构,是Apache基金会顶级金牌项目 来源:三大论文GFS、MapReduce、 Bigtable 创始人:Doug cutting Hadoop分布式系统重要部分 HDFS YARN MapReduce Zookeeper Hive Hbase … HDFS(分布式存储系统) 用... 阅读详情

hadoop组成

hadoop 集群主要做了两件事: 分布式存储(hdfs) 和分布式计算(map-reduce)。本文主要对hadoop 分布式存储理解做一个记录 帮助以后快速记忆 。

分布式存储(hdfs)

分为 hadoop 1.x 和 hadoop 2.x

hadoop1.x 存储系统

在这里插入图片描述

NameNode :
1,负责接收用户的请求
2,维护一套账本 记录所有的文件存储位置。

存储系统的本质操作:
在这里插入图片描述

在机房中就是这样:
在这里插入图片描述

Switch是交换机(路由器)、Rack代表机房里的一个机柜,每个机柜里都有很多台服务器,称之为节点。

hadoop 2.x 存储系统

1,1.x 有一个问题就是 NameNode 不能扩展 万一宕机 账本没有了 整个系统就崩溃了 2.x 可以配置多个NameNode .
2, 单个NameNode 虽然账本很小 但是内存也是有限的。
在这里插入图片描述

存储账本原理

账本组成有: fsimage , edits
fsimage 是整个系统的账本信息
edits 你运行的时候 所做的操作记录

1,hdfs 启动的时候 首先加载 fsimage 进入内存
2,客户端对hdfs 的操作信息会写入 edits 。 当系统崩溃的时候 下一次启动 hdfs 先恢复edits 里面的操作 。如果正常结束 hdfs 这里面的所有记录 应该为空。

3,随着edits内容增大,就需要在一定时间点和fsimage合并。

在这里插入图片描述

左边是NameNode 右边方块是 SecondNameNode .

SecondNameNode 是可以配置的 主要任务是帮助NameNode 上的账本完成不定时的合并 。
在这里插入图片描述

secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上。
fs.checkpoint.period: 默认是一个小时(3600s)
fs.checkpoint.size: edits达到一定大小时也会触发合并(默认64MB)

JournalNodes

两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了

常用命令操作

本节将讲解HDFS中,常见的命令行操作。HDFS与我们传统的文件系统类似,都可以存储文件,查看文件的内容,删除文件,并且文件也有着权限的概念。事实上,HDFS也借鉴了Linux文件系统的目录树结构和权限系统。

一、基本操作

启动:

start-all.sh

停止:

stop-all.sh

1、创建目录

hadoop fs -mkdir /hdfs #在根目录下创建hdfs文件夹

2、查看目录

hadoop fs -ls / #列出跟目录下的文件列表
drwxr-xr-x - root supergroup 0 2016-03-05 00:06 /hdfs

3、级联创建目录

hadoop fs -mkdir -p /hdfs/d1/d2

4、级联列出目录

hadoop fs -ls -R /
drwxr-xr-x - root supergroup 0 2016-03-05 00:10 /hdfs
drwxr-xr-x - root supergroup 0 2016-03-05 00:10 /hdfs/d1
drwxr-xr-x - root supergroup 0 2016-03-05 00:10 /hdfs/d1/d2

5、上传本地文件到HDFS

echo “hello hdfs” >>local.txt
hadoop fs -put local.txt /hdfs/d1/d2

6、查看HDFS中文件的内容

hadoop fs -cat /hdfs/d1/d2/local.txt
hello hdfs

7、下载hdfs上文件的内容

hadoop fs -get /hdfs/d1/d2/local.txt
8、删除hdfs文件

hadoop fs -rm /hdfs/d1/d2/local.txt
Deleted /hdfs/d1/d2/local.txt

9、删除hdfs中目录

hadoop fs -rmdir /hdfs/d1/d2

10、修改文件的权限

hadoop fs -ls /hdfs
drwxr-xr-x - root supergroup 0 2016-03-05 00:21 /hdfs/d1 #注意文件的权限
hadoop fs -chmod 777 /hdfs/d1
drwxrwxrwx - root supergroup 0 2016-03-05 00:21 /hdfs/d1 #修改后

11、修改文件所属的用户

hadoop fs -chown admin /hdfs/d1 #修改文件所属用户为admin
hadoop fs -ls /hdfs
drwxrwxrwx - admin supergroup 0 2016-03-05 00:21 /hdfs/d1

12、修改文件的用户组

hadoop fs -chgrp admin /hdfs/d1
hadoop fs -ls /hdfs
drwxrwxrwx - admin admin 0 2016-03-05 00:21 /hdfs/d1

Java 代码实现

配置文件

<!--hadoopHDFS依赖--> 
<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.6.0-cdh5.4.7</version>
        </dependency>
 <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.6.0-cdh5.4.7</version>
 </dependency> 
<!--hadoop使用到了jdk自带的tools.jar-->
 <dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.7</version>
    <scope>system</scope>
    <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
 
  <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>

获取对象

Hadoop提供FileSystem类用于表示HDFS文件系统,我们对HDFS所有的操作都是要基于这个类来进行完成。因此我们首先要做的就是获取这个类的实例。

public class HDFSAPI {
    public static String nameNodeUrl="hdfs://115.28.65.149:9000";
    public static Configuration configuration=new Configuration();
    public static FileSystem fileSystem;
    
    @BeforeClass
    public static void beforeClass() throws Exception{
        Configuration configuration=new Configuration();
        configuration.set("fs.defaultFS", "hdfs://115.28.65.149:9000");
        URI uri = new URI(nameNodeUrl);
        String user="root";
        fileSystem=FileSystem.get(uri,configuration,user);
        System.out.println(fileSystem);
    }
    ...
 }

运行程序输出:

DFS[DFSClient[clientName=DFSClient_NONMAPREDUCE_-1459561864_1, ugi=root (auth:SIMPLE)]]

说明:

因为通过网络来进行访问,所以我们必须配置HDFS的网络路径,实际上就是我们hadoop集群中core-site.xml配置的fs.default.name项的值。我们通过Configuration类来进行设置。只不过配置项的名字改为"fs.defaultFS"。这里我们是通过字符串来指定配置项的名字,实际上,Hadoop还提供了2个类CommonConfigurationKeysPublicCommonConf和CommonConfigurationKeys两个类,这两个类中包含了Hadoop客户端所有配置项的key和默认值,例如我们这里的"fs.defaultFS"就可以用CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY 来指定。

我们使用FileSystem.get(uri,configuration,user);这个方法来获取FileSystem的实例,这里指定的user为root,实际上也可以不指定。主要是因为我在Linux系统上是通过root用户来启动hadoop集群的。这里显示指定root,那么我就有权限访问HDFS文件系统中的所有内容。如果不指定,就会以启动我们这个客户端的程序的身份去访问HDFS,由于笔者是在Windows操作系统上写的代码,用户名为Administer,那么可能就会有一些文件没有权限访问

创建文件夹

@Test
    public void mkdirs() throws IOException{
        Path path=new Path("/hdfs/javaapi");
        final boolean exists = fileSystem.exists(path);
        System.out.println(exists);//创建前
        if(!exists){
            fileSystem.mkdirs(path);
        }
        System.out.println(fileSystem.exists(path));//创建后
    }

运行程序,控制台输出

false
true

说明:

Hadoop使用PATH对象表示HDFS文件中的路径,因为是仿照Linux系统的路径命名习惯,所以我们传入的路径是"/hdfs/javaapi"。在创建文件夹文件夹之前,我们依然要判断是否存在,不存在才可以创建,否则会抛出异常。

上传文件

@Test
    public void uploadFile() throws Exception{
        String uploadPath="/hdfs/javaapi/upload.txt";//文件保存路径
        String content="test upload file";//文件内容
        boolean overwrite=true;//如果文件存在就覆盖
        final Path hdfsPath = new Path(uploadPath);
        FSDataOutputStream out=fileSystem.create(hdfsPath, overwrite);
        boolean close=true;//上传成功关闭输入流和输出流
        int bufferSize=1024;//缓冲大小
        ByteArrayInputStream in = new ByteArrayInputStream(content.getBytes());//输入流
        IOUtils.copyBytes(in, out, bufferSize,close);
        System.out.println(fileSystem.exists(hdfsPath));//判断文件是否上传到HDFS上
    }

运行程序,控制台输出:

true
说明:

HDFS是提供了FSDataOutputStream对象来表示输出流,对应的有FSDataInputStream表示输入流。因为HSFS是需要通过流式的方式进行操作,所以我们把上传的内容content转换成了输入流。IOUtils是hadoop提供的一个工具类,帮我们从输入流往输出流中写数据。

下载文件

@Test
    public void downloadFile() throws Exception {
        String  downloadPath = "/hdfs/javaapi/upload.txt";
        FSDataInputStream inputStream = fileSystem.open(new Path(downloadPath));
        IOUtils.copyBytes(inputStream, System.out, 1024, true);
    }

运行程序,控制台输出

test upload file
说明:

FileSystem的open方法返回的是一个FSDataInputStream对象,表示指定文件的输入流。此处我们依然使用了工具类IOUtils,将获取到的内容显示在了控制台上(通过指定输出流为System.out).

递归列出文件夹中所有内容(包含子目录)

@Test
    public void recursive() throws IOException {
        FileStatus[] listStatus = fileSystem.listStatus(new Path("/hdfs"));
        for (FileStatus fileStatus : listStatus) {
                listFiles(fileStatus);
        }
    }
 
   private void listFiles(FileStatus fileStatus) throws IOException {
        Path path = fileStatus.getPath();
        System.out.println(path);
        if (!fileStatus.isDirectory()) {// 如果不是目录
            
             FsPermission permission = fileStatus.getPermission(); 
             String owner = fileStatus.getOwner(); 
             short replication = fileStatus.getReplication(); 
             long len = fileStatus.getLen();
            System
             .out.println("path:"+path+",permission:"+permission+",replication:"
             +replication+",owenr:"+owner+",size:"+len);
            
        } else {// 如果是目录
            FileStatus[] listStatus = fileSystem.listStatus(path);
            for (FileStatus childStatus : listStatus) {
                listFiles(childStatus);
            }
        }
    }

运行程序,控制台输出:

hdfs://115.28.65.149:9000/hdfs/d1
hdfs://115.28.65.149:9000/hdfs/javaapi
hdfs://115.28.65.149:9000/hdfs/javaapi/upload.txt
path:hdfs://115.28.65.149:9000/hdfs/javaapi/upload.txt,permission:rw-r–r--,replication:3,owenr:root,size:16
说明:

FileStatus对象用于表示HDFS中文件的元数据(包含文件的路径,文件大小、权限、备份数等信息)。

fileSystem.listStatus(new Path("/hdfs"))方法的返回值是FileStatus[]数组,表示的是/hdfs目录下所有的文件/文件夹的源信息。

通过fileStatus.getPath()f方法,我们可以获得一个文件的访问路径。通过fileStatus.isDirectory(),我们可以判断当前路径是文件还是文件夹。

FsPermission对象表示的是一个文件的权限信息,通过fileStatus.getPermission()方法获得。

文件的备份数,通过fileStatus.getReplication()获得,返回值是一个short整数。

文件的所有者通过fileStatus.getOwner()f方法获得。

参考文献

http://www.tianshouzhi.com/api/tutorials/hadoop/132

32、分布式存储系统:GFS、Hadoop与Chubby的深度解析 本文深入解析了几种重要的分布式存储系统,包括Google File System(GFS)、Apache Hadoop以及Chubby锁服务。文章详细介绍了它们的设计原理、架构特点以及在大规模数据存储和管理中的应用。同时,对三者进行了比较,并探讨了分布式存储系统的未来发展趋势,为读者提供了全面的技术洞察。 阅读详情

相关推荐

BMS应用软件开发 — 7 从特斯拉到问界:主流BMS硬件架构深度解析

本文深度解析了从特斯拉Model 3到问界M5的主流BMS硬件架构,探讨了BMS在电动汽车中的核心价值与应用软件开发的关键技术。通过对比分析两家厂商的硬件设计哲学、芯片选型策略及成本控制方法,揭示了BMS硬件系统如何影响电池性能与整车安全。文章特别分享了电压采样精度、EMC设计等实战经验,为BMS开发提供宝贵参考。

weixin_42554408的博客 455

java:hadoop:hdfs:中的listFiles与listStauts的区别

listFiles 返回一个可迭代的对象 listStatus 返回一个数组(数组内容指定路径下包含的所有文件及目录) 代码: FileStatus[] listStatus = fs.listStatus(new Path("/")); for(FileStatus fileSatus:listStatus){ //判断是不是一个文件 if(fileSatus.isFile()){ System.out.println("文件:"+fileSatus.g

m0_52989277的博客 1212

企业微信/飞书/钉钉扫码连WiFi保姆级教程(附访客授权技巧)

本文提供了一份企业微信、飞书、钉钉扫码连接WiFi的实战部署教程。通过集成标准Radius协议与OAuth 2.0,企业可实现基于身份的无密码网络认证,并详细介绍了访客授权、权限分级等精细化管理技巧,有效提升无线网络的安全性与员工体验。

t4y5u6i7o的博客 1194

hadoop分布式文件系统_Hadoop分布式文件系统简介

HDFS是Apache Software Foundation项目和Apache Hadoop项目的子项目(请参阅参考资料 )。 Hadoop是存储诸如TB和PB之类的大量数据的理想选择,并且使用HDFS作为其存储系统。 HDFS使您可以连接包含在其上分布数据文件的群集中的节点 (商品个人计算机)。 然后,您可以将数据文件访问和存储为一个无缝文件系统。 对数据文件的访问以流方式处理,这意味着应...

cuxiong8996的博客 1988

UE5 C++教程(一、基本结构)

虚幻API由三块组成,分别是Runtime,Developer utilitiew,functionality for the Editor,大多数游戏性编程只使用运行时模块,最常见的三个是Corn、CornUObject和Engine。

skycol的博客 1万+

nRF24L01模块性能调优笔记:基于STC8H的SPI通信,如何突破700包/秒的传输瓶颈?

本文详细介绍了如何通过SPI通信优化、nRF24L01寄存器配置和STC8H系统级调优,突破700包/秒的传输瓶颈。从硬件设计到软件实现,提供了一套完整的性能调优方案,特别适合需要高性能无线通信的嵌入式开发者。

weixin_42525211的博客 180

Hadoop分布式文件储存系统

简介 一句话(官方):分布式存储系统HDFS( Hadoop Distributed File System)。 其实就是一个文件系统,类似于linux的文件系统。有目录,目录下可以存 储文件。但它又是一个分布式的文件系统。 基本原理 将文件切分成等大的数据块,分别存储到多台机器上。 每个数据块存在多个备份。 将数据切分、容错、负载均衡等功能透明化。 可将HDFS看成是一个巨大、具有容错性的磁...

Zun 3396

从踩坑到填平:我在RHEL7上给Tesla A100装驱动的完整记录(含Fabric Manager配置)

本文详细记录了在RHEL7系统上为Tesla A100安装Nvidia驱动的完整过程,包括Fabric Manager配置的关键步骤。通过分析A100架构的特殊性,提供了从驱动安装到服务配置的详细指南,并分享了常见问题的排查方法和性能调优技巧,帮助用户高效部署高性能GPU计算环境。

weixin_29291863的博客 282

大数据之hadoop分布式存储系统hdfs

大数据之hadoop分布式存储系统hdfs 一、什么是hdfs? hdfs是一款被设计成适合运行在通用硬件上的分布式文件系统。它是一个高容错性的系统,适合部署在廉价的机器上,提供了高吞吐量的数据访问,适合大规模数据集上的应用,放宽了POSIX约束,可以实现流式读取文件系统数据的目的。 二、hdfs架构模型 主要包括以下几部分: 数据本身,block块形式存储 NameNode节点,保存文件元数...

Cactus_Lrg的博客 1876

别再瞎改网络结构了!解决YOLO小目标检测痛点,我用这招把mAP提了15%

本文基于我7年工业PCB缺陷检测、无人机航拍、安防监控项目的一线落地经验,针对YOLO小目标检测最痛的「漏检率高、特征丢失、精度难提升」三大核心问题,拆解出。本文全程配套小目标特征丢失原理图、分块训练流程图、切图前后效果对比图、mAP提升柱状图、多方案性能对比表等可视化内容,从YOLO天生不擅长小目标的底层根源、方案核心原理、可直接复制的代码实现,到工业场景实测验证、新手必踩的10个坑位避坑指南,全链路讲透。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 387

Vue+OpenLayers:解决中国境内OpenStreetMap地图加载问题

然而,在使用OpenLayers和Vue框架搭建地图应用时,很多中国开发者可能会遇到一个常见问题:OpenStreetMap(OSM)地图无法正常加载。为了解决这个问题,我们可以使用其他方式获取地图数据,比如使用国内的地图服务提供商。通过使用国内地图服务商提供的地图数据,我们可以解决OpenStreetMap地图加载问题。然后,我们创建一个OpenLayers地图对象,并指定地图图层的源为国内地图服务商提供的地图URL。属性,可以将地图的中心点和缩放级别调整到我们需要的位置。

CodeWhizZ的博客 8270

Hadoop

Hadoop简介 Hadoop 的思想之源:Google 第一遇到大数据计算问题的公司 Openstack :NASA 面对的数据和计算难题 - 大量的网页怎么存储 - 搜索算法 带给我们的关键技术和思想(Google三大理论) - GFS 文件存储 - Map-Reduce 计算 - Bigtable 创始人:Doug cutting Hadoop简介:http://hadoop.ap...

无境 8万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Hadoop最全的入门介绍

目录 Hadoop家族概述 Hadoop Hadoop介绍 HDFS 概述 节点介绍 文件读写 MapReduce 概述 原理过程分析 管理框架 YARN 失败处理 HBase 概述 内部原理 服务器 特点 存储特性 基本命令 配置教程 Hadoop家族概述 Hadoop:分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分...

HJ 855

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

如何在Java中实现分布式存储系统

通过本文的介绍,读者可以了解在Java语言中实现分布式存储系统的基本原理和关键技术。无论是使用Hadoop、Cassandra还是其他分布式技术,Java提供了丰富的库和工具,支持开发高效、可靠的分布式存储解决方案。:ZooKeeper是一个分布式协调服务,用于管理和维护分布式应用程序中的配置信息、命名服务、分布式同步等。随着数据规模的急剧增长和系统的复杂性提升,分布式存储系统成为处理大数据的重要工具。:设计容错机制,处理节点故障和数据丢失的情况,确保系统的可靠性和稳定性。

技术研究中心 519

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Hadoop家族圈介绍

Hadoop家族圈

ba_bi的博客 445

Hadoop系列之什么是Hadoop(1)

什么是Hadoop Hadoop 是使用 Java 编写,允许分布在集群,使用简单的编程模型的计算机大型数据集处理的Apache 的开源框架。 Hadoop 框架应用工程提供跨计算机集群的分布式存储和计算的环境。 Hadoop 是专为从单一服务器到上千台机器扩展,每个机器都可以提供本地计算和存储。 Hadoop 可以用单节点模式安装,但是只有多节点集群才能发挥 Hadoop 的优势,我们可以把集群扩展到上千个节点,而且扩展过程中不需要先停掉集群。 Hadoop 由三个关键部分组成: HDFS:Hadoop

m0_54853503的博客 334

Hadoop系列-Hadoop架构、组件和生态简介(一)

Hadoop整体介绍

Toby的博客 1190

Hadoop之hdfs1.x分布式存储系统学习

一、Hadoop创始人介绍 Doug cutting,就职Yahaoo期间开发了Hadoop项目,目前就职于Cloudera公司从事架构工作。Hadoop是其儿子的玩具大象,Doug cutting还编写了其情妇命名的lucene 。 二、Hadoop简介 1、分布式存储系统hdfs(存储) 2、分布式计算框架MapReduce(离线计算,spark内存计算,storm流式计算) 三、H...

流浪的程序员1993 425

CentOS下部署Hadoop高性能集群_echo &quot;123456” passwd --stdin hadoop

在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,因为非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多。在hadoop中,分布式存储系统称为HDFS(hadoop distributed file system)。其中,主节点称为名字节点(namenode),从节点称为数据节点(datanode)。

2401_84301389的博客 2328

hadoop介绍和体系架构

hadoop是什么?

huo_chai_gun的专栏 621

CentOS下部署Hadoop高性能集群_echo &quot;123456” passwd --stdin hadoop(1)

在以上的主从式结构中,由于主节点含有整个文件系统的目录结构信息,因为非常重要。另外,由于主节点运行时会把命名空间信息都放到内存中,因此存储的文件越多,主节点的内存就需要的越多。在hadoop中,分布式存储系统称为HDFS(hadoop distributed file system)。其中,主节点称为名字节点(namenode),从节点称为数据节点(datanode)。

2401_84240554的博客 987

大数据学习之Hadoop

​​​​​。

m0_62371702的博客 1187
上一篇: TextRNN pytorch 面向对象实践
下一篇: Hadoop 分布式计算系统(map-reduce)介绍
ithinking110
博客等级 码龄14年 54粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值