1.Spark & MR相对速度快的原因?
1).Spark可以基于内存处理数据,MR基于磁盘处理数据。
2).Spark中有DAG有向无环图

3).Spark多个任务之间数据通信是基于内存,而Hadoop是基于磁盘。

总结:在处理数据的时候,Spark中的job会使用前一个在内存中存放的rdd,这样的就不会有

2.完成Spark java版本WordCount & Scala版本WordCount 编写,默写Scala版本。

1)首先配置Maven,创建IDEA Maven,配置Pom.xml文件

2)开发代码

scala版本:

sc.textFile(....).flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).foreach(println)

3.Spark的运行模式有哪些?
local:多用于本地测试,如在eclipse,idea中写程序测试等。
standalone:是Spark自带的一个资源调度框架,它支持完全分布式。
yarn:Hadoop生态圈里面的一个资源调度框架,Spark也是可以基于Yarn来计算的。
mesos:资源调度框架。

4.Spark核心RDD
1).什么是RDD?
Resilient Distributed Dateset 弹性分布式数据集
2).RDD的五大特性?
a.RDD由一系列partition组成
b.算子(函数)是作用在Partiton上的
c.RDD之间有依赖关系
d.分区器是作用在K,V格式的RDD上。
e.partition对外提供最佳的计算位置,利于数据处理的本地化。

3).Spark RDD需要注意的问题
a.sc.textFile(…)读取HDFS文件的方法底层调用的是MR读取HDFS文件的方法,首先split,每个split对应一个block,这里每个
split对应一个partition。
b.什么是K,V格式的RDD?
当RDD中的数据是一个个的tuple2时,这个RDD就叫做K,V格式的RDD
C.哪里体现RDD的分布式?
RDD中partition是分布在多个节点上的
d.哪里体现RDD的弹性:
1).RDD之间有依赖关系
2).RDD的分区数可多可少

5.Spark 算子分为哪几类?
a.Transformations 算子 - 转换算子
flatMap,map ,filter,sortBy,sortByKey,redueByKey,sample

b.Action算子 - 行动算子 ,有一个action算子就有一个job
foreach ,take(num),first = take(1) ,collect(),count()

c.持久化算子
cache() :
默认将数据放在内存中,懒执行,需要action算子触发执行。
cache() = persist() = persist(StorageLevel.MEMORY_ONLY)
persist()
可以手动指定持久化级别
常用的级别:
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
注意:避免使用DISK_ONLY 和“_2”级别。

checkpoint()
1).checkpoint 执行流程
优化:对哪个RDD进行checkpoint时,最好先cache下。
2).checkpoint 将数据存储在磁盘,persist(StorageLevel.DISK_ONLY)

6.Spark代码执行的流程?
a.SparkConf
b.SparkContext
c.创建RDD
d.对RDD使用transformation算子转换
e.对RDD使用action算子触发执行
f.sc.stop()

- 1.val conf = new SparkConf()  ; conf.setMaster.. ;conf.setAppName()  
- 2.val sc = new SparkContext(conf)  
- 3.val rdd = sc.textFile...  
- 4.对RDD使用RDD的Transformation类算子进行转换  
- 5.对RDD要使用Action类算子触发Transformation类算子执行  
- 6.sc.stop()

8.Spark 持久化算子

cache

默认将数据持久化到内存中

cache() = persist() = persist(StorageLevel.MEMORY_ONLY)

persist

1.可以手动指定持久化级别

2.常用的持久化级别

1)MEMORY_ONLY

2)MEMORY_ONLY_SER

3)MEMORY_AND_DISK

4)MEMORY_AND_DISK_SER

3.避免使用DISK_ONLY 和 “_2” 级别

checkpoint

1.当job的lineage非常长,计算非常复杂时,可以对RDD进行checkpoint,将RDD的数据持久化到磁盘

2.checkpoint & persist(DISK_ONLY)

1).persist 将数据持久化起来之后,当application执行完成之后,持久化的数据会被清空

2).checkpoint将数据持久化到磁盘,数据由外部的存储系统管理,当application执行完成之后,数据不会被清空

3).checkpoint常用作保存状态,在SparkStreaming有更好体现

3.checkpoint懒执行,持久化单位也是partition

注意

  • cache & persist
  • 1.cache() persist() 都是懒执行,需要action算子触发执行
    2.对RDD进行持久化时,可以直接cache或者persist之后赋值给一个变量,下次直接使用这个变量就是使用的持久化的数据,当然,这里也可以直接对RDD进行cache 或者persist,下次直接使用RDD就可以
    3.如果对RDD进行持久化之后,赋值给了一个变量,那么不要在后面紧跟action算子
  • checkpoint执行流程
  • 1.当job执行完成之后,Spark会从后往前回溯,找到checkpointRDD进行标记
  • 2.回溯完成之后,Spark会启动一个job,对CheckpointRDD进行计算,将计算的结果保存在磁盘上
  • 优化:对哪个RDD进行checkpoint之前最好先cache()下

9.代码:

使用sample抽样找出出现次数最多的单词,过滤掉统计剩余单词的个数,并由大到小排序。

object Demo {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("test")
    val sc = new SparkContext(conf)
    val lines: RDD[String] = sc.textFile("./data/words")
    val words = lines.flatMap(line=>{line.split(" ")})
    val sortBy: RDD[(String, Int)] = words.sample(false,0.7).map(word=>{(word,1)}).reduceByKey(_+_).sortBy(_._2,false)
    val topWords = sortBy.map(tp=>{tp._1}).first()
    println(s"topWords is $topWords ")

    words.filter(word=>{!word.equals(topWords)}).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).foreach(println)

  }
}