Hadoop如何工作? HDFS案例研究

Apache Hadoop软件库是一个框架,该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。

库本身不用于依靠硬件来提供高可用性,而是被设计用来检测和处理应用程序层的故障,因此可以在计算机集群的顶部提供高可用性服务,每台计算机都容易出现故障。 Hadoop库包含两个主要组件HDFS和MapReduce,在本文中,我们将深入研究HDFS的每个部分,并了解其内部工作方式。

HDFS具有主/从体系结构。 HDFS群集由单个NameNode和管理文件系统名称空间并控制客户端对文件的访问的主服务器组成。 此外,还有许多数据节点,通常是集群中每个节点一个,用于管理与它们所运行的节点相连的存储。

HDFS公开了文件系统名称空间,并允许用户数据存储在文件中。 在内部,文件被分成一个或多个块,这些块存储在一组DataNode中。 NameNode执行文件系统名称空间操作,例如打开,关闭和重命名文件和目录。 它还确定块到DataNode的映射。 DataNode负责处理来自文件系统客户端的读写请求。 DataNode还根据NameNode的指令执行块创建,删除和复制。

hdfs体系结构

HDFS分析

在使用JArchitect分析Hadoop 之后 ,这是hdfs项目的依赖关系图。

hadoop23

为了完成其工作,hdfs使用了许多第三方库,例如番石榴,码头,杰克逊等。 DSM(设计结构矩阵)为我们提供了有关使用每个库的权重的更多信息。

hadoop24

HDFS主要使用rt,hadoop-common和protobuf库。 当使用外部库时,最好检查一下我们是否可以轻松地将另一个第三方库更改为另一个库而不影响整个应用程序,这有很多原因可以鼓励我们更改第三方库。 另一个库可以:

  • 具有更多功能
  • 表现更好
  • 更安全

让我们以jetty lib为例,并搜索hdfs中的哪些方法直接使用它。 从方法中的m中,其中m.IsUsing(“ jetty-6.1.26”)&& m.ParentProject.Name ==“ hadoop-hdfs-0.23.6”选择新的{m,m.NbBCInstructions}

hadoop25

只有很少的方法直接使用jetty lib,而用另一种方法进行更改将非常容易。 通常,当您仅可以在某些类中使用外部库时,进行隔离非常有趣,它可以帮助轻松地维护和发展项目。 现在让我们发现主要的HDFS组件:

数据节点

启动

为了发现如何启动数据节点,让我们在hdfs jar的所有入口点之前进行搜索。 从m中的方法中的m.Name.Contains(“ main(String [])”)&& m.IsStatic选择新的{m,m.NbBCInstructions}

hadoop22

hdfs具有许多条目,例如DFSAdmin,DfSsc,Balancer和HDFSConcat。 对于数据节点,相关的入口点是DataNode类,这是调用其main方法时发生的情况。

hadoop11

main方法调用第一个securemain并将参数securityresources传递给它,当在非安全群集中启动该节点时,此参数为null,但是在安全环境中启动该节点的情况下,将为该参数分配安全资源。 SecureResources类包含两个属性:

  1. StreamingSocket:用于将数据流传输到datanode的安全端口。
  2. listner:Web服务器的安全侦听器。

这是从DataNode.StartDataNode调用的方法。

hadoop3

此方法初始化IPCServer,DataXceiver(这是用于处理传入/传出数据流的线程),创建数据节点度量实例。

如何管理数据?

DataNode类具有名为FSDatasetinterface类型的数据的属性。 FSDatasetinterface是用于基础存储的接口,用于存储数据节点的块。 让我们搜索Hadoop中可用的实现。 从类型为t.Implement(“ org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface”)选择新的{t,t.NbBCInstructions}的类型中

hadoop2

Hadoop提供了FSDataset,它管理一组数据块并将其存储在目录中。 使用接口可实现低耦合,并使设计非常灵活,但是,如果使用实现而不是接口,我们将失去这一优势,并且要检查是否在任何地方都使用interfaceDataSet表示数据,让我们使用FSDataSet搜索所有方法。 从m.IsUsing(“ org.apache.hadoop.hdfs.server.datanode.FSDataset”)中选择新的{m,m.NbBCInstructions}的方法中的m

hadoop14

只有FSDataSet内部类直接使用它,而在所有其他地方都使用interfaceDataSet,这使得更改数据集类型的可能性变得非常容易。 但是,如何更改interfaceDataSet并给出自己的实现? 为此,让我们搜索FSDataSet的创建位置。

从方法的m中开始,让depth0 = m.DepthOfCreateA(“ org.apache.hadoop.hdfs.server.datanode.FSDataset”),其中depth0 == 1选择新的{m,depth0}

hadoop26

工厂模式用于创建实例。 问题是,如果该工厂直接在getFactory方法中创建实现,则必须更改Hadoop代码以为其提供自定义数据集管理器。 让我们发现getFactory方法使用了哪些方法。 从m.IsUsedBy(“ org.apache.hadoop.hdfs.server.datanode.FSDatasetInterface $ Factory.getFactory(Configuration)”)中选择新的{m,m.NbBCInstructions}

