1、RDD是什么?有什么特性?有哪些优势?


RDD:全称为弹性分布式数据集(Resilient Distributed Datasets),是一个只读的、容错的、并行的数据结构。



2、Driver、ClusterManager、Worker、Executor。


Driver:负责提交Job任务。


ClusterManager:Spark的资源管理器。可以是Standalone、yarn……



3、Spark的宽依赖(Wide dependency)和窄依赖(Narrow Dependency)


RDD可以相互依赖。如果RDD的每个分区最多只能被一个Child RDD的一个分区使用,则称之为narrow dependency;若多个Child RDD分区都可以依赖,则称之为wide dependency。不同的操作依据其特性,可能会产生不同的依赖。例如map操作会产生narrow dependency,而join操作则产生wide dependency。Narrow dependency支持在同一个节点上以管道形式执行多条命令。而Wide dependency则需要所有依赖的分区都是可用的,中间可能会有shuffle过程。 一个任务遇到宽依赖(Wide dependency)则划分为不同的State。



4、Spark运行是线程级别的,Hadoop运行是进程级别的。



5、Spark中task的类别:ShuffleTask和ResultTask。shuffleTask会将结果保存在executor所在节点上。



6、为什么Spark适合于迭代式计算?


Spark是基于RDD的,本身RDD又是基于内存的。RDD只能由外部读取或者从另外的RDD转化而生成。如果是迭代式的计算,对于hadoop的Mapreduce来说,必须把中间结果写到hdfs,然后再由下一步计算读取,中间涉及到读写磁盘的操作,所以耗时较长。Spark的一个计算过程产生的是RDD,下一步计算如果需要上一步的数据,只需要直接读取内存中的RDD即可,时间较短。



7、传统容错和RDD容错机制。


传统的两种容错方式:记录数据更新记录和网络和硬盘容错。


RDD容错机制:因为RDD是基于依赖关系,当父依赖出现问题的时候,可以通过重新计算父依赖来解决出错的问题。



8、Spark的RDD是分布式内存的抽象,且能够基于位置感知性调度、自动容错、负载均衡和高度的可扩展性,Spark中允许用户在执行多个查询时显式的将工作集缓存起来以供后续查询重用,这极大的提高了查询的速度。



9、RDD是分区的,每个分区会被一个计算任务处理,并决定并行计算的粒度;RDD的Transformation操作会产生新的RDD,产生RDD时可以指定分区数,如果不指定分区数,则默认为程序所分配到的CPU核数,如果是从hdfs中产生的RDD,则分区数默认为文件的Block数。



10、Transformation和Action操作。


(一)Transformation


map(func) 返回一个新的分布式数据集,由每个原元素经过函数处理后的新元素组成


filter(func) 返回一个新的数据集,经过fun函数处理后返回值为true的原元素组成


flatMap(func) 类似于map,但每个输入元素会被映射为0个或多个输出元素


mapPartitions(func) 类似于map,对RDD的每个分区起作用


intersection(otherDataset) 求两个RDD的交集


distinct([numTasks]) 返回一个包含源数据集中所有不重复元素的新数据集


groupByKey([numTasks]) 在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[v])对组成的数据集。


reduceByKey(func,[numTasks]) 在一个(K,V)对组成的数据集上调用,返回一个(K,V)对的数据集


sortByKey([ascending],[numTasks]) 在类型为(K,V)的数据集上调用,返回以K为键进行排序的(K,V)对数据集。



(二)Action操作


reduce(func) 通过函数func聚集结果集中的所有元素


collect() 在Driver的程序中,以数组的形式返回数据集中的所有数据。


count() 返回元素的个数


foreach(func) 在数据集的每一个元素上,运行函数func,通常用于更新一个累加器变量,或者和外部存储系统进行交互。