一、Spark介绍
1.1 Spark简介
Spark是什么:
Spark是一个快速且通用的集群计算平台。
Spark的特点:
1.Spark是快速的
Spark扩充了流行的MapReduce计算模型
Spark是基于内存的计算
2.Spark是通用的
Spark的设计容纳了其他分布式系统拥有的功能,批处理,迭代式计算,交互查询和流处理等。
优点:降低了维护成本
3.Spark是高度开放的
Spark提供了Python, Java, Scala, SQL的API和丰富的内置库。
Spark和其他的大数据工具整合的很好,包括Hadoop, Kafka等
1.2 Spark生态介绍
Spark历史
- 诞生于2009年,加州大学伯克利分校RAD实验室的一个研究项目,最初是基于Hadoop MapReduce
- 发现MapReduce在迭代式计算和交互式上抵消,引入内存存储
- 2010年3月份Spark开源
- 2011年AMP实验室在Spark上开发高级组件,像Spark Streaming
- 2013年转移到了Apache下,不久便成为顶级项目了。
Spark组件:
Spark包含多个紧密集成的组件
1) Spark Core:
包含Spark的基本功能,包含任务调度,内存管理,容错机制等。
内部定义了RDDs(弹性分布式数据集)
提供了很多API来创建和操作这些RDDs。
应用场景,为其他组件提供底层的服务。
2) Spark SQL:
是Spark处理结构化数据的库,就像Hive SQL,MySQL一样。
应用场景,企业中用来做报表统计。
3) Spark Streaming:
是实施数据流处理的组件,类似Storm。
Spark Streaming提供了API来操作实施流数据。
应用场景,企业中用来从Kafka接受数据做实时统计。
4) Mlib:
一个包含通用机器学习功能的包,Machine learning lib.
包含分类,聚类,回归等,还包括模型评估,和数据导入。
Milb提供的上面这些方法,都支持集群上的横向扩展。
应用场景,机器学习。
5) Graphx:
是处理图的库(例如,社交网络图),并进行图的并行计算。
像Spark Streaming, Spark SQL一样, 它也集成了RDD API。
它提供了各种图的操作,和常用的图算法,例如PangeRank算法。
应用场景,图计算
6) Cluster Managers:
就是集群管理,Spark自带一个集群管理是单独调度器。
常见集群管理包括Hadoop YARN, Apache Mesos。
紧密集成的优点:
- Spark底层优化了,基于Spark底层的组件,也得到了相应的优化。
- 紧密集成,节省了各个组件组合使用时的部署,测试等时间。
- 向Spark增加新的组件时,其他组件,可立刻享用新组件的功能。
1.3 Spark与Hadoop的比较
Hadoop应用场景
- 离线处理
- 对时效性要求不高
Spark应用场景
- 时效性要求高的场景
- 机器学习等领域
比较
Doug Cutting(Hadoop之父)的观点:
- 这是生态系统,每个组件都有其作用,各善其职即可。
- Spark不具有HDFS的存储能力,要借助HDFS等持久化数据。
- 大数据将会孕育出更多的新技术。
二、Spark的下载和安装
Spark目录
bin:包含用来和Spark交互的可执行文件,如Spark shell。
core:streaming, python, …包含主要组件的源代码。
examples:包含一些单机的Spark jobs,可以单机运行的例子。
Spark的Shell
Spark的shell使你能够处理分布在集群上的数据。
Spark把数据加载到节点的内存中,因此分布式处理可在秒级完成。
快速使迭代式计算,实时查询,分析一般能够在shell中完成。
三、RDDs
3.1 RDDs介绍
Driver program:
包含程序的main()方法,RDDs的定义和操作。
它管理很多节点,我们称作executors。
SparkContext:
Driver programs通过SparkContext对象访问Spark。
SparkContext对象代表和一个集群的连接。
在Shell中SparkContext自动创建好了,就是sc。
RDDs:
Resilient distributed datasets(弹性分布式数据集,简称RDDs)
这些RDDs,并行的分布在整个集群中。
RDDs是Spark分发数据和计算的基础抽象类。
一个RDD是一个不可改变的分布式集合对象。
Spark中,所有的计算都是通过RDDs的创建,转换,操作完成的。
一个RDD内部有很多partition(分片)组成的。
分片partition:
每个分片包括一部分数据,partitions可在集群不同节点上计算。
分片是Spark并行处理的单元,Spark顺序的,并行的处理分片。
RDDs的创建方法:
1) 把一个存在的集合传给SparkContext的parallelize()方法,测试用:
val rdd = sc.parallelize(Array(1, 2, 2, 4), 4)
第1个参数:待并行化处理的集合
第2个参数:分区个数
2) 加载外部数据集
val rddText = sc.textFile("helloSpark.txt")
Scala的基础知识
Scala的变量声明: 创建变量是val/var
val:变量值是不可修改的,类似java final。
var:变量值定义完是可以修改的。
Scala的匿名函数和类型推断
lines.filter(line => line.contains("world"))
,定义一个匿名函数,接受line.
使用line这个Strig类型的变量上的contains方法,并且返回结果
line不需要制定类型,会自动推断
3.2 RDD基本操作 Transformation
Transformations介绍:
转换:从之前的RDD构建一个新的RDD,像map() 和 filter()。
逐元素Transformation:
map(): map()接收函数,把函数应用到RDD的每一个元素,返回新的RDD。
filter(): filter()接受函数,返回只包含满足filter()函数的元素的新RDD。
flatMap(): flatMap()对每个输入元素,输出多个输出元素。flat压扁的意思,将RDD中的元素压扁后返回一个新的RDD。
集合运算:
RDDs支持数学集合的计算,例如并集union,交集intersection,差集subtract计算。
3.3 RDD基本操作 Action
Action介绍:
在RDD上计算出来一个结果。
把结果返回给driver program或保存在文件系统,count(), save()
reduce():
接收一个函数,作用在RDD两个类型相同的元素上,返回新元素;
可以实现,RDD中元素的累加,计数,和其它类型的聚集操作;
collect():
遍历整个RDD,向driver program返回RDD的内容
需要单机内存能够容纳下(因为数据要拷贝给driver,测试使用)
大数据的时候,使用saveAsTextFile() action等。
take(n):
返回RDD的n个元素(同时尝试访问最少的partitions)。
返回结果是无序的,测试使用。
top():
排序(根据RDD中数据的比较器)
3.4 RDDs的特性
RDDs的血统关系图:
Spark维护着RDDs之间的依赖关系和创建关系,叫做血统关系图
Spark使用血统关系图来计算每个RDD的需求和恢复丢失的数据
延迟计算(Lazy Evaluation):
Spark对RDDs的计算是,他们第一次使用action操作的时候。
这种方式在处理大数据的时候特别有用,可以减少数据的传输。
Spark内部记录metadata表明transformations操作已经被响应了。
加载数据也是延迟计算,数据只有在必要的时候,才会被加载进去。
RDD.persist(): 持久化
默认每次在RDDs上面进行action操作时,Spark都重新计算RDDs,如果想重复利用一个RDD,可以使用RDD.persist()。
unpersist()方法从缓存中移除。
3.5 KeyValue对RDDs
创建KeyValue对RDDs
使用map()函数,返回key/value对
例如,包含数行数据的RDD,把每行数据的第一个单词作为keys
KeyValue对RDDs的Transformations{(1,2),(3,4),(3,6)}
combineByKey(createCombiner, mergeValue, mergeCombiners, partitioner)
最常用的基于key的聚合函数,返回的类型可以与输入类型不一样,许多基于key的聚合函数都用到了它,像groupByKey()
原理,遍历partition中的元素,元素的key,要么之前见过的,要么不是。如果是新元素,使用我们提供的createCombiner()函数,如果是这个partition中已经存在的key,就会使用mergeValue()函数,合计每个partition的结果的时候,使用mergeCombiners()函数