spark基础知识(整理-持续更新)

一.spark知识介绍

1. spark中RDD是什么?有哪些特性?

1.1 RDD(resilient distributed dataset)-弹性的分布式数据集

是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可以并行计算的数据集。

1.2 存储方式:内存/磁盘

1.3 五大特性:

  1. A list of partitions: 一个分区列表,RDD中的数据都存储在一个分区列表中。
  2. A function for computing each split: 一个函数作用在每一个分区上的RDD。
  3. A list of dependencies on other RDDS: 一个RDD依赖与其他多个RDD,这个点很重要,RDD的容错机制就是依据这个特性而来的。
  4. Optionally, a partitioner for key-value RDDS(eg:to say that the RDD is hash partitioned): 可选的,针对于key-value类型的RDD才有这个特性,作用是决定了数据的来源以及数据处理后的去向。
  5. 可选项,数据本地性,数据位置最优。

2. spark常用的算子以及它们之间的区别?

2.1 常用的算子

  1. map
    用于遍历RDD,将函数应用于每一个元素,返回一个新的RDD(transformation算子)
  2. mapPartitions
    用于遍历RDD的每一个分区,返回一个新的RDD(transformation算子)
  3. foreach
    用于遍历RDD,将函数应用于每一个元素,无返回值(action算子)
  4. foreachPartition
    用于遍历RDD中每一个分区,无返回值(action算子)
    总之:一般情况使用mapPartitions和foreachPartition算子比map和foreach更加高效,推荐使用。

3. spark中的宽窄依赖?

3.1 窄依赖(narrow dependencies)

每一个父RDD的Partition最多被子RDD的一个Partition使用,是一对一的,也就是父RDD的一个分区去到了子RDD的一个分区,这个过程没有shuffle产生

3.2 宽依赖(wide dependencies)

多个子RDD的Partition会同时依赖于一个父RDD的Partition,关系是一对多,也就是父RDD的一个分区去到了子RDD的不同分区里面,会有shuffle的产生

3.3 区分一个操作是宽/窄依赖的标准就是看父RDD的一个分区数据的流向,要是流向了一个Partition的话就是窄依赖,否则就是宽依赖。

4. RDD缓存

4.1 Spark可以使用persist和cache方法将任意RDD缓存到内存、磁盘系统中。缓存是一种容错机制,如果一个RDD分片丢失,可以通过构建他的transformation自动重构。被缓存的RDD被使用的时候,存取速度会被大大加速。一般的excutor内存60%用作缓存,剩下的40%用作task。

4.2 Spark中,RDD类可以使用cache()和persist()方法来缓存。cache是persist的特例,将RDD缓存到内存中去,而persist可以指定一个StorageLevel。StorageLevel的列表可以在StorageLevel伴生单例对象中找到。

Spark的不同StorageLevel,目的是满足内存的使用和CPU效率权衡上的不同需求。
建议如下:如果你的RDDs可以很好的与默认的存储级别(MEMORY_ONLY)契合,那就不需要做任何修改了。这已经是CPU效率最高的选项了,它是的RDDs的操作尽可能的快。如果不行,试着使用(MEMORY_ONLY_SER)并且选择一个快速序列化的库使得对象在比较高的空间使用率的情况下,依然可以被快速的访问。
尽量不要存储在硬盘上,除非计算数据集的函数,计算量特别大,或者他们过滤了大量的数据。否则,重新计算一个区分的速度和它从硬盘上取数据基本差不多,都很慢。

5. RDD共享变量

5.1 在应用开发中,一个函数被传递给spark操作(例如map和reduce),在一个远程集群上运行,它实际上操作的是这个函数用到的所有变量的独立拷贝。这些变量会被拷贝到每一台机器上。通常看来在任务之间中,读写共享变量显然不够高效。然而,spark还是为两种常见的使用模式,提铜梁两种有限的共享变量:广播变量和累加器。

(1)广播变量:
1* 广播变量缓存到各个节点的内存中,而不是每个task*
2* 广播变量被创建后,能在集群中运行的任何函数调用*
3* 广播变量是只读的,不能再被广播后修改*
4* 对于大数据集的广播,spark尝试使用高效的广播算法来降低通信成本*
(2)累加器:
1* 累加器只支持加法操作,可以高效的并行,用于时间计数器和变量求和。spark原生支持数值类型和标准可变集合的计数器,但用户可以添加新的类型。只有驱动程序才能获取累加器的值*

6. spark-submit的时候如何引入外部jar包

6.1 在通过spark-submit提交任务的时候,可以通过添加配置参数来指定jar包

