一、spark是什么

扩展了mapreduce的计算模型,高效的支持多种计算模型。

sparkgongju spark工具_sparkgongju


Spark Core 实现了Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark SQL 是Spark 用来操作结构化数据的程序包。使用hive sql,支持多种数据格式。

Spark 提供的对实时数据进行流式计算的组件。本质是微批处理

Spark 提供的包含常见机器学习(ML)功能的库。分类、回归、聚类、协同过滤等模型评估、数据导入等额外的支持功能。Mahout(Runs on distributed Spark, H2O, and Flink)。

GraphX是Spark 提供的图计算和图挖掘的库。与Spark Streaming 和Spark SQL 类似,GraphX 也扩展了Spark 的RDD API,能用来创建一个顶点和边都包含任意属性的有向图。GraphX还支持针对图的各种计算和常见的图算法。

二、spark与hadoop的关系

sparkgongju spark工具_数据_02

三、spark生态体系

sparkgongju spark工具_spark_03

四、spark编程模型

1、MR vs spark

sparkgongju spark工具_sparkgongju_04


2、对比MR的核心概念

sparkgongju spark工具_调度模块_05


3、spark application组成

sparkgongju spark工具_sparkgongju_06


Driver program 生成sparkcontext,当有RDD操作时,在woker node节点上会启动executor进程,rDD操作在task任务中完成。

以SparkContext为程序运行的总入口,在SparkContext的初始化过程中,Spark会分别创建DAGScheduler作业调度和TaskScheduler任务调度两级调度模块。

其中作业调度模块是基于任务阶段的高层调度模块,它为每个Spark作业计算具有依赖关系的多个调度阶段(通常根据shuffle来划分),然后为每个阶段构建出一组具体的任务(通常会考虑数据的本地性等),然后以TaskSets(任务组)的形式提交给任务调度模块来具体执行。而任务调度模块则负责具体启动任务、监控和汇报任务运行情况

sparkgongju spark工具_sparkgongju_07

RDD到RDD的转换操作为transaction操作,最终求的RDD写入hdfs或者缓存、等称为action操作。当有些变量是多个task需要的,可以设置广播变量,让task任务从广播变量中去数据。设置累加器,task可以向累加器中写数据,累加器做累加操作。
4、RDD
1) 弹性分布式数据集
RDD 是只读的。
RDD 是分区记录的集合。
RDD 是容错的。— lineage
RDD 是高效的。
RDD 不需要物化。—物化:进行实际的变换并最终写入稳定的存储器上
RDD 可以缓存的。—可指定缓存级别

RDD是spark的核心,也是整个spark的架构基础,RDD是弹性分布式集合(Resilient Distributed Datasets)的简称,是分布式只读且已分区集合对象。这些集合是弹性的,如果数据集一部分丢失,则可以对它们进行重建

2)RDD接口

五大特征:分区、依赖性、计算函数、分区策略、本地性策略

sparkgongju spark工具_调度模块_08


3)本质特征

sparkgongju spark工具_sparkgongju_09


4)partions

sparkgongju spark工具_调度模块_10


5)preferredLocations

返回此RDD的一个partition的数据块信息,如果一个数据块(block)有多个备份在返回所有备份的location地址信息

主机ip或域名

作用:spark在进行任务调度室尽可能根据block的地址做到本地计算

6)Dependencies

RDD之间的依赖关系分为两类:

窄依赖,每个父RDD的分区都至多被一个子RDD的分区使用,即为OneToOneDependecies;

宽依赖,多个子RDD的分区依赖一个父RDD的分区,即为ShuffleDependency 。

sparkgongju spark工具_数据_11


两种依赖相比较:

窄依赖相比宽依赖更高效资源消耗更少。允许在单个集群节点上流水线式执行,这个节点可以计算所有父级分区。例如,可以逐个元素地依次执行filter操作和map操作。相反,宽依赖需要所有的父RDD数据可用并且数据已经通过类MapReduce的操作shuffle完成。在窄依赖中,节点失败后的恢复更加高效。因为只有丢失的父级分区需要重新计算,并且这些丢失的父级分区可以并行地在不同节点上重新计算。与此相反,在宽依赖的继承关系中,单个失败的节点可能导致一个RDD的所有先祖RDD中的一些分区丢失,导致计算的重新执行。

7)compute

Spark对RDD的计算是以partition为最小单位的,并且都是对迭代器进行复合,不需要保存每次的计算结果

8)Partitioner

目前spark中提供两种分区函数:HashPatitioner(哈希分区),RangePatitioner(区域分区)

且partitioner只存在于(K,V)类型的RDD中,rdd本身决定了分区的数量

9)

sparkgongju spark工具_sparkgongju_12


10)Transaction操作

惰性求值:

RDD 的转化操作都是惰性求值的。这意味着在被调用行动操作之前Spark 不会开始计算。读取数据到RDD的操作也是惰性的。

惰性求值的好处:

Spark 使用惰性求值可以把一些操作合并到一起来减少计算数据的步骤。在类似

Hadoop MapReduce 的系统中,开发者常常花费大量时间考虑如何把操作组合到一起,以减少MapReduce 的周期数。而在Spark 中,写出一个非常复杂的映射并不见得能比使用很多简单的连续操作获得好很多的性能。因此,用户可以用更小的操作来组织他们的程序,这样也使这些操作更容易管理。

转换操作:我们不应该把RDD 看作存放着特定数据的数据集,而最好把每个RDD 当作我们通过转化操作构建出来的、记录如何计算数据的指令列表

sparkgongju spark工具_spark_13


sparkgongju spark工具_调度模块_14


11)控制操作

persist操作,可以将RDD持久化到不同层次的存储介质,以便后续操作重复使用。

cache:RDD[T]

persist:RDD[T]

Persist(level:StorageLevel):RDD[T]

Checkpoint操作

将RDD持久化到HDFS中,与persist操作不同的是checkpoint会切断此RDD之前的依赖关系,而persist依然保留RDD的依赖关系。

12)action操作

sparkgongju spark工具_sparkgongju_15


sparkgongju spark工具_数据_16


saveAsTextFile和count是两个action操作,每个action操作会从头开始计算,使用cache保存下时就不会从头开始计算。

5、PairRDD

1)转换操作

sparkgongju spark工具_sparkgongju_17


sparkgongju spark工具_sparkgongju_18


2)Action操作

sparkgongju spark工具_调度模块_19


3)自定义分区