本文目录
- Hadoop 原理
- hdfs读流程
- hdfs写流程
- Hive 原理
- HBase 原理
- Flume 运行原理
- kafka 原理
- MapReduce 原理
- Spark 原理
Hadoop 原理
hdfs读流程
HDFS文件读流程:
客户端读取数据的过程如下:
(1)首先客户端会调用FileSystem. open()方法获取的dfs实例,dfs会向远程的NameNode发送RPC请求。
(2)然后NameNode会视情况返回文件的部分或全部的块列表,对于每个块呢,都包含块所在的DataNode地址,这些DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离,然后进行排序,客户端会选择离他最近的DataNode来读取块,如果客户端本身就是一个DataNode,那么将从本地读取文件。
(3)读取完当前块数据后,关闭当前的DataNode连接,并为读取下一个块寻找最佳的DataNode。
(4)然后客户端会继续向NameNode获取下一批块列表,当所有的block块完都读完后,这时就会调用close方法来完成资源的关闭操作。
hdfs写流程
HDFS文件写流程:
客户端写数据的过程如下:
(1)检查目标文件是否已存在,父目录是否存在。
(2)NameNode 返回是否可以上传。不能上传会返回异常。
(3)确定可以上传,客户端请求第一一个block 上传到哪几个datanode服务器上
(4)NameNode返回3个datanode节点,假定分别为dn1、dn2、 dn3。
(5)客户端通过FSDataOutputStream模块请求dn1.上传数据,dn1 收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1. dn2、 dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet (64KB)为单位,dn1 收到一个packet就会传给dn2,dn2 传给dn3; dn1 每传一个packet会放入一个应答队列等待应答。
(8)当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7 步)。
或者点击此处去查看hdfs读写流程
Hive 原理
点击此处去查看相关内容
HBase 原理
点击此处去查看HBase读写数据流程
Flume 运行原理
Flume的运行原理是:Flume的核心角色为Agent,Flume分布式系统常常是由很多的Agent连接而形成的。Agent内部有三个组件,一是Source采集源,用于跟数据源对接,获取数据。二是Channel通道,Agent内部的数据传输通道,用于从source将数据传递到Sink。三是Sink目标地,采集数据的传送目的地,用于往下一级agent传递数据或者往最终存储系统传递数据。采集模式分为单级和多级采集模式。
kafka 原理
点击此处去查看相关内容
MapReduce 原理
点击此处去查看相关内容
Spark 原理
先上图:
Spark运行的基本流程图:
或者这个图:
可以看出Spark运行经过以下几个阶段:
1、用户编写好SparkContext,新创建的SparkContext连接资源管理器cluster manager,其实Spark的还有其他优秀的资源管理器可以用,比如Standalone,Apache Mesos,YARN等。资源管理器根据用户提交SparkContext时的设置,分配CPU和内存等信息,也包括任务分配以及任务监控等,这些是SparkContext向资源管理器申请的。
2、资源管理器收到用户应用提交,为应用启动执行任务的进程executor。可以看到系统可以有很多工作节点WorkNode,executor为某工作节点的一个进程。executor通过心跳向资源管理器汇报运行情况,也就是实现任务调度与监控。
3、具体是怎么执行任务的?SparkContext是用户编写创建的,里面有环境配置信息以及应用程序。SparkContext内部是这样的:结合RDD对象和依赖关系创建出有向无环图——DAG图(我理解为拓扑结构),RDD是一种内存共享模型,全称为弹性分布式数据集,可以这么理解RDD从之前的RDD中衍生出来并包含了依赖信息(就是和之前的数据有啥不一样),这样避免了数据丢失时进行检查点操作(就是=一步一步查),它只需要找到父RDD就能很好的恢复,粗略的想象成C++的继承派生会好理解一点。创建成DAG图后调用DAG Scheduler调度器将DAG分为几个阶段,阶段就是任务集,然后交给任务调度器来处理,任务调度器TaskScheduler把任务task发送给executor,SparkContext将应用程序也发给executor来执行。任务控制点Driver会不断的调用task给executor来执行,直到完成或者超过运行次数。
从构成关系看,一个用户应用由一个任务控点Driver和几个作业job构成,作业由几个阶段stage构成,一个阶段由几个任务task构成,多个任务并发(多线程处理)开销更低效率更高。
从任务执行的角度看,控制点Driver向资源管理器申请资源,资源管理器启动executor,配置好环境,executor向控制点申请任务,task和应用程序发送给executor执行,迭代调用到任务完成。
其中:
1、Application:Spark应用程序:指的是用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。
2、Driver:驱动程序:Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver
3、Cluster Manager:资源管理器:指的是在集群上获取资源的外部服务,常用的有:Standalone,Spark原生的资源管理器,由Master负责资源的分配;Haddop Yarn,由Yarn中的ResearchManager负责资源的分配;Messos,由Messos中的Messos Master负责资源管理。
4、Executor:执行器:Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor
5、Worker:计算节点:集群中任何可以运行Application代码的节点,类似于Yarn中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点
6、DAGScheduler:有向无环图调度器:基于DAG划分Stage 并以TaskSet的形势提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。
7、TaskScheduler:任务调度器:将Taskset提交给worker(集群)运行并回报结果;负责每个具体任务的实际物理调度。
8、Job:作业:由一个或多个调度阶段所组成的一次计算作业;包含多个Task组成的并行计算,往往由Spark Action催生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation。
9、Stage:调度阶段:一个任务集对应的调度阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;Stage分成两种类型ShuffleMapStage、ResultStage。
ps:望多多支持,后续更新中。。。