【HDFS】HADOOP DISTRIBUTED FILE SYSTEM

【HDFS】Hadoop DISTRIBUTED FILE SYSTEM

THE CAST
CLIENT:人们都坐在客户端前,向客户端输入/输出数据
NAMENODE:服务端只有一个,负责协调HDFS存储系统,例如数据分配情况,备份策略,故障诊断等
DATANODE:用于存储数据的集合,结构为一个cluster包含诺干个racks,一个racks包含诺干个datanode,datanode也就相当于我们磁盘,而racks相当于磁盘阵列
 
HDFS系统write操作
一个人对client说:请帮我写入200M数据好吗?
Client speak:我很荣幸,但你没有忘记什么嘛?
一个人说:a划分块大小128M(用于存放数据) b复制一个块到三个地方
Client speak:一个合格的client要知道2件事
(1)块大小:一个大文件存储在若干个块中,每个块通常64M or 128 M
(2)多路复用:一个块要保存到多个地方,通常为3
 
uClient ask Namenode
第一步 client划分一个大文件的块大小,用于存储文件内容
第二步 client对Namenode说请帮助我分配一个128M的块(datanode上)并多路复用到3个地方
 
unamenode分配datanode
第一步 Namenode需要找到3个datanode
第二步 Namenode整理一下3个datanode地址,发送给client
 
uClient开始写数据
第一步  Client发送数据只到第一个datanode节点,当第一个datanode节点接收到数据的同时会同步到第二个datanode节点,第二个也会同步到第三个节点,以此类推直到最后一个节点为止
第二步  一旦所有的数据都写入磁盘后,所有的datanode就向Namenode发送完成信号
第三步  Namenode就会显示块已保存,并且已经复用
第四步  Client会用同样的步骤完成后续数据写入
 
u当写完所有块后
第一步  当写完所有块后,Client就会关闭文件,并告之Namenode停止传输
第二步  Namenode此时就会知道所有的数据信息都保存在磁盘中
 
uRecap重述
Client         用于划分保存文件的块
Namenode 用于提供保存块的datanode节点信息,包括所有的多路复用节点
Datanode  用于保存数据
 
HDFS 集群read操作
一个人对client说:请帮我读取相关文件
Client speak:Roger好的知道了!
 
u交互Namenode
Client -> Namenode:请给我关于这个文件的信息(传输filename到Namenode)
Namenode –> Client:回复存储这个文件所有的块信息给Client,按datanode到Client的距离进行排序,实际上就是知道块存储在哪个datanode上,先从最近的节点读取数据
例 Block1:at DN x1 y1 z1
   Block2:at DN x2 y2 z2
   Block3:at DN x3 y3 z3
Client:a.知道有多少个块(关于这个文件)需要下载
      b.还知道每个块保存在哪些datanode上
因此Client会依次下载这些块到本地
 
u数据下载流程
Client:先从最近的datanode节点下载数据,它要跟datanode作一个交互,申请获取相关块信息,datanode返回块数据
 
可能你会问到,如果datanode硬件损坏啦,没有相关数据啦,数据本身造破坏不能恢复啦,这些不幸的事情时我们有没有好的办法呢,呵呵木要担心下面我们就会讲到故障容错的理念
 
HDFS故障容错第一部分故障类型与检测
1.三种典型故障
1)node failure节点故障(namenode服务器  datanode数据节点)节点硬件故障
2)communication failure通信故障
不能发送和接收数据,有可能datanode脱离了网络,找不到大家了
3)data corruption数据损坏,两种可能
当数据传输到网络中时损坏
当在磁盘存储时数据损坏
 
2.检测节点故障
1)如果Namenode服务器不可用了,那么整个分布式集群也就不可用了,namenode是单点故障
2)相对于Namenode服务器我们更专注于检测datanode数据节点
3)那么我们如何检测呢?方法如下
Datanode每三秒发送心跳给namedata,说明我们还存活着。如果在10分钟之内namenode还没有获取到心跳消息,就认为datanode不可用了。但有可能datanode还活着,只是网络故障造成的,但namenode还是认为datanode不可用。
 
