Preface:
- Spark <1.6: 节点之间通信使用Akka;Akka底层实现是Actor
- Spark 2.0 +: 节点之间基于netty通信
- 经典transformation和action RDD算子链式计算wordcount:
sc.textFile("xx").flatMap(_.split("\t")).map((_,1)).reduceByKey(_+_).foreach(println)
误区:Spark是基于内存计算的。
实际上:Spark可以基于内存计算。
实际上Spark计算和MR的模型类似,也有shuffle等过程;可以基于内存计算指的是,中间结果会自动存到内存中,而不是像MR那样全部落磁盘,所以就快。
Berkeley AMP(Data Analytics Stack):
Spark vs MR:
- Spark可以基于内存处理数据,MR基于磁盘迭代处理数据
- Spark中DAG执行引擎优化执行顺序
- Spark支持Batch Processing, Stream Processing和SQL; 而MR只支持batch
- ...
- ...
4种运行模式:local, standalone, yarn, mesos
最上面经典wordcount的详细扩展:
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* @author lei
* @date 03/07/2021 5:56 PM
*/
object SparkWC {
def main(args: Array[String]): Unit = {
/* SparkConf: Spark配置对象,可以配置spark运行模式、application名称、资源情况
* * */
val conf = new SparkConf()
conf.setMaster("local")
conf.setAppName("test")
/* SparkContext: 上下文,写spark代码必须创建上下文
* */
val sc = new SparkContext(conf)
val lines: RDD[String] = sc.textFile("./data/words")
val words: RDD[String] = lines.flatMap(line => {line.split(" ")})
val pairWords: RDD[(String, Int)] = words.map(word => {Tuple2(word, 1)})
val reduceRes: RDD[(String, Int)] = pairWords.reduceByKey((v1, v2) => {v1 + v2})
val sortRes: RDD[(String, Int)] = reduceRes.sortBy(tp => {tp._2})
sortRes.foreach(println)
}
}