Hadoop原理汇总(一)——HDFS
来源:互联网 发布:单片机是什么专业学的 编辑:程序博客网 时间:2024/06/07 03:04
摘要:本文主要对hadoop的原理性知识进行汇总,包括核心组件、HDFS存储原理、HDFS shell命令、HDFS Java端API、MapReduce基本原理、shuffle基本原理、sort过程等。
原文:http://blog.csdn.net/u010255818/article/details/72730864
1 Hadoop核心组件
生态系统图
HDFS文件系统
它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。
● Client:切分文件;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。
● NameNode:管理HDFS的文件命名空间,处理客户端请求。
● DataNode:存储实际的数据,汇报存储信息给NameNode。
● Secondary NameNode:定期合并NameNode的fsImage(文件镜像)和fsEdits(操作日志),推送给NameNode;可辅助恢复NameNode。MapReduce分布式计算框架
Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同 “键”的所有“值”进行规约,以得到最终结果。
JobTracker:管理所有作业,将任务分解成一系列任务,并分派给TaskTracker。
TaskTracker:运行Map Task和Reduce Task;并与JobTracker交互,汇报任务状态。
Map Task:解析每条数据记录,传递给用户编写的map(),将输出结果写入本地磁盘。
Reducer Task:从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行。Hive数据仓库
Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析HBase数据库
HBase 是一个面向列的动态模式数据库,键由行关键字、列关键字和时间戳构成。HBase提供了对大规模数据的随机、实时读写访问,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。
数据模型:Schema-->Table-->Column Family-->Column-->RowKey-->TimeStamp-->Value
zookeeper分布式协作服务
解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等sqoop数据同步工具
Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。
数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。pig数据流系统
设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具
定义了一种数据流语言—Pig Latin,将脚本转换为MapReduce任务在Hadoop上执行。
通常用于进行离线分析Mahout数据挖掘算法库
Mahout 的主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout现在已经包含了聚类、分类、推 荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法。除了算法,Mahout还包含数据的输入/输出工具、与其他存储系统(如数据库、 MongoDB 或Cassandra)集成等数据挖掘支持架构。Flume日志收集工具
将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流。在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、 格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。
2 HDFS存储原理
2.1 HDFS整体结构
(1)NameNode
管理数据节点和文件块的映射关系;处理客户端对数据的读写请求。
NameNode保存了两个核心的数据结构FsImage和EditLog。FsImage用于维护文件系统树以及元数据;EditLog记录了文件的操作。NameNode不持久化Block与DataNode的映射信息,而是在系统每次启动时扫描所有DataNode来重构这些信息。
(2)DataNode
负责数据的存储和读取;向NameNode定期发送自己的存储块信息;周期性地向NameNode发送心跳信息报告自己的状态。
HDFS集群中只有一个NameNode,负责所有元数据的管理;有若干DataNode,每个DataNode运行在一个独立节点上。
(3)SecondaryNameNode
对NameNode进行备份。周期性地从NameNode
下载EditLog与FsImage,将EditLog与FsImage合并得到FsImage.ckpt,将合并后的FsImage.ckpt上传到NameNode,更新NameNode的EditLog与FsImage。
(4)读写过程
客户端向HDFS写文件时,先请求NameNode节点获取分配的存储位置,然后根据存储位置直接把数据写入DataNode;客户端向HDFS读数据时,先请求NameNode获取文件块和数据节点的映射关系,然后直接到数据节点访问相应位置的文件块
2.2 关于Block大小
(1)HDFS默认文件块Block大小为64MB,如果一个文件小于Block,则它并不占用整个Block空间大小。
(2)Block不宜过大,MapReduce的Map任务一次只能处理一个Block的数据,Block过大会使启动的Map数量过少,影响并行处理速度。
(3)HDFS无法高效存储大量小文件
检索效率:HDFS中NameNode的元数据保存在内存中,过多的小文件需要大量内存空间,降低数据检索效率;
寻址开销:访问大量小文件,需要不断从一个DataNode跳到另一个DataNode,寻址开销增大;
线程开销:MapReduce处理大量小文件时会产生过多的Map任务,线程管理开销会大大增加;
2.3 HDFS数据存取策略
(1)数据存放
HDFS默认冗余参数是3,一个Block会保存在3个地方。两份副本存放在同一机架的不同机器上,第三个副本存放在不同机架的机器上,即保证高可靠性,又提高读写性能。
(2)数据读取
客户端从名称节点获取不同副本的存放位置列表,当发现有数据副本的机架与客户端机架相同时,优先选择该副本;否则,随机选取一个副本。
(3)数据复制
采用流水线复制策略。Client向HDFS写文件时,先将文件写到本地,并切分成若干块,每个块都向NameNode发送写请求。Client根据DataNode的使用情况,返回一个节点列表给客户端。客户端把数据首先写入第一个DataNode,同时把节点列表传给第一个DataNode;当第一个DataNode接收4KB数据时,写入本地,并向列表的第二个DataNode发起连接,把接收到的4KB数据和节点列表传给第二个DataNode;依次列推,列表中的多个数据节点形成一条数据复制流水线。当文件写完时,数据复制也同时完成。
2.4 数据错误与恢复
NameNode出错:利用SecondaryNode中的FsImage与EditLog数据进行恢复
DataNode出错:DataNode定期向NameNode发送心跳信息报告自己的状态,超时未收到心跳信息会被标记为宕机,该DataNode不再可用。NameNode一旦发现某个Block的副本数量小于冗余因子,则对数据进行冗余复制。
数据出错:网络传输与磁盘错误等因素均会造成数据错误。读取数据时,客户端会采用MD5和shal对数据块进行校验;写数据时,将文件块的信息摘录写入同一路径的隐藏文件,在读取时进行校验,如果校验失败则请求读取另一副本,并报告NameNode。
3 HDFS的Shell操作
HDFS的shell操作中部分基于hadoop工具的操作已经被hdfs工具替代,但仍有一些基于hadoop工具的操作未被替代。
(1)hdfs工具
(2)hadoop工具
(3)主要命令
- 1
- 2
- 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
hadoop fs命令参数与hdfs dfs命令参数完全一致,HDFS中hdfs dfs工具替代了hadoop fs工具:
4 HDFS Java端API
(1)Configuration类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(2)FileSystem
第一个无参构造方法返回默认文件系统,即core-site.xml中fs.defaultFS项,若未设置则默认返回本地文件系统;其他带URI参数的构造方法通过URI参数指定文件系统。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
(3)FSDataInputStream,继承自java.io.DataInputStream
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
(4)FSDataOutputStream,继承自java.io.DataOutputStream
- 1
- 2
- 3
(5)FileStatus
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
(6)Path
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
(7)URI,java.net.URI
- 1
- 2
- 3
- 4
- 5
(8)PathFilter
- Hadoop原理汇总(一)——HDFS
- Hadoop原理汇总(一)——HDFS
- Hadoop快速实战(三)——HDFS原理
- Hadoop——HDFS运行原理
- Hadoop——hdfs原理详解
- Hadoop(一)-HDFS
- Hadoop之旅(3)— HDFS 原理讲解
- hadoop(一):深度剖析hdfs原理
- Hadoop Hdfs 配置(一)
- HDFS原理分析(一)—— 基本概念
- hadoop hdfs命令汇总
- Hadoop-HDFS知识点汇总
- Hadoop原理汇总(二)——MapReduce
- Hadoop —— HDFS
- Hadoop——HDFS
- Hadoop—HDFS
- HDFS原理分析(一)
- hadoop HDFS原理基础知识
- 页面引入文件
- Coursera Using python to access Web data quiz 5
- 递归与算法分析(一)递归总论
- 阿里云实现Hadoop+Spark集群
- Hibernate中QBC查询
- Hadoop原理汇总(一)——HDFS
- 乌班图安装svn客户端
- 有关线段树的一些性质探讨(完全、平衡)
- 第三部分 学习shell与shell script的笔记(未完)
- 浴谷八连测 Round#1 T1
- 通过服务+广播+通知实现的一个通知栏音乐控制器
- php项目自动部署(利用webhook)
- Html 5中自定义data-*特性
- opencv: 图片 设置 透明度 并 叠加(cv2.addWeighted)