面试题1:Spark中谈谈你对RDD的理解?

(1)RDD:Resilient Distributed Datasets(弹性分布式数据集),首先说说RDD的作用,它的出现大大降低了开发分布式应用程序的门槛,比如在其他框架开发分布式应用程序,你需要考虑数据的拆分,数据的隔离,节点之间的通信机制,job的调度,序列化等等。其次,RDD他是一个基础的抽象类,是不可变的,可拆分的,可并行操作的数据集合。

(2)RDD的五大特性:

1)分区列表(a list of partitions

详解:Spark中的RDD是 被分区的,每一个分区都会被计算任务(task数量=partition数量)处理,所以分区数决定了Spark的并行度,RDD的并行度默认是从父RDD穿个子RDD的。默认情况下,HDFS上一个block就是一个partition,RDD的分片数量决定了并行计算的力度,可以在创建RDD时指定RDD的分片个数(textFile(“xxx”),3),如果不指定分区数量,当RDD从集合创建时,则默认分区数量为该程序所分配到的core(一个core可以 承载2-4个分区),HDFS上的文件读取出来有多少个block就有多少个partition数量。

2)每个分区都有一个计算函数( a function for computing each split

详解:每个分区都会有计算函数,Spark的RDD的计算函数是以分片(split)为基本单位的,每个RDD都会实现compute函数,对具体的分片进行计算,因为RDD中的分片是并行的。所以计算也是并行的,这也解释了分布式计算的特性, 由于RDD具有前后依赖关系,遇到宽依赖关系,如reduceBykey等操作时候,就会划分成stage,stage内部的操作都是通过Pipeline进行的,在具体处理数据时它会通过Blockmanager来获取相关的数据,因为具体的split要从外界读数据,也要把具体的计算结果写入外界,所以用了一个管理器,具体的split都会映射成BlockManager的Block,并且split会被函数处理,函数处理的具体形式是以任务的形式进行的。

3)依赖与其他的RDD列表(a list of dependencies on other RDDS

详解:RDD会保存它的依赖关系,这有助于提高的RDD的容错性,当一个中间的分区丢失了,它能根据依赖关系快速的恢复。

这里就出来了窄依赖(父RDD的partitions最多被子RDD使用一次)和宽依赖(父RDD的partitions最少被子RDD使用一次)的概念,宽依赖就意味着有shuffle操作,Spark中的宽依赖支持两种 Shuffle Manager,即 Hash Shuffemanager和Sortshuffemanager,前者是基于Hash的 Shuffle机制,后者是基于排序的 Shuffle机制。

4)可选地,当数据类型为key-value类型时(a Partitioner for key- alue RDDS控制分区策略和分区数

详解:每个key- alue形式的RDD都有 Partitioner属性,它决定了RDD如何分区。RDD的分片函数可以分区( Partitioner),可传入相关的参数,如 Hash Partitioner和 Range Partitioner,它本身针对key- value的形式,如果不是key-ale的形式它就不会有具有Partitioner, Partitioner本身决定了下一步会产生多少并行的分片,同时它本身也决定了当前并行( Parallelize) Shuffle输出的并行数据,从而使Spak具有能够控制数据在不同结点上分区的特性,用户可以自定义分区策略,如Hash分区等。 spark提供了 partition By运算符,能通过集群对RDD进行数据再分配来创建一个新的RDD。

5)可选地,每个分区都有一个优先位置列表(a list of preferred locations to compute each split on)、

详解:优先位置列表会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Partition块的位置,在Spark运行的控制台就会发现,Spark进行计算和分片之前,它就知道task发生在那个节点上,也就是说任务本身是计算层面的、代码层面的,代码在发生运算之前就已经知道它要运算的数据在什么地方了,这体现了老大的一句:数据尽量不要动,代码动的原则,Spark本身在进行任务调度时会尽可能地将任务分配到处理数据的数据块所在的具体位置。

面试题2:Spark中spark-submit的时候如何引入外部jar包 ?

(1)./spark-submit  --jars xxxx

面试题3:spark 如何防止内存溢出 (OOM)?