3.检测网络故障
1)Client每当向datanode写数据时,datanode都会给一个确认ACK信号,表示接收无误
2)Client没有收到ACK信号,就假设datanode或网络故障
 
4.检测数据损坏故障
1)Client给datanode传输信息时,信息包括2部分,checksum校验和、真实数据
2)Datanode即存储数据也存储校验和 【Linux公社 http://www.linuxidc.com 】
检测损坏硬盘,由datanode定期发送块报告给namenode,这个块报告列出了所有的块信息。
注释:Datanode先检查checksum校验和是ok的,才发送块报告,因为块报告不包括坏块信息
举例:Datanode发送块报告时不包括坏块信息(假如发送4个块),Namenode在和原来“校验和”对比后认为原来应该有5个块,那么说明有一个块损坏了
 
5.重述心跳信息和块报告
1)Datanode每3秒钟向Namenode发送心跳信息,表示我还活着
2)datanode在发送块报告的时候会自动跳过坏块信息,只发送好块信息
3)namenode在接收到块报告后与原来的校验和进行对比,总块数-好块数=坏块数
 
HDFS故障容错第二部分处理读写故障
1.处理写错误
1)我们写入块的最小数据单位是包(通常64K),记住多路复用流水线
注意:此外datanode要给client端发送接收到包的ACK确认信息,以便确认datanode完全接收到了数据包。
2)如果client端从一些datanode节点上不能获得ACK确认信息,就认为这些datanode已不可用,因此client需要调整多路复用流水线,以跳过这个损坏的datanode节点,但不会影响其他的正常的datanode。
3)在调整多路复用之后namenode将会查看损坏的datanode
 
2.处理读错误
1)当client端询问一个块位置时,namenode将返回client端所有的datanode节点地址。
2)如果client发现一个datanode不可用了,将会从其他的datanode处获取数据
 
HDFS故障容错第三部分处理数据节点故障
1.首先,Namenode保存了2个重要的表
1)块信息表,包含块保存在哪些datanode节点上
2)节点信息表,包含datanode节点保存哪些块
2.再次,Namenode不间断更新这2个表
1)如果namenode在datanode上发现一个坏块,就会更新块信息表,在表里标识坏块在哪个datanode上
2)如果namenode发现datanode节点不可用了,就会更新2个表(块信息表,节点信息表),在2个表中同时标识不可用datanode节点信息

2019-03-28 13:30

知识点

相关教程

更多

Hadoop HDFS Wrong FS: hdfs:/ expected file:///

HDFS是一个分布式文件系统,然而对于程序员来说,HDFS就是一个普通文件系统,Hadoop进行的底层封装,程序员按照相应的API来对HDFS上的文件操作,和对本地磁盘文件操作没有太多区别。但是最初接触时可能还是会碰到这样那样的问题。 例如:获取FileSystem实例时会出现 java.lang.NullPointerException at org.apache.hadoop.conf.Con

【转载】Netflix: System Architectures for Personalization and Recommendation