hadoop27

好消息是工厂使用Configuration来获取类的实现,因此我们只能通过配置给出自定义的DataSet,我们还可以搜索配置可以提供的所有类。

从m.IsUsing(“ org.apache.hadoop.conf.Configuration.getClass(String,Class,Class)”)中选择新的{m,m.NbBCInstructions}的方法中的m

hadoop28

可以在不更改其源代码的情况下将许多类注入Hadoop框架,这使其非常灵活。

名称节点

NameNode是所有HDFS元数据的仲裁器和存储库。 该系统的设计方式是,用户数据永远不会流过NameNode。 这是启动名称节点时调用的一些方法。

hadoop5

创建了RPC服务器,并加载了fsnamesystem,下面是对这两个组件的快速浏览:

NameNodeRpcServer

NameNodeRpcServer负责处理对NameNode的所有RPC调用。 例如,当启动一个数据节点时,它必须在NameNode上注册自己,rpc服务器接收该请求并将其转发到fsnamesystem,后者将其重定向到dataNodeManager。

hadoop8

另一个示例是当接收到数据块时。 从m.IsUsedBy(“ org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.blockReceived(DatanodeRegistration,String,Block [],String [])”)中的m中选择新的{m,m.NbBCInstructions}

hadoop18

图中的每个矩形与代码指令的字节数成正比,我们可以观察到BlockManager.addBlock可以完成大部分工作。 Haddop有趣的是,每个类都有特定的职责,并且任何请求都将重定向到相应的管理器。

FS名称系统

HDFS支持传统的分层文件组织。 用户或应用程序可以创建目录并将文件存储在这些目录中。 文件系统名称空间层次结构与大多数其他现有文件系统相似。 可以创建和删除文件,将文件从一个目录移动到另一个目录或重命名文件。 例如,这是有关符号链接创建的依赖图。

hadoop15

HDFS客户端

DFSClient可以连接到Hadoop Filesystem并执行基本文件任务。 它使用ClientProtocol与NameNode守护程序进行通信,并直接连接到DataNode以读取/写入块数据。
Hadoop DFS用户应获取DistributedFileSystem的实例,该实例使用DFSClient处理文件系统任务。 DistributedFileSystem充当外观并将请求重定向到DFSClient类,这是有关创建目录请求的依赖关系图。

hadoop16

结论:

以用户身份使用框架非常有趣,但是深入该框架可以为我们提供更多信息,以便更好地理解它,并轻松地使其适应我们的需求。 Hadoop是许多公司使用的功能强大的框架,其中大多数公司都需要对其进行自定义,所幸的是,Hadoop非常灵活,允许我们在不更改源代码的情况下更改行为。

翻译自: https://www.javacodegeeks.com/2013/04/how-hadoop-works-hdfs-case-study.html

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

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

相关文章

Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

文章目录重量级锁(Mutex Lock)偏向锁(比较 ThreadID)偏向锁获取过程偏向锁的释放轻量级锁(自旋)轻量级锁的加锁过程轻量级锁的释放总结重量级锁(Mutex Lock)Synchronized 是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的 Mute…

Flexbox布局

Flexbox布局 刚开始接触flex布局的时候,只知道它可以用来使子元素水平垂直居中,代码最为简洁好用。 .container {display: flex;justify-content: center;align-items: center; } 当然不仅仅是居中问题,flexbox能做的事情大多&#xf…

CSS_常见布局

1.一列布局——常用于网站首页。 html&#xff1a; 1 <div class"top"></div> 2 <div class"main"></div> 3 <div classfoot></div> css&#xff1a; 1 body{2 margin:0;3 padding: 0;4 …

会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架

分享代码基地会员中心的PHP签到系统&#xff0c;PHP很漂亮的签到界面。签到后&#xff0c;会有不同颜色区分。附带PHP签到源码带安装说明和详细注释。(详细查看https://www.daimajidi.com/deal/574)JS:function getUrl(strs) {var url "/demo/1563064903/" strs;re…

Spring MVC:表单处理卷。 1个

Spring MVC是Spring Framework的一部分&#xff0c;其主要目的是使Web开发更加简单&#xff0c;便捷和轻松。 与表单的交互是或多或少现代Web应用程序的一部分。 Spring MVC允许您以非常严格和简单的方式执行各种形式的活动。 在本文中&#xff0c;您将在Spring MVC的帮助下阅读…

Java监视器绑定的超人

这是超人生活中的黑暗时期。 乔尔艾尔&#xff08;Jor-El&#xff09;希望他继续航行&#xff0c;为他的最终命运做好准备。 然而&#xff0c;地球面临着世界末日&#xff0c;正义联盟需要他们的钢铁侠行动来拯救世界。 但是由于我们只有一个超人&#xff0c;您不能同时做这两个…

