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. python2.7安装requests

    我这里的是linux CentOS7版本 直接执行命令pip install requests 安装即可,如果提示没有pip这个命令要先安装pip 安装步骤如下: 1. 首先检查Linux有没有安装P ...

  2. 从HDC转换到leptonica PIX

    void CAssistDlg::OnBnClickedTest() { HDC hdc = ::GetDC(NULL); HDC hdcMem = CreateCompatibleDC(hdc); ...

  3. js中字符串与数组的相互转换

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. java程序设计基础篇 复习笔记 第三单元

    1 单向if语句 双向if语句 dangling else switch:char,byte,short,int 2 javax.swing.JOptionPane.showConfirmDialog ...

  5. hystrix -hystrix常用配置介绍

    配置官网介绍地址:https://github.com/Netflix/Hystrix/wiki/Configuration hystrix.command.default.execution.iso ...

  6. LabVIEW中使用GPU进行高性能计算

    项目中需要使用LabVIEW控制NI FPGA board产生控制信号等,使用GPU对采集的数据进行高性能计算,因此方案之一是用Visual Studio设计基于CUDA的GPU并行计算算法代码,然后 ...

  7. FCT test device

  8. Sqlserver 存储过程 返回-6

    存储过程中没有返回 手动返回-6的代码,但是一直接收到-6返回值. 经最后研究发现,是粗心导致的,Insert插入数据时在非空字段插入了Null值导致出现异常,所以返回了-6. 所以说在事务中,可能会 ...

  9. linux生成随机密码的十种方法

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...

  10. three.js入门系列之导入拓展类

    先来看一下three.js包的目录结构: 我们使用的时候,可以一次性import所有的功能,也可以按需引入,全依赖three.module.js这个文件对three.js的功能作了模块化处理: 但是, ...