spark-1

来源:互联网 发布:淘宝联盟分享给好友后, 编辑:程序博客网 时间:2024/06/09 22:07
简介
spark是一个用来实现快速而通用的集群计算平台,扩展了MR,高效的支持了更多的计算模式,包括交互式查询和流处理,可以进行交互式的数据处理,主要特点是可以在内存中进行计算;适用于各种各样的原先需要各种不同的分布式平台的场景,包括批处理,地带算法,交互式查询,流处理;
提供了java,scala,python,R的接口,spark可以作为一个组件运行在其他的例如yarn的平台上,当然,也可以独立运行在一个集群上;
spark包括了很多组件,spark软件栈为Spark SQL(结构化数据),Spark Streamin(实时计算),MLib(机器学习),GraphX(图计算);然后以Spark Core为基础;
Spark Core实现了Spark的基本功能,包括了任务调度,内存管理,错误恢复,与存储系统交互等模块;Spark Core还包含了对弹性分布式数据集(Resilientdistributed dataset)简称RDD的数据结构的API的定义;RDD表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要的编程抽象;
Spark SQL
Spark SQL是Spark用来操作结构化数据的程序包,通过Spark SQL,可以使用SQL或HQL来查询数据;
Spark Streaming
Spark Streaming 是Spark提供的对实时数据进行流计算的组件,用来操作数据流,并且与Spark Core中的RDD的API高度对应;
MLib
机器学习功能库,提供了很多机械学习算法,包括分类,回归,聚类,协同过滤等,还提供了模型评估,数据导入等额外的支持功能,还提供了一些更底层的机器学习原语,包括一个通用的梯度下降优化算法;
GraphX
GraphX是用来操作图的程序库,(比如社交网络的关系图)可以进行并行的图计算;
Spark 核心简介
每个spark应用都有一个驱动器程序(driver program)来发起集群上的各种并行操作,驱动器本身包括了main函数,并且定义了集群上的分布式数据集;还对这些分布式数据集进行了相关操作;
驱动器程序通过一个SparkContext对象访问spark,这个对象代表了计算集群的一个连接,shell启动时就已经自动创建了一个SparkContext对象,是一个叫做sc的变量;
RDD基础
Spark中的RDD就是一个不可变的分布式对象集合,每个RDD都被分成多个分区,这些分区运行在集群中的不同节点上,RDD可以包括Python,Java,Scala中任意类型对象,并且可以包括用户自定义的对象;
用户可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合;
创建的RDD支持两种类型的操作,转化操作和行动操作;
转化操作会由一个RDD生成一个新的RDD.例如将谓词匹配情况筛选数据就是一个ie常见的转化过程;
first()函数返回RDD的第一个元素,则是行动操作,转化操作和行动操作的区别在于SPark计算RDD的方式不同,虽然你可以在任何时候定义新的RDD,但是Spark只会惰性计算这些RDD.他们只有在第一次在一个行动操作中用到时,才会真正的计算;
创建RDD
提供了两种方式:读取外部数据,以及在驱动器中对一个集合进行并行化;
parallelize(并行化)
RDD操作
转化操作
RDD的转化操作是返回新的RDD操作
通过RDD操作,可以从已有的RDD中派生出新的RDD,但旧的RDD不会消失,spark会使用谱系图(lineage graph)来记录这些不同的RDD之间的依赖关系;spark需要用这些信息来按需计算每个RDD,也可以依靠谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据;
行动操作
对数据集进行实际的计算,并返回值,吧最终球来的结果返回到驱动程序中;例如count结果;
转化可以理解为优化的map,shuffle,行动可以理解为reduce结果;RDD是分布式的数据集和操作函数;可以迭代计算并保存;有版本;
RDD的转化操作都是惰性求值的;
向Spark中传递函数
scala要求传递的函数以及其引用的数据需要是可序列化的(实现了Serializable接口)而且当传递一个对象的方法或者字段时,会包含对整个对象的引用;

基本的转化操作和行动操作
最常用的转化操作map()和filter();分别是对于每个元素,将结果的返回值作为一个新的RDD和将满足函数要求的元素放入新的RDD;
union()返回一个包含两个RDD中所有元素的RDD(并);就是合并distinct()去重;intersection()交,subtract()差,后两种都需要网络shuffle(),所以性能较差;cartesian()迪卡尔积;求大规模的迪卡尔积开销巨大;操作必须是两个RDD;
行动操作
RDD最常用的行动操作就是reduce(),还有fold()与reduce()类似,接受一个与器函数签名一致的函数,再加上一个初始值为每个分区第一次调用时的结果,你所提供的初始值是你提供操作的单位元素,使用你的函数对这个初始值进行多次计算不会改变结果,(例如+对应0,*对应1,拼接对应空);
fold()和reduce()要求返回值和运算值的类型一致;aggregate()返回一个二元组,可以返回与元素不同类型的值;RDD的一些行动操作会以普通集合或者值的形式将RDD的部分或者全部数据返回驱动器程序;
collect()返回所有内容;
take(n)返回n个元素,顺序不确定;
top(n)获取前几个元素;
takeSample(a,n,set)数据采样并替换;
count()计数;
countByValue()个元素在RDD中出现的次数;
foreach(fuc())对每个元素使用这个函数;
reduce(fuc())按照给定的函数整合所有的数据
takeOrdered(n)按照顺序返回n个元素;

键值对操作
键值对RDD是spark中许多操作所需要的常见数据类型;对于这些RDD提供一些专有操作,这些RDD被称为pairRDD;其中提供了许多针对键值对的函数;
其中如果想要创建一个pairRDD,则需要将并行化的序列定义成二元组map,如val a=sc.parallelize(List((2,344),(1,32));
还有其中的函数
reduceByKey(func)以key为参数,value为目标的定义函数的执行;
groupByKey 按key分组,分成key,list(values)模式的二元组;
mapValues(func) value值为参数目标因函数而改变,而不改变key;
keys()返回一个key的RDD;
values()返回一个values的RDD;
sortByKey()按照key排序;