1、RDD表示分布在多个计算节点上的可以并行操作的元素集合,是spark主要的变成抽象。
Spark Streaming 是 Spark 提供的对实时数据进行流式计算的组件
Spark是一个用于集群计算的通用计算框架,因此被应用于各种各样的应用程序
2、从上层来看,每个saprk应用都有一个驱动器程序(driver programmer)来发起集群上的各种并行操作。
驱动器程序通过一个SparkContext对象来访问Spark。这个对象代表对计算集群的一个连接。在shell启动时已经自动创建了一个SparkContext对象。
3、一旦有了SparkContext,你就可以用它来创建RDD。
要执行这些操作,启动器程序一般要管理多个执行器(executor)节点。
4、一旦完成了应用于Spark的链接,接下来就是需要在你的程序中导入Spark包并创建SparkContext。可以先通过SparkConf对象来配置你的应用,然后基于这个SparkConf创建一个SparkContext对象。
5、创建SparkConf的基本方法,传递两个参数:
1、集群URL:告诉Spark如何连接到集群上。
2、应用名:当连接到一个集群式,这个值可以帮助你在集群管理器的用户界面中找到你的应用。
关闭Spark:调用SparkContext的stop()方法。或直接退出应用。(system.exit(0)/sys.exit())
6、在Spark中,对数据的所有操作不外乎是: 创建RDD、 转化已有的RDD、调用RDD操作进行求值
7、Spark中的RDD是
一个不可变的分布式对象集合。每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。
8、Spark 提供了两种创建RDD的方式: 读取外部数据集、 在驱动器程序中对一个集合进行并行化。 (反斜杠)
转化操作返回的是RD, 行动操作返回的是其他数据类型。
9、当我们调用一个新的行动操作时,整个RDD都会从头开始计算。要避免这种行为,用户可以将中间结果持久化。
10、不应该把RDD看做存放着特定数据的数据集,最好把每个RDD当做我们通过转化操作构建出来的、记录如何计算数据的指令列表。
11、Spark的大部分转化操作和一部分行动操作,都需要依赖用户传递的函数来计算。
在Python中,有三种方式把函数传递给Spark:
1、传递比较短的函数时,可以使用lambda表达式来传递。
2、顶层函数
3、局部函数
使用传递函数时,要小心的是:Python会在你不经意间把函数所在的对象也序列化传出去。当你传递的对象是某个对象的成员,或者包含了某个对象中一个字段的引用时,Spark
就会将整个对象发到工作节点上。
12、常见的transformation和action操作
1、针对各个元素的转化操作:
1.1 : map : 接收一个函数,把这个函数用于RDD中的每一个元素,将函数的返回结果作为结果RDD中对应的一个元素=
1.2 : filter : 接收一个函数,并将RDD中满足该函数的元素放入新的RDD中返回。
1.3 : flatMap : 每个输入元素生成多个输出元素。
2、伪集合操作 :
尽管RDD本身不是严格意义上的集合,但他也支持许多数学上的集合操作,比如合并和相交操作。
2.1 distinct : 生成一个只包含不同元素的新RDD。需要注意:distinct() 操作的开销很大,因为它需要将所有数据通过
网络进行混洗(shuffle),以确保每个元素只有一份。
2.2 union :返回一个包含两个RDD中所有元素的RDD。 若输入的RDD中有重复的数据,union操作也会包含这些重复的数据。
2.3 intersection : 只返回两个RDD中都有的元素,intersecton()在运行时会去掉所有重复的元素(单个RDD内重复元素也会一起移除)。 需要通过
网络混洗来发现共有数据。
2.4 subtract : 接受另一个RDD作为参数,返回一个由只存在在第一个RDD而不存在第二个RDD中的所有元素组成的RDD。 需要
数据混洗。
2.5 cartesian : 返回所有可能的(a,b)对,其中a是源RDD中的元素,b是另一个RDD中的元素。
3、行动操作(action)
3.1 reduce :
3.2 fold :
fold 和reduce 都要求函数的返回值类型需要跟我们所操作的RDD中的元素的类型相同。
3.3 aggregate :
需要三个参数(
zeroValue
,
seqOp
,
combOp)
zeroValue :返回类型的初始值, seqOp: combOp:
3.4 collect : 将整个RDD内容返回。collect() 要求所有数据都必须能一同放到单台机器的内存中。
3.5 take : 返回RDD 中的n个元素, 并且尝试只访问尽量少的分区,因此该惭怍会得到一个不均衡的集合。 需要注意的是,这些操作返回元素的顺序与你预期的可能不一样。
3.6 top ; 从 RDD 中获取前几个元素。
3.7 foreach : 对RDD 中的每个元素进行操作,而不需要把RDD发回本地。
4、有些函数只能用于特定类型的RDD,比如mean()、 variance() 只能在数值RDD上,而join()只能在键值对RDD上。
13、持久化(缓存)
persist()