Spark是一个快速且通用的集群计算平台,Spark计算速度快,主要应用于时效性要求比较高的场景
Spark特点
主要基于内存 Spark在计算的过程中会优先将数据放在内存中,如果内存容量不足的话,Spark也会将数据放在磁盘上或者部分数据放在磁盘上进行计算
迭代式计算 Spark在处理完一个阶段之后,处理的结果可以继续在其他节点上进行下一个阶段的计算,还可以有很多的阶段,不仅仅只有map和reduce两个阶段,由于这种迭代式的特点,导致Spark更加灵活,也更加强大
Spark常见组件
Spark Core 包含Spark的基本功能,如任务调度,内存管理,容错机制等,内部定义了RDD的API
Spark Streaming 一个实时流处理组件,应用场景一般是从Kafka接收数据做实时统计
MLib(Machine learning lib) 包含通用机器学习功能的包,支持集群上的横向扩展
Graphx 一个图处理的库,进行图的并行计算
常见的集群管理器
Cluster Manager,Hadoop Yarn
Driver Program
包含程序的main方法,RDDs的定义和操作,它管理很多节点(executors)
SparkContext
DriverPrograms通过SparkContext对象访问Spark SparkContext代表和一个集群的连接 在Spark shell中已经自动创建好了SparkContext对象(sc)
RDD(Resilient Distributed Dataset)
RDD指的是多个RDD键值对,用户可以通过Spark对RDD做特殊处理,RDD允许用户并行地获取每个键值对的Key
RDD有两种类型的操作: Transformation操作和Action操作,它们之间的区别在于Spark计算RDD的方式不同。Transformation操作会由一个RDD生成另一个新的RDD,生成的新的RDD是惰性求值的,只有在Action操作时才会被计算;Action操作会对RDD计算出一个结果,并把结果返回到驱动器程序中,或者是把结果存储到外部存储系统中。
创建RDD有两种方法: 并行化驱动程序中的现有集合(调用SparkContext的parallelize()方法),或引用外部存储系统中的数据集(调用SparkContext的testFile()等方法) 所谓创建RDD的不同方式无非就是应用程序的数据来源不同而已
Spark中的所有计算都是通过RDDs的创建,转换,操作完成的,一个RDD内部有许多partition(分片)组成,每一个分片包含数据的一部分,partition可在不同的节点上进行并行计算
分布式: 所谓分布式就是有很多台机器在运行,每个机器运行任务中的一部分,提高了任务运行的效率
弹性: 1.自动的进行内存和磁盘数据存储的切换 2.基于lineage的高效容错 3.task失败会自动进行特定次数(默认4次)的重试 4.stage(计算阶段)如果失败会自动进行特定次数的重试而且重试时只会试算失败(默认3次)的分片。 5.checkpoint和persist,是效率和容错的延伸。 6.数据调度弹性:DAGTASK和资源管理无关 7.数据分片的高度弹性
Transformation(转换算子)
转换算子是按需执行的一些函数,用它来产生新的RDD 常见的Transformation算子 map(func) 对每个数据集元素执行func函数并返回一个处理后的数据集 filter(func) 筛选使func函数返回为true的元素 flatMap(func) 和map类似,只不过当返回RDD的元素是可迭代类型(如Array,List等)的话,会将这些元素展开 mapPartitions(func) 在每个分区上分别操作RDD sample(withReplacement, fraction, seed) 首先对fraction进行验证;再次建立PartitionwiseSampledRDD,依据withReplacement的值分别建立柏松采样器或伯努利采样器。 union(otherDataset) 把RDD数据集和otherDataset组合成一个新的数据集(求并集) intersection(otherDataset) 返回一个RDD数据集和otherDataset数据集的交集 distinct([numPartitions]) 对RDD中的元素进行去重,numPartitions是一个可选的参数,用来指定分区数(下同) groupByKey([numPartitions]) 把所有K相同的聚在一起,返回(K, Iterable
)形式的K-V对 reduceByKey(func, [numPartitions]) 对所有K-V对中的V执行func操作,并把K相同的聚在一起,返回(K, Iterable
)形式的K-V对 aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions]) aggregateByKey函数对PairRDD中相同Key的值进行聚合操作,在聚合过程中同样使用了一个中立的初始值zeroValue sortByKey([ascending], [numPartitions]) 根据K对K-V对进行排序,ascending默认为true,即升序排列 join(otherDataset, [numPartitions]) 将所有K相同的聚集在一起,形成(K,(V1,V2,V3,...))这样的K-V对 cogroup(otherDataset, [numPartitions]) / groupWith(otherDataset, [numPartitions]) 将所有K相同的聚集在一起,形成(K, (Iterable
, Iterable
,...))这样的K-V对 cartesian(otherDataset) 求两个数据集的笛卡尔积 pipe(command, [envVars]) commande是脚本命令,RDD的每个元素被传输到Linux的标准输入中,可以通过脚本对这些RDD中的元素进行处理,Linux的标准输出将作为RDD的元素返回 coalesce(numPartitions) 把分区数减少到指定的分区数,一般在用数据集被过滤之后使用 repartition(numPartitions)
Action(执行算子)
运行在转换算子之后,在RDD上计算出一个结果并把结果返回给Driver Program或保存到文件系统
常见的Action算子 reduce(func) 传入的参数是一个函数,一个双参数,返回值唯一的函数,建议,该函数是可交换的,是可联合的,如此,才能实现正确的 并行计算 collect() 将数据集的所有元素,按照数组的形式予以返回,该算子通常用于对于数据集过滤或者进行其他操作后返回的足够小的集 合;我是通常用在Scala命令行交互中,能够得到结果输出 count() 返回数据集中元素的总数 first() 返回数据集中的第一个元素,和take(1)是一样的效果 take(n) 返回前n个元素 taksSample(withReplacement, num, [seed]) 从RDD中随机取出num个元素,withReplacement表示是否放回抽样样本,seed用来指定生成随机数的种子(是可选的) takeOrdered(n, [ordering]) 从RDD中根据排序器返回前n个元素,若没有指定排序器,则排序默认为升序 saveAsTextFile(path) 把数据集中每个元素转换成一行写入指定路径 saveAsSequenceFile(path) 把数据集中每个元素作为SequenceFile写入指定路径,数据集中的每个key-value对需要实现Writable接口 countByKey() 以hashmap的形式返回每个key出现的次数,要求RDD必须是(K,V)的元素 foreach(func) 对数据集中的每个元素执行函数func
RDD的特性
RDDs的血统关系图(Lineage Graph) Spark用血统关系图来维护RDD之间的依赖关系和创建关系,使用血统关系图来计算每个RDD的需求和丢失的数据 延迟计算 Spark对RDD的计算发生在第一次使用Action算子的时候(这样可以减少数据的传输) 加载数据也是延迟计算,数据只有在必要的时候才会被加载进去
如何减少Spark工作过程中的数据传输?
1、使用广播变量(Broadcast Variable),提高RDD之间的连接效率 2、使用累加器(Accumulator),有助于并行更新变量值 3、避免使用触发Shuffle的操作
Spark与MapReduce对比
大数据小世界,在我的小世界等你们噢
留言与评论(共有 0 条评论) |