-driver-class-path 外部jar包
-jars 外部jar包

6. RDD是什么以及它的分类

Spark所有的操作都围绕弹性式数据集RDD进行,这是一个有容错机制并可以被并行操作的元素集合,具有只读,分区,容错,高效,无需物化,可缓存,RDD依赖等特征。目前有两种类型的基础RDD
并行集合(Parallelized Collections):接收一个已经存在的scala集合,然后进行各种计算。
Hadoop数据集(hadoop Datasets):在一个文件的每一条记录上运行函数。只要文件系统是HDFS,或者hadoop支持的任意存储系统即可。
(1)并行化集合
并行化集合是通过调用SparkContext的parallelize方法,在一个已经存在的scala集合上创建的(一个Seq对象)。集合的对象将会被拷贝,创建出一个可以被并行操作的分布式数据集。例如,下面的解释器输出,演示了如何从一个数组创建一个并行计算集。
例如: var rdd = sc.parallelize(Array(1 to 10))根据能启动的excutor数量来进行切分多少个slice,每个slice启动一个Task来进行处理。
(2)Hadoop数据集
Spark可以将任何Hadoop所支持的存储数据源转化成RDD,如本地文件(需要网络文件系统,所有的节点都必须是能被访问到),HDFS,Cassandra,Hbase,Amazon S3等。Spark支持文本文件,SequenceFiles和任何Hadoop InputFormat格式。

7. RDD操作

RDD支持两种类操作:
转换(transformation)现在的RDD通过转化成一个新的RDD,转换是延迟操作(lazy)的。
动作(action)在RDD上运行计算后,返回结果给驱动程序或者写入文件系统。
例如:map就是一种tansformation,它将数据集合的每一个元素都传递给函数,并返回一个新的分布式数据集。reduce则是一种action操作,通过一些函数将所有的元素叠加起来,并将结果返回给Driver程序。

7.1 Transformation

1. map(func)

返回一个新的分布式数据集,有每一个输入元素经过func转换后组成。

2. filter(func)

返回一个新的数据集,由经过func函数计算后返回值为true的输入元素组成。

3. flatMap(func)

类似于map,但是每一个输入元素可以被映射为0或者多个输出元素(因为func应该返回一个序列,而不是单一元素)

4. mapPartitions(func)

类似于map,但是独立在RDD的每一个分区块上执行,因此类型为T的RDD上运行时,func函数类型必须是Iterator[T] => Iterator[U] ,mapPartitions将会被每一个数据分区块调用一次。各个数据集分区的全部内容将作为顺序的数据流传入函数func的参数中,func必须返回另一个Iterator[T]。被合并的结果自动转换成新的RDD。

5. groupByKey([numTask])

在一个(k-v)对数据集上调用,返回一个(k-seq[V])对的数据集。注意:默认情况下,只有8个并行任务来操作,单数你可以传入一个可选的numTask参数来改变它。如果分组是用来计算聚合操作的(如sum或者average),那么应该使用reduceByKey或者combineBuKey来提供更好的性能。

6. sortByKey([ascending],[numTask])

在一个(k-v)对的数据集上调用时,K必选是实现Ordered接口,返回一个按照key进行排序的(k-v)对数据集。升序或者降序有ascending决定。

7. join(otherDataset,[numTask])

在类型为(k-v)对和(k-w)类型的数据集上调用时,返回一个相同key对应的所有元素在一起的(k-(v,w))数据集。

8. collect

在驱动程序中,以数组的形式,返回数据集的所有元素。这通常会在使用filter或者其他操作并返回一个足够小的数据子集后再使用比较有用。

9. uniton(otherDataset)

返回一个新的Dataset,这个Dataset包含源dataset和给定的data的元素的集合。

10. cartesian(otherDataset)

进行笛卡尔积操作

7.2 Action操作

1. count

返回数据集的个数

2. foreach(func)

在数据集的每一个元素上,运行函数func进行更新。这通常用于边缘效果,例如更新一个累加器,或者和外部存储系统进行交互,例如Hbase。

3. saveAsTextFile(path)

将数据集的元素,以textfile的形式,保存到本地文件系统,HDFS或者其他hadoop支持的文件系统。对于每个元素,spark将会调用toString方法,将会转换为文件中的文本行。

8. driver的功能是什么

8.1 一个spark作业运行时包括一个driver进程,也就是作业的主进程,具有main函数,并且有sparkContext的实例,是程序的入口;

