摘要:本文主要对hadoop的原理性知识进行汇总,包括核心组件、HDFS存储原理、HDFS shell命令、HDFS Java端API、MapReduce基本原理、shuffle基本原理、sort过程等。
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写文件时