HDFS的概念
  HDFS首先是文件系统(FileSystem,FS),尽管这个FS是基于OS原生的文件系统之上;而且这个文件系统是一个抽象概念,HDFS作为一个整体出现,对外(client)隐藏了其内部分分布式文件存储的细节。
  HDFS的核心概念有三个,完美实现了对于内部复杂性的封装:
  首先是数据块;原生的文件系统有数据块的概念,不同的操作系统不一样,大概几千K;硬件上面数据存储也是有数据块,512K。HDFS的数据块则是64M到128M。HDFS之所以这么就是为了减少选址时间(文件小,索引多,导致查询慢);但是文件块也不能太大,否则影响并发(文件大,分布少,导致并发小)。
  数据块定义了这个概念目的是为了操作都是围绕数据块来的:
  1)索引都是以块为单位进行记录;
  2)容错也是以块为单位(副本拷贝,覆盖);
  3)文件不再一个整体,而是文件块集合,这样模型变得简单(二级关系变成了一级关系);
  4)刷缓冲区的文件到Disk也是以块为单位,即FSDataOutputStream.flush;想要立即刷回硬盘需要调用hsync()函数;
  第二个概念是NameNode,NameNode的职责就是负责元数据管理,NameNode里面包含了文件块的位置;如果没有NameNode就无法组装起完整的文件。所以NameNode节点数据需要主备模式,即NameNode和Secondary NameNode两个;为了数据同步同时又不影响NameNode工作,HDFS设计了checkpoint机制。
  VERSION文件里面定义了这个集群相关的一些信息
  1)clusterId字段代表了集群ID;
  2)namesparcId则代表HDFS文件系统ID,在NameNode创建之初的时候产生;
  3)storageType代表node类型,namenode or datanode;
  4)cTime代表文件操作系统创建的时间;新格式化的时候这个值总是0;但是当文件操作系统被更新的时候将会改写为更新的时间点(时间戳)。

  checkpoint机制是一个时间点;到了时间点之后:

  1)Secondary NameNode(SNN)将会向NameNode(NN)请求数据;NameNode会把当前操作日志(edits文件)进行roll,然后向一个新的操作日志文件中写;然后secondary获取到edits以及fsimage两个文件,注意此时faimage文件还是旧的,未同步;NameNode不会随时更新此文件,只有checkpoint的时候有secondary nameNode做同步。
  2)SNN将会根据edits的日志操作合并到fsimage里面;
  3)然后再把faimage文件同步到NameNode节点中去。
  这样就实现了NameNode备份,可能会因为checkpoint不及时,导致数据丢失。
  看过了checkpoint,其实你会发现在checkpoint之前,所有的改动其实并没有被持久化,只是被保存到内存中的数据库;任何的修改都是先该edits文件,然后再更新到内存数据;这种情况导致的就是当NameNode重启的时候,他是会将edits文件和fsimage文件进行合并,操作和SNN是类似的。

  第三个概念是DataNode,DataNode的角色是用于存储和查询数据文件;数据存入DataNode的过程是:Client向NameNode请求文件路径,有则返回既存DataNode(包括两个副本DataNode),如果没有则根据DataNode的分布返回一个Pipeline,首先是map运行机器(第一个副本),另外两个尽量选择是一个机架上面的其他两个DataNode;如果没有则选择另外一个机架上面。

  在整个操作过程中,有两条线,第一条线是访问NameNode获取Pipeline;第二条线是想dataNode中写入数据;其中client端在写入数据的时候其实会维护一个FileBlockQueue,只有写入成功的才会删除;用于当写入发生异常,比如4.1挂了,将会把所有的写入4.1失败的数据以及未来数据统统发给后续的副本DataNode机器,同时通知NameNode;另外为了数据一致性,将会在最后个DataNode写入的时候做校验和。但是为什么要在最后一个点做呢?这样做是为了避免在复制副本过程中发生了对包,所以check是放在最后一个节点做得,这样check只需要做一次。
  其实NameNode和DataNode所管理的对象都是数据块;NameNode是记录数据块存储的位置,同时通过NN和SNN实现了高可用;

  在Hadoop 2.x推出了NameNode的HA之后,其实Standby Namenode就会同时扮演Secondary NameNode的功能(当前活跃的NameNode称之为Active NameNode),Secondary NameNode和Standby NameNode最大的却别在于前者并不对外提供服务,只是对NameNode提供服务;后者则是提供对外服务(用于做为Active NameNode的backup)。所以二者不需要并存(即使并存也会报错)。NameNode的SecondaryNameNode是为了帮助NameNode做日志集成,用于挂掉后,可以通过集成的日志进行数据恢复;NameNode的HA则是扮演持续服务的角色,客户端将会同时配置两个NameNode;不过做standby node所在的节点同时会扮演secondary nameNode的角色;

  standby namenode切换为active namenode之后,数据是如何做到同步的呢?通过共享存储实现的,这里使用到的是cloudera的QJM(Quorum Journal Manager) 方案,active namenode的每次写入edits之后,数据将会写入到JournalNode中(只要保证超过半数的JournalNode数据写入成功即可);standby namenode将会定时的从journalNode中同步数据;通过这种方式实现了该节点可以同步active nodename的数据。

  HDFS还有两个很重要的工具:
  distcp,用于在两个集群间拷贝数据;
  1)distcp实现是基于mapreduce,但是只有map节点;
  2)distcp有一个“-m”参数,该参数指定了几个map来跑程序;map将会被均匀的分布到各个DataNode上面;这个数字不能太小,否则将会导致数据倾斜因为map会选定执行的设备为数据保存的第一个副本;极端讲,如果只有一个map那么将会导致所有的文件都拷贝到了同一个节点上面。
  har,hadoop自己的tar工具,可以对文件,尤其是小文件进行打包;好处就是hadoop原生支持,而且可以当成普通目录进行读取。