CSS实现垂直居中的5种方法

利用 CSS 来实现对象的垂直居中有许多不同的方法&#xff0c;比较难的是选择那个正确的方法。我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站。 使用 CSS 实现垂直居中并不容易。有些方法在一些浏览器中无效。下面我们看一下使对象垂直集中的5种不同方法&#xf…

尝试使用jBPM Console NG(测试版)

大家好&#xff01; 这是关于jBPM Console NG的另一篇文章。 经过6个月的辛苦工作&#xff0c;我很高兴为开发者社区撰写这篇文章&#xff0c;以进行尝试。 在这篇文章中&#xff0c;我将解释如何从源代码构建应用程序。 这背后的主要思想是知道如何在测试过程中设置环境并修改…

php在window磁盘管理,Windows Server 2008R2设置磁盘阵列

RAID(独立硬盘冗余阵列)指用多个硬盘组成一个高性能、大容量的一个硬盘组合。独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks)&#xff0c;旧称廉价磁盘冗余阵列(RedundantArray of Inexpensive Disks)&#xff0c;简称硬盘阵列。其基本思想就是把多个相对便宜的…

解决Error: ENOENT: no such file or directory, scandir 安装node-sass报错

新项目开发需要安装依赖&#xff0c;但是安装完之后通过gulp运行项目&#xff0c;产生了一下的报错&#xff1a; 解决方案是执行一些方法&#xff1a; npm rebuild node-sass可是有时就是网络问题导致上面命令安装失败&#xff0c;查下失败提示&#xff0c;有可能是&#xff1a…

系统讲解CSS,前端开发最神奇的技术,新手的你一定不能错过

前面小编带领大家重温了前端开发中最基本的HTML语言。如果你已经掌握了这门语言&#xff0c;那么恭喜你&#xff0c;可以去深入了解CSS技术了。CSS技术最主要的功能就是弥补HTML标记对在页面中显示外观的不足&#xff0c;对这些标记对的默认外观进行美化。从本文开始&#xff0…

JUnit和Mockito合作

这次&#xff0c;我想对测试框架Mockito进行概述。 毫无疑问&#xff0c;这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 用Mockito准备测试 通常&a…

发现2017年最好的CSS框架

如今&#xff0c;无数的框架出现在定期而少数人喜欢自助&#xff0c;Foundation和angular.js主宰了整个世界的发展。CSS代表用于描述HTML&#xff08;或XML&#xff09;文档表示的样式表语言。一个框架被定义为一个包&#xff0c;它由一组结构化的文件和标准化代码&#xff08;…

go基础编程 day-2

Go的常亮 关键字&#xff1a; Const Go常亮的多个定义&#xff1a; // 定义常亮的关键字 const// 定义多个常亮 const(PI 3.14const1 "1"const2 2const3 3 ) 全局变量的声明与赋值&#xff1a; var (name "wyc"name1 1name2 2name3 3 ) 一般类型…

教你开发jQuery插件(转)

教你开发jQuery插件&#xff08;转&#xff09; 阅读目录 基本方法支持链式调用让插件接收参数面向对象的插件开发关于命名空间关于变量定义及命名压缩的好处工具GitHub Service Hook原文&#xff1a;http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最…

gulp 常用插件汇总

2017-07-26更新&#xff1a;图片压缩插件使用gulp-smushit&#xff0c;gulp-smushit压缩率比较大&#xff0c;gulp-imagemin 图片压缩插件压缩率不明显。 见下图压缩率&#xff1a; 1、gulp安装 参照gulp官网进行安装&#xff1a;http://www.gulpjs.com.cn/docs/getting-start…

Nmap介绍

1.Nmap介绍 Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 1.1 Zenmap Zenmap是Nmap官方提供的图形界面&#xff0c;通常随Nmap的安装包发布…

SD/MMC相关寄存器的介绍

1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前&#xff0c;我们先来看看SD卡的内部架构是怎么样的&#xff0c;如下图所示&#xff1a; 2.SD/MMC相关寄存器的介绍 从上图中总结出&#xff1a;SD卡内部有7个寄存器. 一、OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二、RCA寄存器保存…

apche 禁止运行php,学习猿地-apache如何禁止执行php

apache禁止执行php的方法&#xff1a;首先新建一个“.htaccess”文件&#xff1b;然后复制代码内容“Order allow,deny”到“.htaccess”文件中&#xff1b;最后将该文件直接放到网站根目录里即可。apache禁止执行php的方法&#xff1a;第一种禁止上传目录运行php的方法如果你用…

Apache Camel 2.11发布

上周Apache Camel 2.11发布了。 这篇博客文章总结了最引人注目的新功能和改进。 有关详细说明&#xff0c;请参见Camel 2.11发行说明 。 1&#xff09;新组件 与往常一样&#xff0c;每个新发行版都包含许多新组件&#xff0c;这些组件由我们庞大的用户群贡献。 谢谢你们。 例…