1. Spark中组件简介
Spark SQL 结构化数据:操作结构化数据的程序包,通过SQL或Hive SQL查询数据
Spark Streaming 实时计算:对实时数据进行流式计算,提供了操作数据流的API。与Spark Core中的RDD API高度对应
Spark MLlib 机器学习:提供多种机器学习算法,包括分类、回归、聚类、协同过滤等
Spark GraghX 图计算:扩展了Spark的RDD API,能用来创建一个顶点和边都包含任意属性的有向图,以及一些常用图算法
2. RDD
弹性分布式数据集(Resilient Distributed Dataset, 简称RDD),及分布式的元素集合
3. 创建RDD的方式
读取外部数据集
在驱动器程序中对一个集合进行并行化,及将一个已有集合传给SparkContext的parallelize(List)方法,常使用于开发原型和测试
4. RDD支持两种类型的操作
转换操作(transformation):由一个RDD生产一个新的RDD,如filter(),结果返回值是RDD
行动操作(action):对RDD计算出一个结果 如first(),并把结果返回到驱动器,或把结果存储到外部存储系统(如 HDFS),结果返回值是其它类型
5. RDD转换操作和行动操作的区别
操作的区别在于Spark计算RDD的方式不同,Spark只会惰性计算RDD,它们只有第一次在一个行动操作中用到时,才会真正计算,在调用行动操作之前Spark不会开始计算
6. 缓存RDD
Spark的RDD会在每次对它们使用行动操作时进行重新计算,可使用RDD.persist()或RDD.cache()让Spark把这个RDD缓存下来
7. RDD的“弹性”
在任何时候都能进行重算是为什么把RDD描述为“弹性”的原因。当保存RDD数据的一台机器失败时,Spark还可以使用这种特性来重算出丢掉的分区,这一过程对用户完全透明
8. Spark程序编写步骤
从外部数据创建出输入RDD
使用诸如filter()这样的转化操作对RDD进行转化,以定义新的RDD
告诉Spark对需要被重用的中间结果RDD执行persist()缓存操作
使用行动操作(例如count()、first()等)来触发一次并行计算,Spark会对计算进行优化后再执行
9. Spark用谱系图来记录不同RDD之间的依赖关系,也可以依照谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据
10. 常用转换操作
map() 将函数应用于RDD中的每个元素,将返回值构成新的RDD
flatMap() 将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD。通常用来切分单词
filter() 返回一个由通过传给filter()的函数的元素组成的RDD。筛选、过滤
distinct() 去重
sample(withReplacement, fraction[seed]) 对RDD采样, 以及是否替换
union() 生成一个包含两个RDD中所有元素的RDD, 示例:rdd.union(otherRDD)
intersection() 求两个RDD共同的元素的RDD 示例: rdd.intersection(otherRDD)
subtract() 移除一个RDD中的内容(例如移除训练数据)示例: rdd.subtract(otherRDD)
cartesian() 与另一个RDD的笛卡尔积 示例: rdd.cartesian(otherRDD)
11. 常用行动操作
collect() 返回RDD中的所有元素 示例:rdd.collect()
count() RDD中的元素个数 示例:rdd.count()
countByValue() 各元素在RDD中出现的次数 示例:rdd.countByValue()
take(num) 从RDD中返回num个元素 示例:rdd.take(2)
top(num) 从RDD中返回最前面的num个元素 示例:rdd.top(2)
takeOrdered(num)(ordering) 从RDD中按照提供的顺序返回最前面的num个元素 示例:rdd.takeOrdered(2)(myOrdering)
takeSample(withReplacement, num, [seed]) 从RDD中返回任意一些元素 示例:rdd.takeSample(false, 1)
reduce(func) 并行整合RDD中的所有数据 示例:rdd.reduce((x, y) => x + y)
fold(zero)(func) 和reduce()一样,但是需要初始值 rdd.fold(0)((x, y) => x + y)
aggregate(zeroValue)(seq0p, comb0p) 和reduce()相似,但是通常返回不同类型的函数 rdd.aggregate((0, 0 ))(
(x, y) => (x._1 + y, x._2 + 1),
(x, y)(x._1 + y._1, x._2 + y._2)
)
foreach(func) 对RDD中的每个元素使用给定的函数 rdd.foreach(func)
12. Pair RDD的转化操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
reduceByKey(func) 合并具有相同键的值 rdd.reduceByKey((x, y) => x + y) 结果:{(1, 2), (3, 10)}
groupByKey() 对据用相同键的值进行分组 rdd.groupByKey() 结果:{(1, [2]), (3, [4, 6])}
combineByKey(createCombiner, mergeValue, mergeCombiners, partitioner) 使用不同的返回类型合并具有相同键的值
mapValues(func) 对pair RDD中的每个值应用一个函数而不改变键 rdd.mapValues(x => x + 1) 结果:{(1, 3), (3, 5), (3, 7)}
flatMapValues(func) 对pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录。通常用于符号化 rdd.flatMapValues(x => (x to 5))
结果:{(1, 2), (1, 3), (1, 4), (1, 5), (3, 4), (3, 5)}
keys() 返回一个仅包含键的RDD rdd.keys() 结果: {1, 3, 3}
values() 返回一个仅包含值的RDD rdd.values() 结果: {2, 4, 6}
sortByKey() 返回一个根据键排序的RDD rdd.sortByKey() 结果:{(1, 2), (3, 4), (3, 6)}
13. Pair RDD的行动操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
countByKey() 对每个键对应的元素分别计数,及相同键的个数 rdd.countByKey() 结果:{(1, 1), (3, 2)}
collectAsMap() 将结果以映射表的形式返回,以便查询 rdd.collectAsMap() 结果:Map{(1, 2), (3, 4), (3, 6)}
lookup(key) 返回给定键对应的所有值 rdd.lookup(3) 结果:[4, 6]