第7章Spark
7.1 sparksql 和 sparkstreaming哪个比较熟
答:都还行,SparkSql 的 DataFrame 或者 DataSet 和 SparkStreaming 的 DStream 都是基于SparkCore 的,最终都会转化为 Sparktask 执行。我们可以交流一下本质的东西 SparkCore,而SparkCore 的核心又是 RDD。
7.2 说一下 sparkshuffle
答:Spark 的 shuffle 也是一处理问题的思想:分而治之。shuffle 一般称为洗牌,一般会有Shuffle。Write 阶段 和 ShuffleRead 阶段。
在 Spark 中实现 Shuffle 的方式有两种,一种是 HashShuffle,一种是 SortShuffle。shuffle 的性能是影响 spark 应用程序性能的关键。shuffle 发生在 stage 之间,stage 中用的 pipline 的计算模式。
7.3 Spark Shuffle 的调优点:
1:Shuffle 的选择 2:缓冲区的大小 3:拉去的数据量的大小 4:间隔时间重试次数。
7.4 缓存这块熟悉吗,介绍缓存级别
答:Spark 的缓存机制是 Spark 优化的一个重要点,它将需要重复使用或者共用的 RDD 缓存在内存中,可以提高 Spark 的性能。
Spark 的底层源码中使用 StorageLevel 来表示缓存机制,其中包括:使用内存,使用磁盘,使用序列化,使用堆外内存。在他的半生对象中基于这几种方式提供了一些实现:不使用缓存,Memory_Only,Disk_only,offHeap 分别都有相应的序列化,副本,组合的实现提供选择。持久化的级别 StorageLevel 可以自定义,但是一般不自定义。如何选择 RDD 的缓存级别的本质是在内存的利用率和 CPU 的利用率之间的权衡。一般默认选择的是 Memory_only, 其次是 Memery_only_Ser, 再次是 Memory_only_and_Dis 至于怎么选择你得自己权衡。
7.5 说一下 cache 和 checkpoint 的区别
答:要知道区别,首先要知道实现的原理和使用的场景 catche 的就是将共用的或者重复使用的 RDD 按照持久化的级别进行缓存 checkpoint 的是将业务场景非常长的逻辑计算的中间结果缓存到 HDFS 上,它的实现原理是:
首先找到 stage 最后的 finalRDD,然后按照 RDD 的依赖关系进行回溯,找到使用了 checkPoint 的 RDD 然后标记这个使用了 checkPoint 的 RDD 重新的启动一个线程来将 checkPoint 之前的 RDD 缓存到 HDFS 上面最后将 RDD 的依赖关系从 checkPoint 的位置切断知道了实现的原理和使用场景后我们就很容易的知道了 catch 和 checkpoint 的区别了。
7.6 spark 运行模式 local local[] local[*] 分别是什么
答:该模式被称为 Local[N] 模式,是用单机的多个线程来模拟 Spark 分布式计算,通常用来验证开发出来的应用程序逻辑上有没有问题其中N代表可以使用 N 个线程,每个线程拥有一个 core 。如果不指定 N,则默认是1个线程(该线程有1个 core )。如果是 local[*],则代表 Run Spark locally with as many worker threads as logical cores on your machine: 在本地运行Spark,与您的机器上的逻辑内核一样多的工作线程。
7.7 Spark 怎么设置垃圾回收机制 ?
Spark 中各个角色的JVM参数设置:
http://blog.csdn.net/wuxb2000/article/details/52870198 1)Driver 的 JVM 参数: GC 方式, 如果是 yarn-client 模式,默认读取的是 spark-class 文件中的 JAVAOPTS;如果是 yarn-cluster 模式,则读取的是 spark-default.conf 文件中的 spark.driver.extraJavaOptions 对应的参数值。 (2)Executor 的 JVM 参数: GC 方式,两种模式都是读取的是 spark-default.conf 文件中的spark.executor.extraJavaOptions 对应的 JVM 参数值。
7.8 一台节点上以 root 用户执行一个 spark 程序,以其他非 root 用户也同时在执行一个 spark 程序,这时以 spark 用户登录,这个节点上,使用 Jps 会看到哪些线程?
答:单独的用户只能看自己的进程
7.9 spark 和 mapreduce 的对比
答:MR 一般处理大量数据的时候一般会存在高延迟,浪费时间,对于一些有时间要求的业务就很不适合。但是如果用 spark 处理的话就非常快了,特别是对于实时动态处理的过程。
下面我会针对人事简历方面的问题总结一下我的想法
7.10 Spark 的提交方式?
答案:不管是提交到 yarn 上面还是提交到 standalone 上都分为 Client 的方式提交和 Cluster 的方式提交。
7.11 Spark 都有什么算子?
答案:map,reducebykey,filter,mapPartition,flatmap,cogroup,foreach,first,take, join, sortBy,distinct,等等
7.12 spark on yarn 和 mapreduce 中 yarn 有什么区别?
答:没有什么区别,yarn 就是一种任务调度框架
7.13 spark 运行的 job 在哪里可以看到?
答: 一般是在 WEBUI 上 查看,如果问具体怎么配置的可以推到运维人员身上
7.14 用scala 写一个 wordcount ?
object ScalaWordCount {
def main(args: Array[String]): Unit = {
val lines = List(“hello java hello python”,“hello scala”,“hello scala hello java hello scala”)
// 切块
val words = lines.flatMap(.split(" "))
// 生成pair
val tuples = words.map((,1))
// k,v分组
val grouped = tuples.groupBy(.1)
val sumed = grouped.mapValues(.size)
// 排序
val sorted = sumed.toList.sortBy(._2)
// 降序
val result = sorted.reverse
println(result)
}
}
7.15 对 scala 的了解 有用过 play framework 框架吗
答:是一个纯java框架,可以进行快速开发,开发周期较短,并且能够快速建立一个java web所需要的所有内容。
7.16 scala 中的隐式函数的关键字?
答:implicit
7.17 val x=y=1 结果是什么?
答:会报错
7.18 编译好的 scala 程序,运行的时候还需要 scala 环境吗?
答:不需要
下面是我在网络上找的思维导图,介绍的比较详细,大家可以认真的看一下
7.19 spark 提交任务的流程
在这里我找了一个网图,相信看图来的更加直接一些。
7.20 rdd 怎么转 dataFrame
答:可以通过反射的方式来推断元数据,因为 RDD 本身是没有元数据的,通过反射就可以了解这些元数据并且进一步转换成 dtaframe
7.21 问我 spark、jdk、scala 的版本
JDK:1.8 SPARK:2.2.0 SCALA:2.11.8 HADOOP:2.6.5
7.22 spark 和 storm 的区别?
答:storm是对大量的小型数据块进行处理,并且是动态数据 spark一般是对大量数据进行进行全集处理,并且侧重传输数据的过程
7.23 persist 和 checkpoint 的区别
答:persits一般是将数据持久化到磁盘上但是一旦进程被停掉的话,在磁盘上的数据也会同时被清空 而checkpoint 是将 RDD 持久化到 HDFS 上的,如果不手动删除的话是一直存在的
7.24 怎么理解scala的函数式编程
所谓函数式编程,其实就是以纯函数的方式编写代码。
函