总的来说Spark中的内存溢出不外乎俩种情况:

(1)map执行中OOM

(2)shuffle后内存溢出

https://blog.csdn.net/yhb315279058/article/details/51035631  好好看看

driver端的内存溢出

可以增大driver的内存参数:spark.driver.memory (default 1g)

这个参数用来设置Driver的内存。在Spark程序中,SparkContext,DAGScheduler都是运行在Driver端的。对应rdd的Stage切分也是在Driver端运行,如果用户自己写的程序有过多的步骤,切分出过多的Stage,这部分信息消耗的是Driver的内存,这个时候就需要调大Driver的内存。

map过程产生大量对象导致内存溢出

这种溢出的原因是在单个map中产生了大量的对象导致的,例如:rdd.map(x=>for(i <- 1 to 10000) yield i.toString),这个操作在rdd中,每个对象都产生了10000个对象,这肯定很容易产生内存溢出的问题。针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使产生大量的对象Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。例如:rdd.repartition(10000).map(x=>for(i <- 1 to 10000) yield i.toString)。面对这种问题注意,不能使用rdd.coalesce方法,这个方法只能减少分区,不能增加分区,不会有shuffle的过程。

数据不平衡导致内存溢出

数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。这里就不再累赘了。

shuffle后内存溢出

shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。在Spark中,join,reduceByKey这一类型的过程,都会有shuffle的过程,在shuffle的使用,需要传入一个partitioner,大部分Spark中的shuffle操作,默认的partitioner都是HashPatitioner,默认值是父RDD中最大的分区数,这个参数通过spark.default.parallelism控制(在spark-sql中用spark.sql.shuffle.partitions) , spark.default.parallelism参数只对HashPartitioner有效,所以如果是别的Partitioner或者自己实现的Partitioner就不能使用spark.default.parallelism这个参数来控制shuffle的并发量了。如果是别的partitioner导致的shuffle内存溢出,就需要从partitioner的代码增加partitions的数量。

standalone模式下资源分配不均匀导致内存溢出

在standalone的模式下如果配置了--total-executor-cores 和 --executor-memory 这两个参数,但是没有配置--executor-cores这个参数的话,就有可能导致,每个Executor的memory是一样的,但是cores的数量不同,那么在cores数量多的Executor中,由于能够同时执行多个Task,就容易导致内存溢出的情况。这种情况的解决方法就是同时配置--executor-cores或者spark.executor.cores参数,确保Executor资源分配均匀。

使用rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)代替rdd.cache()

rdd.cache()和rdd.persist(Storage.MEMORY_ONLY)是等价的,在内存不足的时候rdd.cache()的数据会丢失,再次使用的时候会重算,而rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)在内存不足的时候会存储在磁盘,避免重算,只是消耗点IO时间。

2)在(url,user)的键值对中,如 
a.text 
127.0.0.1 xiaozhang 
127.0.0.1 xiaoli 
127.0.0.2 wangwu 
127.0.0.3 lisi 
….. 
B.text 
127.0.0.4 lixiaolu 
127.0.0.5 lisi 
127.0.0.3 zhangsan 
每个文件至少有1000万行,请用程序完成一下工作, 
1.各个文件的ip数

(1)1000万行数据会不会出现driverOOM呢?(空间)

(2)如何去除脏数据呢?(可靠)

2.出现在b.text而没有出现在a.text的IP

3.每个user出现的次数以及每个user对应的IP的个数

4.对应IP数最多的前K个user

