hadoop spark 笔记

MapReduce的缺点:中间结果会借助磁盘传递,大量的Map-Reduced作业受限于IO


对延时要求较为苛刻的用例,比如:

  • 对流数据进行处理来做近实时分析
  • 在大型数据集上进行交互式分析

Spark堆栈中的组件

hadoop spark 笔记_第1张图片
  • spark的核心是RDD(弹性分布式数据集),一种通用的数据抽象,封装了基础的数据操作,如map,filter,reduce等。
  • RDD提供数据共享的抽象,相比其他大数据处理框架,如MapReduce和HIVE等均缺乏此特性,所以RDD更为通用。
  • 简要地概括RDD:RDD是一个不可修改的,分布的对象集合。每个RDD由多个分区组成,每个分区可以同时在集群中的不同节点上计算。RDD可以包含Python,Java和Scala中的任意对象。

RDD

  • RDD的操作主要分两类:转换(transformation)和动作(action)。两类函数的主要区别是,转换接受RDD并返回RDD,而动作接受RDD但是返回非RDD。
  • 转换采用惰性调用机制,每个RDD记录父RDD转换的方法,这种调用链表称之为血缘(lineage);通过血缘连接的RDD操作可以管道化(pipeline),管道化的操作可以直接在单节点完成,避免多次转换操作之间数据同步的等待。
  • 动作调用会直接计算。
  • 使用血缘串联的操作可以保持每次计算相对简单,而不用担心有过多的中间数据,因为这些血缘操作都管道化了,这样也保证了逻辑的单一性。
hadoop spark 笔记_第2张图片
RDD使用具有一般的模式,可以抽象为下面的几步
  1. 加载外部数据,创建RDD对象
  2. 使用转换(如filter),创建新的RDD对象
  3. 缓存需要重用的RDD
  4. 使用动作(如count),启动并行计算

Spark官方提供的数据是RDD在某些场景下,计算效率是Hadoop的20X

RDD数据只读,不可修改。如果需要修改数据,必须从父RDD转换(transformation)到子RDD。所以,在容错策略中,RDD没有数据冗余,而是通过RDD父子依赖(血缘)关系进行重算实现容错。

RDD数据在内存中,多个RDD操作之间,数据不用落地到磁盘上,避免不必要的I/O操作。


RDD高效的主要因素是尽量避免不必要的操作和牺牲数据的操作精度,用来提高计算效率。

Spark逻辑视图

hadoop spark 笔记_第3张图片
在Spark应用中,整个执行流程在逻辑上会形成有向无环图(DAG)。

Action算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。

Spark的调度方式与MapReduce有所不同。Spark根据RDD之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。

图中的A、B、C、D、E、F分别代表不同的RDD,RDD内的方框代表分区。

数据从HDFS输入Spark,形成RDD A和RDD C,RDD C上执行map操作,转换为RDD D, RDD B和 RDD E执行join操作,转换为F,而在B和E连接转化为F的过程中又会执行Shuffle,最后RDD F 通过函数saveAsSequenceFile输出并保存到HDFS或 Hbase中

Spark架构

hadoop spark 笔记_第4张图片
Spark架构采用了分布式计算中的Master-Slave模型。

Master是对应集群中的含有Master进程的节点(ClusterManager),Slave是集群中含有Worker进程的节点。
hadoop spark 笔记_第5张图片
  • Master作为整个集群的控制器,负责整个集群的正常运行
  • Worker相当于是计算节点,接收主节点命令与进行状态汇报
  • Executor负责任务的执行
  • Client作为用户的客户端负责提交应用
  • Driver负责控制一个应用的执行
Spark的整体流程为:
  1. Client 提交应用,Master找到一个Worker、启动Driver
  2. Driver向Master或者资源管理器申请资源,将应用转化为RDD Graph
  3. DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler
  4. 由TaskScheduler提交任务给Executor执行

你可能感兴趣的:(java)