写在前面: 博主是一名软件工程系大数据应用开发专业大二的学生,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白, 之前过一篇博客,👉不会这20个Spark热门技术点,你敢出去面试大数据吗?,那一篇确实是非常精华,提炼出了非常重要同样非常高频的Spark技术点,也算是收到了一些朋友们的好评。本篇博客,博主打算再出个番外篇,也就是再为大家一些Spark面试题,敢问各位准备好了么~ 执行该job时候集群资源不足,导致执行job结束也没有分配足够的资源,分配了部分Executor,该job就开始执行task,应该是task的调度线程和Executor资源申请是异步的;如果想等待申请完所有的资源再执行job的:需要将 主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务。 worker就类似于包工头,管理分配新进程,做计算的服务,相当于process服务。 需要注意的是: 1)worker会不会汇报当前信息给master?worker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给master,master分配的时候就知道work,只有出现故障的时候才会发送资源。 2)worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。 是,driver 位于ApplicationMaster进程中。该进程负责申请资源,还负责监控程序、资源的动态情况。 RDD(Resilient Distributed Dataset)叫做分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可以并行计算的集合。 五大特性: driver端的内存溢出 : 可以增大driver的内存参数:spark.driver.memory (default 1g) map过程产生大量对象导致内存溢出: 具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。 数据不平衡导致内存溢出: 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用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模式下资源分配不均匀导致内存溢出: 这种情况的解决方法就是同时配置–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时间 cache:缓存数据,默认是缓存在内存中,其本质还是调用persist。 persist:缓存数据,有丰富的数据缓存策略。数据可以保存在内存也可以保存在磁盘中,使用的时候指定对应的缓存级别就可以了。 这个常出现在笔试阶段,手写WordCount算是一项基本技能。 1、从集合中创建RDD; 2、从外部存储创建RDD; 3、从其他RDD创建。 这个涉及到的算子就比较多了,感兴趣的朋友可以去看看博主的这两篇博客: Spark之【RDD编程】详细讲解(No2)——《Transformation转换算子》 Spark之【RDD编程】详细讲解(No3)——《Action行动算子》 绝对不会让你失望的~ 窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。 RDD任务切分中间分为:Application、Job、Stage和Task 1)Application:初始化一个SparkContext即生成一个Application; 2)Job:一个Action算子就会生成一个Job; 3)Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage; 4)Task:Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task RDD 弹性分布式数据集;不可变、可分区、元素可以并行计算的集合。 优点: 缺点: DataFrame DataFrame以RDD为基础的分布式数据集。 优点: 缺点: Dataset DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。 (1)DataSet可以在编译时检查类型; (2)并且是面向对象的编程接口。 (DataSet 结合了 RDD 和 DataFrame 的优点,并带来的一个新的概念 Encoder。当序列化数据时,Encoder 产生字节码与 off-heap 进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象。)。 三者之间的转换: 1)创建DataFrame 2)打印数据 3)注册UDF,功能为在数据前添加字符串 4)创建临时表 5)应用UDF 本篇博客就到这里,建议所有没看过开头提到的《不会这20个Spark热门技术点,你敢出去面试大数据吗?》这篇博客的朋友都去阅读一下,真的墙裂推荐!!! 如果以上过程中出现了任何的纰漏错误,烦请大佬们指正😅 受益的朋友或对大数据技术感兴趣的伙伴记得关注支持一波🙏 希望我们都能在学习的道路上越走越远😉
写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新
。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:https://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/
尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影
。我希望在最美的年华,做最好的自己
!文章目录
1、Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么问题发生?
spark.scheduler.maxRegisteredResourcesWaitingTime
设置的很大;spark.scheduler.minRegisteredResourcesRatio
设置为1,但是应该结合实际考虑,否则很容易出现长时间分配不到资源,job一直不能运行的情况。2、driver的功能是什么?
3、Spark中Work的主要工作是什么?
4、Spark为什么比mapreduce快?
5、Mapreduce和Spark的都是并行计算,那么他们有什么相同和区别?
6、Spark应用程序的执行过程是什么?
7、spark on yarn Cluster 模式下,ApplicationMaster和driver是在同一个进程么?
8、Spark on Yarn 模式有哪些优点?
9、spark中的RDD是什么,有哪些特性?
10、spark如何防止内存溢出?
11、spark中cache和persist的区别?
12、Spark手写WordCount程序
//创建SparkConf并设置App名称和master地址 val conf=new SparkConf().setAppName(“wc”).setMaster(“Local[*]”) //创建SparkContext,该对象是提交Spark App的入口 val sc=new SparkContext(conf) //使用sc创建RDD并执行相应的transformation和action val result=sc.textFile(“输入文件的路径”) Val rdd2=result.flatmap(x=>x.split(“ ”)) .map((_,1)).reduceBykey((_+_)).saveAsTextFile(“输出文件路径”) //关闭链接 sc.stop()
13、Spark中创建RDD的方式总结3种
val rdd = sc.parallelize(Array(1,2,3,4,5,6,7,8)) val rdd = sc.makeRDD(Array(1,2,3,4,5,6,7,8))
val rdd= sc.textFile("hdfs://node01:8020/data/test")
val rdd1 = sc.parallelize(Array(1,2,3,4)) val rdd2 =rdd.map(x=>x.map(_*2))
14、常用算子
15、什么是宽窄依赖
宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle。16、任务划分的几个重要角色
17、SparkSQL中RDD、DataFrame、DataSet三者的区别与联系?
18、自定义函数的过程
scala> val df = spark.read.json("/export/spark/examples/people.json") df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
scala> df.show() +----+-------+ | age| name| +----+-------+ |null|Michael| | 30| Andy| | 19| Justin|
scala> spark.udf.register("addName", (x:String)=> "Name:"+x) res5: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,Some(List(StringType)))
scala> df.createOrReplaceTempView("people")
scala> spark.sql("Select addName(name), age from people").show() +-----------------+----+ |UDF:addName(name)| age| +-----------------+----+ | Name:Michael|null| | Name:Andy| 30| | Name:Justin| 19|
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算