package HomeWork.csdn_InQu2import org.apache.spark.sql.{Row, SparkSession, types}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}object LogAnalyDF {/*val sparkconf=new SparkConf().setMaster("local[2]").setAppName("LogAnaly")val  sc=new SparkContext(sparkconf)val ardd=sc.textFile("E:\\若泽数据\\零基础大数据篇第三期\\Hadoop综合编程\\a.txt")val lines=ardd.filter(_!="").flatMap(_.split("\t")).map(x=>Row(x(0))).foreach(println)
*/def main(args: Array[String]): Unit = {val spark = SparkSession.builder().master("local[2]").appName("RDDtoDF1").getOrCreate()val texta = spark.sparkContext.textFile("E:\\若泽数据\\零基础大数据篇第三期\\Hadoop综合编程\\a.txt").filter(_ != "").map(_.split(" ")).map(x => Row(x(0).trim, x(1).trim))//这个Row就是将度进来的RDD,映射到Row上去val textb = spark.sparkContext.textFile("E:\\若泽数据\\零基础大数据篇第三期\\Hadoop综合编程\\b.txt").filter(_ != "").map(_.split(" ")).map(x => Row(x(0).trim, x(1).trim))val fields = types.StructType(List(StructField("url", StringType, true),StructField("user", StringType, true) //StructField字面翻译不就是字段结构化嘛))val schematype = StructType(fields) //这段代码的作用是啥呢?放不放都不影响结果val infoDFa = spark.createDataFrame(texta, schematype)infoDFa.createOrReplaceTempView("INFOA")val infoDFb = spark.createDataFrame(textb, schematype)infoDFb.createOrReplaceTempView("INFOB")//TODO...(1)求俩个文件的IP数目(需不需要考虑重复的情况呢)spark.sql("select count(distinct url) from INFOA").show(false)spark.sql("select count(distinct url) from INFOB").show(false)//TODO...(2)求出现在b.text而没有出现在a.text的IP(查询a里面没有,b里面有的数据) spark.sql("select * from INFOB where " +"(select count(url) as num from INFOA where INFOB.url = INFOA.url)= 0").show(false)/* 其实1就代表你这个查询的表里的第一个字段这里用1,也是为了方便,当然如果数据量较大的话,也可以提高速度,因为写count(*)的话会所有列扫描,这里用1的话或者用字段名的话,只扫描你写的那个列count(*)和count(字段名)  基本结果是一样的但是一种情况例外,就是当某字段名下边的数据有null值的时候,不计入这个count中,*则全部列入count中
*//* spark.sql("select distinct INFOB.url from  INFOA where " +"INFOB.url not in (select url from INFOA)")//在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。//select distinct name, id from A  就是去重的一个方法*//* spark.sql("select INFOA.url from INFOA left join INFOB on INFOA.url=IFNOB.url where INFOB.url is null").show(false)infoDFb.join(infoDFa,infoDFa.col("url")===infoDFb.col("url")).show()*///TODO...(3)每个user出现的次数和每个user对应的url个数//求的是每个user出现的次数spark.sql("SELECT  user,COUNT(*)  FROM INFOA GROUP BY user").show(false)//求每个user对应的ip数spark.sql("SELECT  user,COUNT(url)  FROM INFOA GROUP BY user").show(false)/*    spark.sql("SELECT  user,url,COUNT(url)  FROM INFOA GROUP BY user,url").show(false)*/// spark.sql("SELECT COUNT(url)  FROM INFOA where user='zhangsan'").show(false)//TODO...(4)对应IP数最多的前K个user(user,url)spark.sql("SELECT  user,COUNT(url)  FROM INFOA GROUP BY user order by COUNT(url) desc limit 10").show(false)//select top 10 user,count(url)  from INFOA  group by user order by  count(url) desc/*select count(*) as ct,a.typeid as cc,b.typename from equip_product a inner join protype b on(a.typeid=b.id) group by a.typeid order by 1 desc*/spark.stop()}}

Spark面试题(2)相关推荐

  1. spark on yarn 完全分部署_大数据Spark面试题(一)

    1.spark的有几种部署模式,每种模式特点?(☆☆☆☆☆) 1)本地模式 Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定.将Spark应用以多线程的方式直接运行在本地, ...

  2. 2019最新spark面试题,看了它,你还怕找不到工作吗?

    [导读]本篇文章为大家带来spark面试指南,文内会有两种题型,问答题和代码题,题目大部分来自于网络上,有小部分是来自于工作中的总结,每个题目会给出一个参考答案. 为什么考察Spark? Spark作 ...

  3. spark 面试题汇总

    大数据面试题汇总 大数据面试题汇总 - 简书 spark 资源调优 1.列式存储和行式存储的区别 行存储,数据行存储,一个文件可表达一个二维表.适用于一般的业务场景如CSV文件,文本文件 因为这里的行 ...

  4. Spark面试题汇总及答案(推荐收藏)

    一.面试题 Spark 通常来说,Spark与MapReduce相比,Spark运行效率更高.请说明效率更高来源于Spark内置的哪些机制? hadoop和spark使用场景? spark如何保证宕机 ...

  5. 【面试妥了】史上最全Spark面试题

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 游骑小兵 责编 | 阿秃 Spark问题精华 Q:什么是Spark? A:简单理解,Spark是在Hadoop基础上的改进,是UC ...

  6. Spark面试题梳理

    SortShuffle 1 mapTask将map(聚合算子)或array(join算子)写入内存 2 达到阀值发生溢写,溢写前根据key排序,分批写入磁盘,最终将所有临时文件合并成一个最终文件,并建 ...

  7. Spark面试题(二)

    一.spark streaming和storm有何区别? 一个实时毫秒,一个准实时亚秒,不过storm的吞吐率比较低. 二.spark有哪些组件? Master:管理集群和节点,不参与计算. Work ...

  8. Spark面试,Spark面试题,Spark面试汇总

    Table of Contents 1.你觉得spark 可以完全替代hadoop 么? 2.Spark消费 Kafka,分布式的情况下,如何保证消息的顺序? 3.对于 Spark 中的数据倾斜问题你 ...

  9. 大数据Spark面试题2023

    文章目录 Spark核心--RDD 概念 特点 创建方式 RDD的分区依赖关系 Spark的shuffle介绍 Spark的 Partitioner 分区器都有哪些? Spark中的算子都有哪些 RD ...

  10. spark面试题总结(大数据面试)

    Spark概述 Spark是一种快速.通用.可扩展的大数据分析引擎. Spark是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理实时性,同时保证了高容错性和高可 ...

最新文章

  1. oracle没什么没有备份,怎么恢复没有备份的Oracle数据库
  2. 2---信息系统集成专业技术知识(精简题目)
  3. YAML 在Python中的配置应用
  4. python debug工具_常用的 Python 调试工具,Python开发必读-乾颐堂
  5. iOS app 右滑返回
  6. IntelliJ IDEA部署tomcat时Edit Configuration无artifact选项
  7. KERNELRELEASE
  8. JAVASE阶段流程图
  9. C++模板类与Java泛型类
  10. html 自定义属性_重学前端基础:属性操作,重点getAttribute / setAttribute方法
  11. 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
  12. jvm第五节-性能调优工具使用
  13. 【编辑器】VSCode项目管理器——Project Manager
  14. 计算机网络的文件怎么删除,教你一招如何删除Win7电脑中的顽固文件
  15. (转)日本語を輸入について
  16. word文档里插入图片显示不完整,只显示一半,怎么处理?
  17. 移动端Click300毫秒点击延迟 解决办法
  18. 理财入门:财务报表(简单介绍,后续入门系列文章写完后,会写实践文章在详细介绍)
  19. 基于Matlab仿真极化双基地雷达系统(附源码)
  20. 教程 | 阿克曼结构移动机器人的gazebo仿真(五)

热门文章

  1. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
  2. linux进程管理工具:supervisor
  3. python selenium 保存网页_使用python/selenium保存完整的网页(包括css、图像)
  4. 电影院订票选座小程序 电影小程序毕业设计 毕业论文 开题报告和效果图
  5. 【在线代码编辑器】4个好用且免费的在线代码编辑器
  6. 计算机术语一种单向密码体制,密码体制有哪五部分
  7. 转载CSDN博客时的错误
  8. eWebEditor编辑器的使用
  9. html中圆的面积怎么计算,圆的面积怎么算
  10. Windows Server安装 IIS 时报错:刷新服务器管理器时出现意外错 误:无法打开匿名级安全令牌。(异常来自 HRESULT:0x80070543)