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,一经查实,立即删除!

相关文章

CS Round#53 E Maxor

题意:给你N个数,你可以从中选出两个数将它们or起来得到M,求M的最大值及得到最大值的方案数。 刚了半个小时得到了一个貌似时O(N log max(Ai)^2)的方法,想了想发现貌似只能做出第一问,但好像改一下就能搞掉第二问&#…

CSS小记录

1.让图文不可复制 -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; -khtml-user-select: none; user-select: none; 2.让图片垂直居中 .Logo{height: 109px;line-height: 109px;} .Logo img{vertical-align: middle;} 3.行内块级元素垂直居中&…

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

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

使用镜像源安装EASY_INSTALL和PIP教程

使用easy_install和pip可以让python的模块的安装和管理变得非常方便。我一般在新的Linux系统上,先easy_install pip然后就用pip安装其他的模块了。 不过,在国内用官方的pypi源(https://pypi.python.org/simple)一般比较慢&#xf…

Flexbox布局

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

臭名昭著的Java错误和陷阱

在2000年,我上大学,濒临选择一种语言来发展自己的职业。 Java尚未成为主流,但很受人们欢迎。 与静态html页面相比,小应用程序(尚未破碎)花哨且富有光泽。 Swing不是构建桌面应用程序的不错选择。 J2EE越来越…

php oracle 配置,关于php:为Windows 64位配置Oracle OCI8

我一直在为Windows配置oracle oci8时遇到问题我正在使用Windows 7 64位,xampp v3.2.2,php 5.6.15和oracle g11 Express我尝试了以下步骤,但是在运行phpinfo时找不到oci软件包:我同时下载了Instant Client Package-Basic和Instant …

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 …

解决android studio引用远程仓库下载慢(JCenter下载慢)

原文&#xff1a;https://blog.csdn.net/linglingchenchen/article/details/62236723 第一种方法 使用开源中国的maven库 阿里云的(速度飞快)&#xff1a;http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 repositories {jcenter()} 为…

Java中的工厂方法模式

在我以前关于模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Vehicle接口及其两个…

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

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

MVP数据请求recycview展示

M层 public class Mod {public void shuju(final Modlister modlister){ OkHttpClient okHttpClientnew OkHttpClient();final Request requestnew Request.Builder().url("http://v.juhe.cn/weixin/query?key55010ae808217e996bbf414bbdad843c").build(); Call …

impress.js

介绍一下 impress.js是一个非常炫酷的幻灯片展示框架&#xff0c;依靠CSS3技术。 impress.js使用起来非常简单&#xff0c;下面就来简单介绍一下其用法。 Start 首先&#xff0c;当然要引入impress.js。 在div标签设置id为impress&#xff08;不要求一定是div&#xff09;…

Spring MVC:表单处理卷。 1个

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

用php打出前一天的时间格式,[php]用PHP打印出前一天的时间格式

echo date("Y-m-d H:i:s",strtotime("-1 day"));例子echo(strtotime("now"));echo(strtotime("3 October 2005"));echo(strtotime("5 hours"));echo(strtotime("1 week"));echo(strtotime("1 week 3 days 7 …

《Python学习之路 -- 字符串的方法》

在前面已经提到Python中的字符串了&#xff0c;本文来列举介绍字符串的方法&#xff0c;我将字符串的方法分为以下几类&#xff1a; ①查询方法 str.find(target,startNone,endNone) 该方法用于查询字符串str中是否含有target&#xff0c;如果有&#xff0c;则返回target在这个…

Java监视器绑定的超人

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

C语言第一次实验报告

一&#xff0e;实验题目&#xff0c;设计思路&#xff0c;实现方法 第四次 计算分段函数和循环NEW 4-3 求N分之一序列前N项和 4-6 输出华氏-摄氏温度转换表 第四次 分支循环 加强版 4-2-7 装睡 设计思路&#xff1a;4-3开始需要计算大量式子&#xff0c;因此利用到相对便捷的…

php充值卡,ecshop 充值卡功能_懒人程序

/*显示页面的action列表*/$ui_arrarray(register,login,profile,... 增加cz然后在下面代码处加入if ($actioncz)//冲值{ if($_GET[a]add){ if (empty($_SESSION[user_id])){ show_message(该用户不存在。,返回上一页,user.php?actcz);} else{ $kstrtoupper(substr($_POST[k],0…

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

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