Spark简介
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。目前已经形成一个高速发展应用广泛
的生态系统。
Apache Spark特性:
1,快速
大多数操作均在内存中迭代,只有少部分函数需要落地到磁盘。
2,易用性
支持scala、Java、Python、R等语言;提供超过80个算子,API使用及其方便。
3,通用性
Spark提供了针对数据处理的一站式解决方案,计算时用Spark Core算子(替代Hadoop Map/Reduce)
,批处理时用Spark SQL(替代HiveSQL),实时计算用Spark Streaming(替代Stom),机器学习用
Spark MLlib(替代Mahout);另外,通过Spark GraphX进行图计算。
4,跨平台
Spark可以使用Local模式,Standalone模式,Cluster模式运行。
Local模式:在本地运行调试,支持断点,可以指定并行线程数。
Standalone模式:Spark管理资源,有Master和Worker,相当于ResourceManager和NodeManager。
Cluster模式:分布式模式,用于生产环境。资源管理器使用Yarn或者Mesos。
Spark的适用场景
目前大数据处理场景有以下几个类型:
复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间
基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间
Spark成功案例
目前大数据在互联网公司主要应用在金融、广告、报表、推荐系统等业务上。在广告业务方面需要大数据做应用分析、效果分析、定向优化等,在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。这些应用场景的普遍特点是计算量大、效率要求高。 腾讯 / 小米 / 淘宝 / 优酷土豆
Hadoop Map/Reduce与Spark
Spark的发展历史
Spark的版本发展
Scala与函数式编程
Scala介绍
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala 运行在Java虚拟机上,并兼容现有的Java程序。
特性
1,面向对象
Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质(trait)描述。
2,函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函 数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。
3,静态类型
Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。
4,并发性
Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
函数式编程
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
特性
1,函数是第一等公民
函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象。
2,惰性计算
在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。
3,支用表达式不用语句
"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
sc.thriftParquetFile(fileStr, classOf[SomeClass], force = true).filter(infor => infor.classId == CLASSID_REPAY).persist(StorageLevel.DISK_ONLY)
4,没有"副作用"
所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
Spark RDD特性
RDD(Resilient Distributed Datasets),弹性分布式数据集,它是对分布式数据集的一种内存抽象,通过受限的共享内存方式来提供容错性,同时这种内存模型使得计算比传统的数据流模型要高效。RDD具有5个重要的特性,如下图所示:
1.一组分区,数据集的基本组成单位。
2.计算每一个数据分区的函数。
3.对parent RDD的依赖,这个依赖描述了RDD之间的lineage(血统)。
4.可选,对于键值对RDD,有一个Partitioner(通常是HashPartitioner,RangePartitioner)。
5.可选,一组Preferred location信息(例如,HDFS文件的Block所在location信息)。
Spark算子
Spark对数据的处理过程包括输入、运行转换、输出等过程,而这些过程在Spark中以算子的形式定义。 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作。
从大方向来说,Spark算子大致可以分为以下两类:
1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理。
Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,
需要等到有 Action 操作的时候才会真正触发运算。
按照处理数据的结构类型,Transformation算子又可以分为以下两类:
a)Value数据类型的Transformation算子,这种变换并不触发提交作业,针对处理的数据项是Value型数据
b)Key-Value数据类型的Transformation算子,这种变换并不触发提交作业,针对处理的数据项是
Key-Value型的数据对。
2)Action行动算子:这类算子会触发SparkContext提交Job作业。
Action 算子会触发 Spark 提交作业(Job),并将数据输出 Spark系统。
1)Value型数据类型的Transformation算子
A)输入分区与输出分区一对一型
a) map算子
b) flatMap算子
c) mapPartitions算子
d) glom算子
B)输入分区与输出分区多对一型
a) union算子
b) cartesian算子
C)输入分区与输出分区多对多型
a) groupBy算子
D)输出分区为输入分区子集型
a) filter算子
b) distinct算子
c) subtract算子
d) sample算子
e) takeSample算子
E)Cache型
a) cache算子
d) persist算子
2)Key-Value型数据类型的Transformation算子
A)输入分区与输出分区一对一型
a) mapValues算子
B)对单个RDD聚集
a) combineByKey算子
b) reduceByKey算子
c) partitionBy算子
C)对两个RDD聚集
a) Cogroup算子
D)连接
a) join算子
b) leftOutJoin算子
c) rightOutJoin算子
3)Action算子
A)无输出
a) foreach算子
B)HDFS
a) saveAsTextFile算子
b) saveAsObjectFile算子
C)集合和数据类型
a) collect算子
b) collectAsMap算子
c) reduceByKeyLocally算子
d) lookup算子
e) count算子
f) top算子
g) reduce算子
h) fold算子
i) aggregate算子
4)数据加载的Transformation算子
A)文件读取
a) textFile算子
B)内存生成
a) makeRDD算子
b) parallelize算子
Spark算子-Value型
1)map: 对RDD中的每个元素都执行一个指定的函数类(映射)产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。当然map也可以把Key元素变成Key-Value对。
2)flatMap:将原来 RDD 中的每个元素通过函数 f 转换为新的元素,并将生成的 RDD 的每个集合中的元素合并为一个集合。
3) mapPartiions:map是对rdd中的每一个元素进行操作,而mapPartitions (foreachPartition)则是对rdd中的每个分区的迭代器进行操作mapPartitions效率比map高的多。mapPartitions函数获取到每个分区的迭代器,在函数中通过这个分区整体的迭代器对整个分区的元素进行操 作。
4) glom:将分区元素转换成数组。
5) union:相同数据类型RDD进行合并,并不去重。
6)cartesian:对RDD内的所有元素进行笛卡尔积操作
7) groupBy:将元素通过函数生成相应的 Key,数据就转化为 Key-Value 格式,之后将 Key 相同的元素分为一组。
8)filter:对RDD元素进行过滤操作
9)distinct:对RDD中的元素去重操作
10)subtract:RDD间进行减操作,去除相同数据元素(去掉含有重复的项)
11)sample:对RDD元素进行采样操作,获取所有元素的子集(按照比例随机抽样)
12)takesample:上面的sample函数是一个原理,不同的是不使用相对比例采样,而是按设定的采样个数进行采样
Spark算子-Key-Value型
1)mapValues:(对Value值进行变换)原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。因此,该函数只适用于元素为KV对的RDD。即针对(Key, Value)型数据中的 Value 进行 Map 操作,而不对 Key 进行处理。
2)combineByKey:(按key聚合)相当于将元素为 (Int, Int) 的 RDD转变为了 (Int,Seq[Int]) 类型元素的 RDD。
3)reduceByKey:reduceByKey 是比 combineByKey 更简单的一种情况,只是两个值合并成一个值,即相同的key合并value。
4)partitionBy:按key值对RDD进行重新分区操作。
5)cogroup:按key值聚集操作。
6)join:按key值联结。
Spark算子-Action算子
1)foreach:循环遍历每一个元素。
2)saveAsTextFile:将最终的结果数据以文本格式保存到指定的HDFS目录中
3)saveAsObjectFile:将最终的结果数据以二进制文件格式保存到指定的HDFS目录中
4)collect:收集元素
5)collectAsMap: 收集key/value型的RDD中的元素
6)reduceByKeyLocally:实现的是先reduce再collectAsMap的功能,先对RDD的整体进行reduce操作,然后再收集所有结果返回为一个HashMap
7)lookup:查找元素,对(Key,Value)型的RDD操作,搜索指定Key对应的元素
8)count:计算元素个数
9)top:top(n)寻找值最大的前n个元素
10)reduce:通过函数func先聚集各分区的数据集,再聚集分区之间的数据,func接收两个参数,返回一个新值,新值再做为参数继续传递给函数func,直到最后一个元素
11)fold:合并
12)aggregateByKey:采用归并的方式进行数据聚合操作,这种聚集是并行化的,通过key进行聚合。
推荐的书籍
Spark基础概念预习资料
Spark 核心概念RDD:DD:http://sharkdtu.com/posts/spark-rdd.html
Spark RDD详解:详解:https://blog.csdn.net/wangxiaotongfan/article/details/51395769
Scala教程:教程:http://www.runoob.com/scala/scala-tutorial.html