8.2 功能: 负责向集群申请资源,向master注册信息,负责了作业的调度,负责了作业的解析,生成stage并调度task到executor上,包括DAGScheduler,TaskScheduler。

9. spark的几种部署模式,每种模式特点

9.1 本地模式

Spark不一非要跑在hadoop集群上,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地模式分为三类
local: 只启动一个executor
local[k]: 启动k个executor
local: 启动跟cpu数目相同的executor

9.2 standalone模式

分布式部署集群,自带完整的服务,资源管理和任务监测是spark自己监控,这个模式也是其他模式的基础。

9.3 spark on yarn模式

分布式部署集群,资源和任务监控交给yarn管理,但是目前仅支持粗粒度资源分配方式,包含cluster和colent运行模式,cluster适合生产,driver运行在集群子节点,具有容错功能,client适合调试,driver运行在客户端。

9.4 spark on mesos模式

官方推荐的这种模式(当然,原因之一是血缘关系)。这个是由于spark开发之初九考虑到支持mesis,因此,目前而言,spark运行在mesos上会比运行在yarn上更加灵活,更加自然。用户可以选择两种调度模式之一运行自己的应用程序。

粗粒度模式: 每个应用程序运行环境由一个Driver和若干个executor组成,其中,每个executor占用若干资源,内存可运行多个task,应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源

细粒度模式:鉴于粗粒度模式会造成资源的浪费,spark on mesos还提供了另外一种调度模式,细粒度模式,这种模式类似于现在的云计算,思想是安息分配

10. spark技术栈有哪些组件,每个组件都有什么功能,适合什么样的应用场景

10.1 spark core:是其他组件的基础,spark的内核,主要包括:有向循环图,RDD,Lingage,Cache,broadcast等,并封装了底层通讯框架,是spark的基础。

10.2 SparkStreaming是一个对实时数据流进行高通量,容错处理的流处理系统,可以对多种数据源(如kafka、Flume、Twitter、Zero和TCP套接字)进行类似Map、Reduce和join等复杂操作,将流计算分解成一系列短小的批处理作业。

10.3 Spark sql:Shark是spark的前身,Spark Sql的一个重要特点就是其能够统一处理关系表和RDD,使得开发人员可以轻松的使用SQL命令进行外部查询,同时进行更复杂的数据分析。

10.4 BlinkDB:是一个用于在海量数据上运行交互式SQL查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应事件,其数据的精度被控制在允许的误差范围内。

10.5 MLBase:是spark生态圈的一部分专注于机器学习,让机器学习的门槛耕地,让一些可能并不了解机器学习的用户能方便的使用MLBase,MLBase分为四个部分,MLlib,MLI,ML Optimizer和MLRuntime。

10.6 GraphX:是spark中用于图和图并行计算。

11. spark中worker的主要工作是什么

主要功能:管理当前节点内存,CPU的使用情况,接收master发送过来的资源指令,通过executorRunner启动程序分配任务,worker,这样就类似于包工头,管理分配新进程,做计算的服务,相当于process服务,需要注意的是:

11.1 worker会不会汇报当前信息给master?worker心跳给master主要有workid,不会以心跳的方式发送资源信息给master,这样master就知道worker是否存活,只有故障的时候才会发送资源信息。

11.2 worker不会运行代码,具体运行的是executor,可以运行具体的application的业务逻辑代码,操作代码的节点,不会去运行代码。

12. spark有哪些组件

12.1 master:管理集群和节点,不参与计算

12.2 worker:计算节点,进程本身不参与计算,向master汇报

12.3 driver:运行程序的main方法,创建spark context对象

12.4 spark context:控制整个application的生命周期,包括DAGSheduler和TASKSheduler等组件

12.5 client:用户提交程序的入口

13. spark工作机制

13.1 用户在client提交作业后,会由driver运行main方法创建spark context上下文,执行RDD算子,形成DAG图输入DAGSheduler,按照RDD之间的依赖关系划分stage输入TASKSheduler,task sheduler会将stage划分为task set分发到各个节点的executor中执行。

14. spark优化

spark优化比较复杂,可以分为三个方面进行

14.1 平台层的调优:防止不必要的jar包分发,提高数据本地性,荀泽高效的存储格式如parqute

14.2 应用程序层优化:过滤操作符的优化降低过多的小任务,降低单条记录的开销,处理数据倾斜,复用RDD进行缓存,作业并行计算执行等。

14.3 JVM层调优:设置合理的资源量,设置合理的JVM,启用高效的优化方法,如kyro,增大off head内存等。

你可能感兴趣的:(spark基础知识(整理-持续更新))