HDFS(一)
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(一)的更多相关文章
- hadoop 2.7.3本地环境运行官方wordcount-基于HDFS
接上篇<hadoop 2.7.3本地环境运行官方wordcount>.继续在本地模式下测试,本次使用hdfs. 2 本地模式使用fs计数wodcount 上面是直接使用的是linux的文件 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- python基础操作以及hdfs操作
目录 前言 基础操作 hdfs操作 总结 一.前言 作为一个全栈工程师,必须要熟练掌握各种语言...HelloWorld.最近就被"逼着"走向了python开发之路, ...
- 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. ...
- HDFS的架构
主从结构 主节点,只有一个: namenode 从节点,有很多个: datanodes 在版本1中,主节点只有一个,在 版本2中主节点有两个. namenode 负责(管理): 接收用户操作请求 维护 ...
- hdfs以及hbase动态增加和删除节点
一个知乎上的问题:Hbase的Region server和hadoop的datanode是否可以部署在一台服务器上?如果是的话,二者是否是一对一的关系?部署在同一台服务器上,可以减少数据跨网络传输的流 ...
- 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 ...
- 01 HDFS 简介
01.HDFS简介 大纲: hadoop2 介绍 HDFS概述 HDFS读写流程 hadoop2介绍 框架的核心设计是HDFS(存储),mapReduce(分布式计算),YARN(资源管理),为海量的 ...
- 何为HDFS?
该文来自百度百科,自我收藏. Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...
- Flume(4)实用环境搭建:source(spooldir)+channel(file)+sink(hdfs)方式
一.概述: 在实际的生产环境中,一般都会遇到将web服务器比如tomcat.Apache等中产生的日志倒入到HDFS中供分析使用的需求.这里的配置方式就是实现上述需求. 二.配置文件: #agent1 ...
随机推荐
- HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp
题意:给定上一棵树,然后每条边有一个权值,然后每个点到 1 的距离有两种,第一种是直接回到1,花费是 dist(1, i)^2,还有另一种是先到另一个点 j,然后两从 j 向1走,当然 j 也可以再向 ...
- poj2007极角排序
裸的极角排序,但是要把0,0放在第一个(话说这题题目真是巨长,废话也多...) #include<map> #include<set> #include<cmath> ...
- 使用Easy4net编写代码生成器
在项目中经常要手动创建和数据库对应的实体类,如果数据库表比较多或者表字段比较多,那会是一个工作量非常大的事情,所以我根据自己的需求写了一个简单的代码生成工具,工具使用Easy4net框架开发. 下面是 ...
- Linux IPv6 地址配置
添加IPV6地址ip -6 addr add <ipv6address>/<prefixlength> dev <interface>ip -6 addr add ...
- JWT(JSON Web Token) Java与.Net简单编码实现
参考 JWT(JSON WEB TOKENS)-一种无状态的认证机制 基于Token的WEB后台认证机制 各种语言版本的基于HMAC-SHA256的base64加密 Java与.Net实现实现 // ...
- Algorithm4.子数组求和贪心
子数组求和最大问题 20131011 问题描述 一个数组中,有整数也有复数,求这个数组的所有子数组中,求和最大的值. 这是一个动态规划问题,乍看上去没有什么简单的方法,把所有的情况列出来就可以了,但是 ...
- Rsync安装和配置
一.Rsync简介 1.1什么是Rsync Rsync是一款快速的,开源的,多功能的,可以实现全量和增量的远程和本地的数据同步和数据备份的工具. 全量的概念是:全部备份. 增量的概念是:差异化备份.对 ...
- nginx的编译,和简单的配置问题
反向代理常见的lvs.haproxy. 缓存服务常见的.squid.vanish.常见的前端缓存.Apache是多进程的web服务器,Nginx是多线程的web服务器. Nginx的特点,对静态能力强 ...
- C++ 各种继承方式的类内存布局
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...