参考

《hadoop 权威指南(第四版)》

HDFS(一)的更多相关文章

  1. hadoop 2.7.3本地环境运行官方wordcount-基于HDFS

    接上篇<hadoop 2.7.3本地环境运行官方wordcount>.继续在本地模式下测试,本次使用hdfs. 2 本地模式使用fs计数wodcount 上面是直接使用的是linux的文件 ...

  2. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  3. python基础操作以及hdfs操作

    目录 前言 基础操作 hdfs操作 总结 一.前言        作为一个全栈工程师,必须要熟练掌握各种语言...HelloWorld.最近就被"逼着"走向了python开发之路, ...

  4. C#、JAVA操作Hadoop(HDFS、Map/Reduce)真实过程概述。组件、源码下载。无法解决:Response status code does not indicate success: 500。

    一.Hadoop环境配置概述 三台虚拟机,操作系统为:Ubuntu 16.04. Hadoop版本:2.7.2 NameNode:192.168.72.132 DataNode:192.168.72. ...

  5. HDFS的架构

    主从结构 主节点,只有一个: namenode 从节点,有很多个: datanodes 在版本1中,主节点只有一个,在 版本2中主节点有两个. namenode 负责(管理): 接收用户操作请求 维护 ...

  6. hdfs以及hbase动态增加和删除节点

    一个知乎上的问题:Hbase的Region server和hadoop的datanode是否可以部署在一台服务器上?如果是的话,二者是否是一对一的关系?部署在同一台服务器上,可以减少数据跨网络传输的流 ...

  7. hadoop程序问题:java.lang.IllegalArgumentException: Wrong FS: hdfs:/ expected file:///

    Java代码如下: FileSystem fs = FileSystem.get(conf); in = fs.open(new Path("hdfs://192.168.130.54:19 ...

  8. 01 HDFS 简介

    01.HDFS简介 大纲: hadoop2 介绍 HDFS概述 HDFS读写流程 hadoop2介绍 框架的核心设计是HDFS(存储),mapReduce(分布式计算),YARN(资源管理),为海量的 ...

  9. 何为HDFS?

    该文来自百度百科,自我收藏. Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...

  10. Flume(4)实用环境搭建:source(spooldir)+channel(file)+sink(hdfs)方式

    一.概述: 在实际的生产环境中,一般都会遇到将web服务器比如tomcat.Apache等中产生的日志倒入到HDFS中供分析使用的需求.这里的配置方式就是实现上述需求. 二.配置文件: #agent1 ...

随机推荐

  1. 十六 web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS

    PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的 ...

  2. MongoDB 3.4 分片 由副本集组成

    要在真实环境中实现MongoDB分片至少需要四台服务器做分片集群服务器,其中包含两个Shard分片副本集(每个包含两个副本节点及一个仲裁节点).一个配置副本集(三个副本节点,配置不需要仲裁节点),其中 ...

  3. CodeForces 297D Color the Carpet (脑补题)

    题意 一个h*w的矩阵上面涂k种颜色,并且每行相邻格子.每列相邻格子都有=或者!=的约束.要求构造一种涂色方案使得至少有3/4的条件满足. 思路 脑补神题--自己肯定想不出来T_T-- 官方题解: 2 ...

  4. lseek使用说明

    lseek使用说明 表头文件#include<sys/types.h>#include<unistd.h> 定义函数off_t lseek(int filde,off_t of ...

  5. 【zznu-2060】 Minsum Plus(最小正子段和)

    题目描述 题意简单到令人发指! 序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值. 将这个值输出,若无解,输出no solution. 输 ...

  6. Access control allow origin 简单请求和复杂请求

    原文地址:http://blog.csdn.net/wangjun5159/article/details/49096445 错误信息: XMLHttpRequest cannot load http ...

  7. MySQL Batched Key Access

    Batched Key Access是MySQL 5.6 版本中的新特性,是一种用户提高表join性能的算法.[Batched Key Access]       对于多表join语句,当MySQL使 ...

  8. sql中exists,Intersect ,union 与union All的用法

    熟练使用SQL Server中的各种用法会给查询带来很多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本支持. EXCEPT是指在第一个集合 ...

  9. Django中类视图的简介及使用

    类视图 1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解.但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性 ...

  10. window环境下创建Flask项目需要安装常见模块命令

    安装Flask环境 pip install flask==0.10.1 使用命令行操作 pip install flask-script 创建表单 pip install flask-wtf 操作数据 ...