Hadoop生态圈原理整理
Hadoop
主要架构:HDFS,Mapreduce,Yarn
Hdfs功能组件
namenode作用:1.管理文件目录结构 fsimage和Edits 2.管理数据节点Datanode
DataNode的作用:具体存储数据的节点
SecondaryNamenode的作用:辅助生成目录镜像,定期加载fsimage和Edits合成新的fsimage返回namenode
hdfs读原理
client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象
就近挑选一台datanode服务器,请求建立输入流 。
DataNode向输入流中中写数据,以packet为单位来校验。
关闭输入流
hdfs写原理
客户端向NameNode发出写文件请求。
检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。
client端按128MB的块切分文件
client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNclient将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。
每个DataNode写完一个块后,会返回确认信息。
写完数据,关闭输输出流。
发送完成信号给NameNode。
Mapreduce原理
1、输入文件分片,每一片都由一个MapTask来处理
2、Map输出的中间结果会先放在内存缓冲区中,这个缓冲区的大小默认是100M,当缓冲区中的内容达到80%时(80M)会将缓冲区的内容写到磁盘上。也就是说,一个map会输出一个或者多个这样的文件,如果一个map输出的全部内容没有超过限制,那么最终也会发生这个写磁盘的操作,只不过是写几次的问题。
3、从缓冲区写到磁盘的时候,会进行分区并排序,分区指的是某个key应该进入到哪个分区,同一分区中的key会进行排序,如果定义了Combiner的话,也会进行combine操作
4、如果一个map产生的中间结果存放到多个文件,那么这些文件最终会合并成一个文件,这个合并过程不会改变分区数量,只会减少文件数量。例如,假设分了3个区,4个文件,那么最终会合并成1个文件,3个区
5、以上只是一个map的输出,接下来进入reduce阶段
6、每个reducer对应一个ReduceTask,在真正开始reduce之前,先要从分区中抓取数据
7、相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据,在抓取的过程中伴随着排序、合并。
8、reduce输出
Yarn原理
(1)Client向ResourceManager提交作业 job(可以是Spark/Mapreduce作业)
(2)ResourceManager会为这个作业(job)分配一个container(如果前面有正在运行的Job,则放入FIFO进行等待,直到轮到此Job)
(3)ResourceManager与NodeManager通信,要求NodeManger在刚刚分配好的container上启动应用程序的Application Master
(4)Application Master先去向ResourceManager注册,而后ResourceManager会为各个任务申请资源,并监控运行情况
(5)Application Master采用轮询(polling)方式向ResourceManager申请并领取资源(通过RPC协议通信)
(6) Application Manager申请到了资源以后,就和NodeManager通信,要求NodeManager启动任务
最后,NodeManger启动作业对应的任务。
HIve
主要组件
1。客户端组件:JDBC/ODBC等等
2.元数据管理组件
3.接口服务组件:hiveServer2
4.计算引擎组件:
5.执行引擎组件:MR 当然也可以是Tez(后者是省略了Shuffle过程)
6.Hive on Spark:
7.Strorage:Hadoop 基于Hdfs 存储
工作原理
Hive是一种建立在Hadoop文件系统上的数据仓库架构 对存储在HDFS中的数据进行分析和管理
将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能 ,可以将 SQL 语句转换为 MapReduce 任务进行运行 ,使不熟悉 MapReduce 的用户也能很方便地利用 SQL 语言对数据进行查询、汇总、分析
Hbase主要原理
是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库
实质:利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理 HBase中的海量数据,利用Zookeeper作为其分布式协同服务
HBase是谷歌BigTble的开源实现 ,和传统的行式数据库不同的是,HBase是列式数据库 ,列式数据的特点是开源横向扩展,将一张表的数据存储在hadoop集群的不同datanode中,一张表的存储量可以达到TB级别。这是行式关系型数据库无法实现的
Hbase的读流程
1.Client先访问Zookeeper,从meta表读取Region的位置,然后读取meta表中的数据。meta中又存储了用户表的Region信息
2.根据namespace,表名和RowKey在meta表中找到对应的Region信息
3.找到这个Region对应的RegionServer
4.查找对应的Region
5.先从BlockCache找数据,如果没有,再到MemStore里面读
6.MemStore如果没有,再到StoreFile上读(为了读取的效率)
7.如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache里,再返回给客户端。
Hbase写流程
1.客户端向ZK发送请求,获取meta表所在的RegionServer
2.客户端通过RegionServer获取到meta表的数据
3.然后客户端向集群中的RegionServer发送写入数据的请求
4.RegionServer收到写数据的请求后,将数据写到HLog中,这一步是为了数据的持久化和恢复
5.RegionServer将数据写入内存(MemStore)
6.然后通知客户端数据写入成功。
核心组件
Table:可理解为传统数据库中的一个表,但因为SchemaLess的设计,它较之传统数据库的表而言,在设计上更加灵活。
HRegion
将表横向切割为一个个子表,子表在HBase中被称之为Region。
每一个HRegion是由一个或者多个Store组成,每个Store实际上存储的是一个列簇,在每个Store中又包含一块MemStore。Memstore当达到阈值之后再flush(默认是64M)到对应的StoreFile(又名HFile),当StoreFile达到一定的阈值就会分裂(默认是256M),当StoreFile的数量多到指定的阈值,就会触发合并,这边同时合并版本以及删除之间要删除的数据,合并后大小达到阈值就会split
so:一个HRegionServer管理多个表,一个表下有多个Region,一个HRegion有多少个列簇就有多少个Store,Store下有多个StoreFile文件,StoreFile是Hbase中最小的存储单元,HFile是底层存储格式
HRegionServer
1.数据服务进程,处理来自客户端的读写请求
2.管理master为其分配的region
3.负责和底层HDFS的交互
4.负责Region变大后的切分
5.负责StroeFile的合并
HFile:HBase数据库在底层分布式文件系统中的文件组织形式。
Column Family:一些列的集合 称为列簇
MemStore:用来在内存中缓存一定大小的数据,达到设定的阈值后批量写入到底层文件系统中。数据是有序的。
HLog(WAL log):
以key,value的形式记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复。
每个HRegionServer维护一个HLog*
Zookeeper
1.对RegionServer的监控
2.元数据的入口 (通过zookeeper集群可以获取当前系统表.META.的存储所对应的RegionServer信息 )
3.负责Master的高可用
4.负责集群配置的维护
HMaster
1.为RegionServer分配Region
2.发现失效的Region,并分配到正常的RegionServer上
3.维护整个集群负载均衡
4.维护集群的元数据信息
Spark核心组件
RDD
分布式弹性分布式数据集代表不可变,分区化的元素集合,可以进行并行操作
五大特性:
分区列表
用于计算每个切片的函数(算法)
到其他RDD的依赖列表
(可选)对于KV类型的RDD有一个分区类
(可选)计算每个切片的首选位置列表
SparkContext
上下文创建时,在worker节点直接启动job的执行器进程(CoarseGrainedExecutorBackend),spark入口点,表示到spark集群的一个连接。创建该类时,同时创建task调度器和后台调度器,后台调度器还要决定默认并发度问题。
DagScheduler
高级调度层,面向stage进行调度,为每个job计算stage,寻找最优路径执行job。该调度器以taskset方式提交stage给下层调度器(TaskScheduler)。Spark以shuffle为边界,将众多的RDD划分成stage,窄依赖的RDD划分到一个stage中。shuffle依赖需要多个stage,DAG调度检测运行task的首选位置,该调度器将位置信息和状态传递给底层的task调度器。DAG调度器处理因shuffle output丢失导致故障,此时上一个stage需要重新提交。在阶段stage内,不是由shuffle output丢失导致的故障都由下层的task调度器处理。缓存跟踪,避免rdd重复计算。首选位置:首选那个节点来执行task。为了防止内存泄漏,job完成后清除数据结构。递归提交每个Stage,每个stage都是以Tasket方式提交任务集合给下层的TaskScheduler,因此Dag调度器需要计算每个stage的任务集合。
TaskScheduler
Job 一个action触发一个job
stage 一个job分为一个或者多个Stage,stage是task的集合,数量同stage的最后的一个rdd的分区数相同。stage按照shuffle进行划分边界,存在前后依赖,上一阶段计算输出,下一个提取上一个的结果。主要有两种类型stage: ResultStage 和ShuffleMapStage
Task 可以理解为RDD的每个Partition
主要原理
构建Spark Application的运行环境,启动SparkContext
SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend,
Executor向SparkContext申请Task
SparkContext将应用程序分发给Executor
SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行
Task在Executor上运行,运行完释放所有资源
Flume主要介绍
一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理, 并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。你可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。
Sink负责持久化日志或者把事件推向另一个Source。
主要概念
Client:生产数据,运行在一个独立的线程。
Event:一个数据单元,消息头和消息体组成。
Flow: Event从源点到达目的点的迁移的抽象。
Agent: 一个独立的Flume进程,也是最小的独立运行单位。 包含组件Source、 Channel、 Sink。(Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。)
Source: 数据收集组件。(source从Client收集数据,传递给Channel)
Channel: 中转Event的一个临时存储,保存由Source组件传递过来的Event。
Sink: 从Channel中读取并移除Event ,传递到目的地
kafka
主要组件
broker:中间的kafka cluster,存储消息,是由多个server组成的集群。
topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据。
producer:往broker中某个topic里面生产数据。
consumer:从broker中某个topic获取数据。
Sqoop(同步工具)
Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。
GraphX(图计算模型)
在GraphX中,操作者执行一系列的超步,在这些超步中,顶点从之前的超步中接收进入消息,为顶点属性计算一个新的值,然后在以后的超步中发送消息到邻居顶点。不像Pregel而更像GraphLab,消息通过边triplet的一个函数被并行计算,消息的计算既会访问源顶点特征也会访问目的顶点特征。
此外GraphX的优点还包括:
允许用户把数据当做一个图和一个集合(RDD),而不需要数据移动或者复制。
可以无缝与Spark SQL、MLLib等结合,方便且高效地完成图计算整套流水作业。
Ambari
Apache Ambari 的作用来说,就是创建、管理、监视 Hadoop 的集群,是为了让 Hadoop 以及相关的大数据软件更容易使用的一个web工具。
Oozie(工作流调度器)
Oozie是一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。
Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。
Oozie使用hPDL(一种XML流程定义语言)来描述这个图。