Hadoop 学习之——HDFS
HDFS是HADOOP中的核心技术之一——分布式文件存储系统。Hadoop的作者Doug Cutting 和Mike 是根据Google发布关于GFS 的研究报告所设计出的分布式文件存储系统。
一、HDFS设计的前提或者假设有6个:
- 硬件错误是常态而不是异常。对于普通的每台机器来说,出现故障可能并是是常事,但HDFS可能由成千上万的机器组成,在这中情况下发生硬件错误就变成非常正常的事情。为了能够正常的工作,HDFS要能处理或者容忍这些硬件错误。所以对HDFS 来说硬件错误是常态而不是错误。
- 流式数据访问,运行在HDFs上的应用主要是以流式数据读取为主,做批处理而不是用户交互处理,因此,HDFS更关注数据访问的高吞吐量。
- 大规模数据集。HDFS 典型的文件大小都在GB 级甚至是TB级。因此HDFS支持大文件存储。
- 简单一致的模型。HDFS 对应用程序需要的文档实行一次写,多次读的访问模式。文件一经创建、写入和关闭后就不需要再更改了。
- 移动计算比移动数据更划算。对于大文件来说,移动计算的代价要比移动小的多。这样可以提高执行的效率同时也减小了网络拥塞和提高系统吞吐量
二、HDFS的体系结构
HDFS是一个主/从结构(Master 和Slave ),包括一个NameNode 和多个DataNode ,NameNode负责管理系统的元数据,DataNode 存储实际的数据。客户端通过NameNode和DataNode的交互访问文件系统。客户端通过NameNode获取文件的元数据,而真正的文件I/O操作是直接和DataNode 进行交互。
NameNode负责管理文件系统的命名空间,记录文件块在每个DataNode上的位置和副本信息,协调客户端对文件的http://i.cnblogs.com/EditPosts.aspx?opt=1访问,记录命名空间内的改动或命名空间本身属性的变化。DataNode则负责所在物理节点傻瓜你的存储管理。
HDFS的数据都是“一次写入、多次读取”,典型的块的大小是64MB,HDFS文件通常被切分成64MB 的数据块(Block),每个数据块尽可能的分散的存储在不同的DataNode中。NameNode执行文件系统命名空间操作,比如打开,关闭、重命名文件和目录,还决定数据块到DataNode的映射。DataNode负责处理客户端的读写请求,依照NameNode的命令,执行数据的创建、复制、删除等操作。
假如客户端要访问一个文件,首先客户端先从NameNode获取到组成在文件的数据块的位置列表。即知道数据块被存储在哪些DataNode上 ;然后客户端直接从DataNode上读取文件数据。此过程中NameNode不参与文件的传输。
HDFS典型的部署是在一个专门的机器上运行NameNode,集群上其他机器各运行一个或多个DataNode。也可以在运行NameNode的机器上运行DataNode。NameNode使用事务日志(EditLog)来记录HDFS元数据的变化,使用映像文件(FsImage)存储文件系统的命名空间,包含文件的映射、文件的属性等。日志事务日志和映像文件都存储在NameNode的本地文件系统中,NameNode启动时,从磁盘中读取映像文件和事务日志,把事务日志的事务都应用到内存中的映像文件傻瓜你,然后将新的元数据刷新到本地磁盘的映像文件中,这样可以截去旧的事务日志,这个过程成为检查点(checkpoint)。
从上面的描述中可以看出NameNode是整个文件系统的核心,而且他只运行在一台机器上,那么如果这个机器挂掉,那整个文件系统都会崩溃。于是就存在了Secondary NameNode 节点,Secondary NameNode 周期地将事务日志(EditLog)中记录的对HDFS的操作合并到一个checkPoint中,然后清空EditLog 。所以Namenode重启就会载入最新的CheckPoint,并replayEditLog中记录的hdfs的操作。保证了HDFS 系统的完整性。
三、保障HDFS可靠性措施
HDFS设计的主要目标就是在故障情况下也能保证数据存储的可靠性,他主要从一下几个方面保证:
- HDFS将每个文件存储成一系列数据库,默认大小问64MB(可以配置) 。为了容错,文件的所有数据块都会有副本(副本个数即副本因子,可配置)。当DataNode启动时,会遍历本地文件系统,产生HDFS数据块和本地文件对应关系的列表,并发给NameNode ,这就是块报告,他上面包括了DataNode 上所有的块列表。
- HDFS集群一般运行在多个机架上。不同机架的通信需要通过交换机,当复制因子是3时,HDFS的部署策略将一个副本放在同一个机架的另一个节点,一个副本存放在本地机架的节点。最后一个存放在不同机架上的节点。即保证了数据的可靠和可用,又减少了通信压力保证性能。
- 心跳检测,NameNode 周期的从DataNode接受心跳包和块报告。收到心跳包说明该DataNode正常工作。如果最近一段时间没有发送,NameNode 会标记他为宕机,然后不会发给他们任何新的I/O请求。DataNode宕机会造成数据块的副本数量下降。NameNode 会检测这些需要复制的数据块,并在需要的时候进行复制。
- 安全模式:系统启动时,NameNode进入到一个安全模式。此模式不会出现数据块的写操作,NameNode会接收各个DataNode 拥有的数据块的报告,由此,NameNode 可以获得所有数据块的信息。数据块达到最小副本要求时,该数据块被认为是安全的。在被确认是安全后,在等待若干时间,会自动推出安全模式。当检测到副本数不足的数据块,该块会被复制到其他数据节点,一达到最小副本数。
- 数据块完整性检测:客户端软件实现了对HDFS 文件内容的校验和检查。在文件创建是,会计算每个数据块的校验和。并价格你校验和作为一个单独的隐藏文件保存在命名空间下。当客户端获取文件后会计算数据块的校验和,并与隐藏文件中的校验和比较。如果不同则认为有损坏
- 空间回收:文件被用户删除后,并不是立即从HDFS中移除,而是把它移动到/trash目录中。只要在这个目录下就可以快速恢复。文件在/trash中的时间可以配置,超过这个时间就会被自动删除。
- 保留多个映像文件和事务日志的副本:任何对映像文件和事务日志的修改都将同步到他们的副本中。当NameNode重新启动时,总是选择最新的NameNode和DataNode。
Hadoop 学习之——HDFS的更多相关文章
- hadoop学习(五)----HDFS的java操作
前面我们基本学习了HDFS的原理,hadoop环境的搭建,下面开始正式的实践,语言以java为主.这一节来看一下HDFS的java操作. 1 环境准备 上一篇说了windows下搭建hadoop环境, ...
- Hadoop学习笔记-HDFS命令
进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...
- Hadoop学习笔记---HDFS
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐 ...
- Hadoop学习笔记—HDFS
目录 搭建安装 三个核心组件 安装 配置环境变量 配置各上述三组件守护进程的相关属性 启停 监控和性能 Hadoop Rack Awareness yarn的NodeManagers监控 命令 hdf ...
- hadoop学习(二)----HDFS简介及原理
前面简单介绍了hadoop生态圈,大致了解hadoop是什么.能做什么.带着这些目的我们深入的去学习他.今天一起看一下hadoop的基石--文件存储.因为hadoop是运行与集群之上,处于分布式环境之 ...
- 【Hadoop学习】HDFS中的集中化缓存管理
Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146398.html 概述 ...
- 【Hadoop学习】HDFS 短路本地读
Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146296.html 背景 ...
- hadoop学习之hdfs文件系统
一.hdfs的概念 Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS. Hadoop是Apache Lucene创始人Doug Cu ...
- hadoop学习记录--hdfs文件上传过程源码解析
本节并不大算为大家讲接什么是hadoop,或者hadoop的基础知识因为这些知识在网上有很多详细的介绍,在这里想说的是关于hdfs的相关内容.或许大家都知道hdfs是hadoop底层存储模块,专门用于 ...
随机推荐
- Spring boot 使用WebAsyncTask处理异步任务
上文介绍了基于 @Async 注解的 异步调用编程,本文将继续引入 Spring Boot 的 WebAsyncTask 进行更灵活异步任务处理,包括 异步回调,超时处理 和 异常处理. 正文 1. ...
- JSON中的安全问题
Web中使用JSON时最常见的两个安全问题: 1.跨站请求伪造: 即CSRF,是一种利用站点对用户浏览器信任发起攻击的方式.典型的就是JSON数组,更多信息请自行上网百度. 2.跨站脚本攻击. 是注入 ...
- android的系统设置界面
Intent 的 意图: Intent intent = new Inetnt(Setings); Setings: 1. ACTION_ACCESSIBILITY_SETTINGS : // 跳 ...
- 通过游戏学敏捷:只通过Specification来传递需求
转自:https://mp.weixin.qq.com/s/jAYbAMUTNYGh4RxGPAZ1AQ 活动把每个小组(4-5个人)中的2人留在屋子里,其他人到屋子外面等待.在屋子里的人,会得到一张 ...
- css display属性详解
css display属性在对css做layout设计时非常重要,它的值有以下几种: Value Description Play it inline Default value. Displays ...
- sqlserver索引维护(重新组织生成索引)
sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = par ...
- Linux下Apache HTTP Server 2.4.20安装
一.创建software目录 mkdir /softwareer 二.下载apache源码包 wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4 ...
- Python学习---重点模块之pickle
仅仅支持Python里面的函数等相关功能的实现,而且pickle写入的内容是看不出来的,读取的时候要求有原内容 pickled的写入: import pickle def fun(): print(' ...
- yii2.0数据库查询修改等方法
yii2.0学习有一段时间了,给大家分享一下一些简单的查询等如何操作. 查询:(这里最前面的Test是引用的模型名) Test::find()->all(); 此方法返回所有数据: Tes ...
- January 16 2017 Week 3 Monday
In love, folly is always sweet. 恋爱中,干傻事总是让人感到十分美妙. Love can easily get us in over our heads, so it i ...