[原文链接:http://techblog.netflix.com/2013/03/system-architectures-for.html,需要FQ。同样出自Netflix的Xavier Amatriain之手,介绍了Netflix的推荐系统架构。我之前也转载了他的另两篇博文:Netflix Recommendations: Beyond the 5 stars (Part 1, Part 2

Hadoop 学习总结之一:HDFS简介

一、HDFS的基本概念    1.1、数据块(block)         HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。  和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。  不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。     1.2、元数据节点(N

Hadoop集群(第8期)_HDFS初探之旅

相关系列目录:    Hadoop集群安装配置系列(目录) http://www.linuxidc.com/Linux/2012-12/76696.htm 1、HDFS简介      HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上

Hadoop并非完美:8个代替 HDFS 的绝佳方案

HDFS(   Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,   坦白说HDFS是一个不错的分布式文件系统,它有很多的优点,   但也存在有一些缺点,包括:不适合低延迟数据访问、无法高效存储大量小文件、不支持多用户写入及任意修改文件。    Apache软件基金会成立的时候,HDFS就一直在想办法提高它的性能和可用

Distributed RPC(分布式RPC)-Storm

Distributed RPC(分布式RPC)  The idea behind distributed RPC (DRPC) is to parallelize the computation of really intense functions on the fly using Storm. The Storm topology takes in as input a stream of f

Hadoop分布式文件系统HDFS

HDFS,Hadoop Distributed File System,是一个设计用来保存大数据量的数据的分布式文件系统(TB级甚至是PB级),并提供快速访问这些数据的能力,数据通过冗余的方式保存在多台机器上,以来保存对失败的容错性和并行应用的高度可用性。 HDFS的设计相对其它分布式文件系统,比如NFS,对几个问题是健壮的,特别市: 1.HFDS设计用来保存非常大的数据量信息,就需要将数据分布到

扩展Hadoop HDFS,实现WebDav协议,将hdfs mount为Linux本地文件系统

使用Hadoop的shell命令进行hdfs的操作十分不方便,最好的办法当然是将hdfs映射为本地文件系统. 而通过实现WebDav Http协议, 结合WebDav的众多客户端,可以将hdfs映射为windows或是linux的本地文件系统.而使用api存储文件时,也将对应用透明,如使用本地文件系统一样使用hdfs. 1.Webdav协议介绍: WebDAV(Web-based Distribu

打破HDFS局限 富士通升级Hadoop发行版

富士通投入大数据,混搭由Apache Hadoop大数据组合的富士通软件,它说这比单独使用开源代码更好。 像很多Hadoop用户一样,使用富士通的大型机、Sparc、x86设备的的客户抱怨产品Hadoop Distributed File System(HDFS)的局限性,所以富士通升级一月份发布的Apache Hadoop 1.0堆,并且给HDFS提升性能。 据富士通称,问题在于企业系统与Had

could not find system property or JNDI

Thanks everyone!! Finally got a solution for this problem on Jetty Server.  Instead of setting Java system variables like JAVA_OPTS=-Dsolr.solr.home="C:\SOLR\apache-solr-1.3.0\apache-solr-1.3.0\e

【转】Java's hashCode is not safe for distributed systems

因为要FQ才能看,转过来 http://martin.kleppmann.com/2012/06/18/java-hashcode-unsafe-for-distributed-systems.html As you probably know, hash functions serve many different purposes:   Network and storage systems

zoj 2966 Build The Electric System

ZOJ Problem Set - 2966       Build The Electric System         Time Limit: 1 Second    Memory Limit: 32768 KB         In last winter, there was a big snow storm in South China. The electric system was

Hadoop分析之一HDFS元数据解析

1、元数据(Metadata):维护HDFS文件系统中文件和目录的信息,分为内存元数据和元数据文件两种。NameNode维护整个元数据。 HDFS实现时,没有采用定期导出元数据的方法,而是采用元数据镜像文件(FSImage)+日子文件(edits)的备份机制。 2、Block:文件内容而言。 寻路径流程: 路径信息 bocks[] triplets[]  Client ------------》I

Hadoop源码分析 HDFS ClientProtocol——addBlock

addBlock()负责分配一个新的block以及该block备份存储的datanode。addBlock函数声明如下: publicLocatedBlockaddBlock(Stringsrc,StringclientName,DatanodeInfo[]excludedNodes) 其中src代表需要写入新block的文件;clientName代表写入该block的client、exclude

Java 流(Stream)、文件(File)和IO

Java 流(Stream)、文件(File)和IO    Java.io包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。  Java.io包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。  一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流

最新教程

更多

java线程状态详解(6种)

java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

redis从库只读设置-redis集群管理

默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

Netty环境配置

netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

Netty基于流的传输处理

​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

Netty入门实例-使用POJO代替ByteBuf

使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

Netty入门实例-时间服务器

Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

Netty入门实例-编写服务器端程序

channelRead()处理程序方法实现如下

Netty开发环境配置

最新版本的Netty 4.x和JDK 1.6及更高版本

电商平台数据库设计

电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

HttpClient 上传文件

我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

MongoDB常用命令

查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

快速了解MongoDB【基本概念与体系结构】

什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

windows系统安装MongoDB

安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

Spring boot整合MyBatis-Plus 之二:增删改查

基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baom

分布式ID生成器【snowflake雪花算法】

基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案