本篇博客,博主打算再出个番外篇,也就是再为大家分享一些Spark面试题,敢问各位准备好了么~ 1、Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么问题发生?...hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。...driver端的内存溢出 : 可以增大driver的内存参数:spark.driver.memory (default 1g) map过程产生大量对象导致内存溢出: 具体做法可以在会产生大量对象的...数据不平衡导致内存溢出: 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。...shuffle后内存溢出: shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。
在Spark作业运行时,会创建出来大量的对象,每一次将对象放入JVM时,首先将创建的对象都放入到eden区域和其中一个survivor区域中;当eden区域和一个survivor区域放满了以后,这个时候会触发...一次full gc会使得所有其他程序暂停很长时间。最终严重影响我们的Spark的性能和运行速度。...;另外一块儿,就是我们刚才所说的,用来给spark算子函数的运行使用的,存放函数中自己创建的对象。...这是因为可能是说executor的堆外内存不太够用,导致executor在运行的过程中,可能会内存溢出;然后可能导致后续的stage的task在运行的时候,可能要从一些executor中去拉取shuffle...所以拉取数据的时候,建立不了连接。然后超过默认60s以后,直接宣告失败。几次都拉取不到数据的话,可能会导致spark作业的崩溃。也可能会导致DAGScheduler,反复提交几次stage。
其实这篇是源自于我之前的一个优化案例: 优化的效果很明显,但手段很简单,难点在于对窗口函数内存使用的理解。 这篇就从内存处理的角度说一说窗口函数为啥会更容易出现性能问题。...如果觉得这篇很难懂的话,很早之前总结过窗口函数相关的一些知识点,这些知识点现在还是适用的,阔以先看看: spark、hive中窗口函数实现原理复盘 SparkSql窗口函数源码分析(第一部分) Hive...普通的聚合函数的物理执行计划分为SortBased和HashBased的;而window则都是SortBased。...spark中窗口函数的处理逻辑的入口在WindowExec类中,在这个类里,我们能看到,ExternalAppendOnlyUnsafeRowArray是窗口函数用来存放每个窗口中数据的缓存结构: 有两个参数...如果该值设置太低,数据会频繁溢出并导致磁盘写入过多,从而导致性能下降。
10.RDD共享变量: 在应用开发中,一个函数被传递给Spark操作(例如map和reduce),在一个远程集群上运行,它实际上操作的是这个函数用到的所有变量的独立拷贝。这些变量会被拷贝到每一台机器。...map过程产生大量对象导致内存溢出 这种溢出的原因是在单个map中产生了大量的对象导致的,例如:rdd.map(x=>for(i 导致内存溢出 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。这里就不再累赘了。...shuffle后内存溢出 shuffle内存溢出的情况可以说都是shuffle后,单个文件过大导致的。...executor-cores这个参数的话,就有可能导致,每个Executor的memory是一样的,但是cores的数量不同,那么在cores数量多的Executor中,由于能够同时执行多个Task,就容易导致内存溢出的情况
Spark中的OOM问题不外乎以下两种情况 map执行中内存溢出 shuffle后内存溢出 map执行中内存溢出代表了所有map类型的操作,包括:flatMap,filter,mapPatitions...在Spark-1.6.0后加入了堆外内存,进一步优化了Spark的内存使用,堆外内存使用JVM堆以外的内存,不会被gc回收,可以减少频繁的full gc,所以在Spark程序中,会长时间逗留再Spark...2.数据不平衡导致内存溢出: 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。这里就不再累赘了。...3.coalesce调用导致内存溢出: 这是我最近才遇到的一个问题,因为hdfs中不适合存小问题,所以Spark计算后如果产生的文件太小,我们会调用coalesce合并文件再存入hdfs中。...RDD对象,这虽然不一定会导致内存溢出,但是会产生大量的中间数据,增加了gc操作。
为什么考察Spark? Spark作为大数据组件中的执行引擎,具备以下优势特性。 高效性。内存计算下,Spark 比 MapReduce 快100倍。...三者都会根据Spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出。 三者有许多共同的函数,如filter、map等。...1.driver端的内存溢出 可以增大driver的内存参数:spark.driver.memory (default 1g); 2.map过程产生大量对象导致内存溢出 这种溢出的原因是在单个map中产生了大量的对象导致的...3.数据不平衡导致内存溢出 数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。...,就容易导致内存溢出的情况。
实际上是函数嵌套太深了。 按上面的逻辑,内存使用其实是非常小的,10G内存跑100T数据也不是难事。但是为什么Spark常常因为内存问题挂掉呢? 我们接着往下看。 Shuffle的本质是什么?...这就是为什么要分Stage了。每个Stage其实就是我上面说的那样,一套数据被N个嵌套的函数处理(也就是你的transform动作)。...为什么Shuffle 容易导致Spark挂掉 前面我们提到,Shuffle不过是偷偷的帮你加上了个类似saveAsLocalDiskFile的动作。然而,写磁盘是一个高昂的动作。...所以一不小心,就容易导致内存溢出了。这其实也是一个很无奈的事情。 我们做Cache/Persist意味着什么?...这个才是说为啥Spark是内存计算引擎的地方。在MR里,你是要放到HDFS里的,但Spark允许你把中间结果放内存里。 总结 我们从一个较新的角度解释了RDD 和Shuffle 都是一个什么样的东西。
map 类型的算子执行中内存溢出如 flatMap,mapPatitions 原因:map 端过程产生大量对象导致内存溢出:这种溢出的原因是在单个 map 中产生了大量的对象导致的针对这种问题。...shuffle 后内存溢出如 join,reduceByKey,repartition。 shuffle 内存溢出的情况可以说都是 shuffle 后,单个文件过大导致的。...Spaek 程序执行,有时候默认为什么会产生很多 task,怎么修改默认 task 执行个数?...但是 spark 也有劣势,由于 spark 基于内存进行计算,虽然开发容易,但是真正面对大数据的时候,在没有进行调优的情况下,可能会出现各种各样的问题,比如 OOM 内存溢出等情况,导致 spark...持久化的数据丢失的可能性更大,因为节点的故障会导致磁盘、内存的数据丢失。但是 checkpoint 的数据通常是保存在高可用的文件系统中,比如 HDFS 中,所以数据丢失可能性比较低 27.
一、究竟会出什么问题 因为HDFS为了加速数据的存储速度,将文件的存放位置数据(元数据)存在了NameNode的内存,而NameNode又是单机部署,如果小文件过多,将直接导致NameNode的内存溢出...NameNode的内存数据将会存放到硬盘中,如果HDFS发生重启,将产生较长时间的元数据从硬盘读到内存的过程。...四、小文件的其它危害 小文件除了可能会撑爆NameNode。另一个是hive或者spark计算的时候会影响它的速度,因为spark计算时会将数据从硬盘读到内存,零碎的文件将产生较多的寻道过程。...五、题外话:HDFS为什么将Block块设置为128M 1、如果低于128M,甚至过小。一方面会造成NameNode内存占用率高的问题,另一方面会造成数据的寻址时间较多。...会造成无法利用多DataNode的优势,数据只能从从一个DN中读取,无法实现多DN同时读取的速率优势。
对于driver日志而言,代码中的println()和show()等函数的输出,一般都在stdout里,大部分重要的报错信息都在stderr里。...2.2、小文件过多 小文件过多的表现之一是各task读取的数据量远小于一个HDFS block即128M或256M,它也会导致任务执行的效率较低,极端情况甚至会导致HDFS Namenode内存压力大(...有时小文件多造成的task数过多,会导致driver full gc从而导致Spark UI网页打不开从而看不到Stages情况,因为driver内存有限且负责spark ui的metrics信息状态维护...,也可以在SQL的select语句位置加入强制重分区Hint,重分区数即repartition()中的数字根据任务落地的数据量而定,尽量让每个落地文件大小在256M或128M左右,如下所示: 小文件过多也可能导致内存溢出...第三种迹象,如果spark ui的job或stages界面中,正在运行的job或stage只有少数task在长时间running,并且进入该stage的description链接后,观察Metrics与
,即48MB,此时,再加上reduce端执行的聚合函数的代码,可能会创建大量的对象,这可难会导致内存溢出,即OOM。...这就导致有可能在Spark任务运行过程中,由于频繁大量的网络通讯,本地机器的网卡流量会激增。...当 Spark 作业中包含 SparkSQL 的内容时,可能会碰到YARN-client模式下可以运行,但是YARN-cluster模式下无法提交运行(报出OOM错误)的情况。...SparkSQL的内部要进行很复杂的SQL的语义解析、语法树转换等等,非常复杂,如果sql语句本身就非常复杂,那么很有可能会导致性能的损耗和内存的占用,特别是对PermGen的占用会比较大。...持久化与checkpoint的使用 Spark持久化在大部分情况下是没有问题的,但是有时数据可能会丢失,如果数据一旦丢失,就需要对丢失的数据重新进行计算,计算完后再缓存和使用,为了避免数据的丢失,可以选择对这个
用缓存和持久化来加速 Spark 我们知道Spark 可以通过 RDD 实现计算链的原理 :转换函数包含在 RDD 链中,但仅在调用 action 函数后才会触发实际的求值过程,执行分布式运算,返回运算结果...通常需要多次迭代的算法,在同一个 RDD 上执行很多次,反复 地重新加载数据和重新计算会导致时间浪费。更糟糕的是,这些算法通常需要很长 的 RDD 链。...rdd1.count rdd1.collect 如果不调用 cache 函数,当 count 和 collect 这两个 action 函数被调用时, 会导致执行从存储系统中读文件两次。...调用了 cache 函数,第一个 action 函数(count 函数)会把它的运算结果保留在内存中,在执行第二个 action 函数(collection 函数)时,会直接在使用缓存的数据上继续运算,...一个标记为 checkpointing 的 Graph 会导致下面的顶点 RDD 和边 RDD 做 checkpoint。
可靠性修复 处理频繁的节点重新启动 为了可靠地执行长时间运行的作业,我们希望系统具有容错能力并从故障中恢复(主要是由于正常维护或软件错误导致的机器重启)。...由于大缓冲区的整数溢出导致的TimSort问题 (SPARK-13850):测试发现Spark的unsafe内存操作有一个导致TimSort内存损坏的错误。...Spark executor内存不足,因为sorter中存在导致指针数组无限增长的错误。我们通过在没有更多可用于指针数组增长的内存时强制将数据溢出到磁盘来解决该问题。...Jstack:Spark UI还在执行程序进程上提供按需jstack函数,可用于查找代码中的热点。...结果,大块内存未被使用并导致频繁的溢出和executor OOM。我们的修复现在可以正确释放内存并使大型排序有效运行。我们注意到此次修复后CPU的性能提高了30%。
作业频繁停止工作 ②老年代囤积大量短生命周期对象,导致频繁fullGC,Spark作业长时间停止工作 ③严重影响Spark作业的性能和运行速度 (2)Spark作业运行过程中...Cache对内存的要求不是很大,而task算子函数中创建的对象过多导致频繁GC(可以通过Spark UI查看Yarn界面,查看Spark作业的运行统计,从而找到每个Stage的运行情况,包括每个task...提升map操作的性能 Spark中每个Task处理一个RDD的Partition,如果是普通的map,加入partition内有100w条数据,那么task的map函数的fuction要执行和 计算...,从而导致写出数据较多,reduce端的缓冲区被填满,函数拉取缓冲区内数据进行处理,创建的大量对象来不及回收会导致OOM,所以可以适当减小缓冲区大小,从而使内存可以被及时回收; (3) 如果整个Spark...1; 7.4、解决各种序列化导致的报错 (1) 算子函数中,如果使用到了外部的自定义类型的变量,则自定义的变量必须是可序列化的; (2) 如果要将自定义的类型作为RDD的元素类型,那么自定义类型也需要是可序列化的
2020年6月18日,开发了近两年(自2018年10月份至今)的Apache Spark 3.0.0正式发布!...此外,在数字类型的操作中,引入运行时溢出检查,并在将数据插入具有预定义schema的表时引入了编译时类型强制检查,这些新的校验机制提高了数据的质量。...Databricks会持续开发Koalas——基于Apache Spark的pandas API实现,让数据科学家能够在分布式环境中更高效地处理大数据。...6.jpg Spark 3.0为PySpark API做了多个增强功能: 带有类型提示的新pandas API pandas UDF最初是在Spark 2.3中引入的,用于扩展PySpark中的用户定义函数...Spark 3.0引入了对批处理和流应用程序的功能监控。可观察的指标是可以在查询上定义的聚合函数(DataFrame)。
这就是为什么分布式流处理在大数据世界中变得非常流行的原因。 如今,有许多可用的开源流框架。有趣的是,几乎所有它们都是相当新的,仅在最近几年才开发出来。...与批处理不同,批处理以工作中的开始和结束为界,而工作是在处理有限数据之后完成的,而流处理则是指连续不断地处理天,月,年和永久到来的无边界数据。...成熟度:从采用的角度来看很重要,如果框架已经过大公司的验证和大规模测试,那就太好了。更有可能获得良好的社区支持并在堆栈溢出方面提供帮助。...在Flink中,诸如map,filter,reduce等的每个函数都实现为长时间运行的运算符(类似于Storm中的Bolt) Flink看起来像是Storm的真正继承者,就像Spark批量继承了hadoop...可能是因为来源和目的地均为Kafka以及从2017年6月左右发布的Kafka 0.11版本开始,仅支持一次。要启用此功能,我们只需要启用一个标志即可使用。
2020年6月18日,开发了近两年(自2018年10月份至今)的Apache SparkTM 3.0.0正式发布!...即使由于缺乏或者不准确的数据统计信息和对成本的错误估算导致生成的初始计划不理想,但是自适应查询执行(Adaptive Query Execution)通过在运行时对查询执行计划进行优化,允许Spark...此外,在数字类型的操作中,引入运行时溢出检查,并在将数据插入具有预定义schema的表时引入了编译时类型强制检查,这些新的校验机制提高了数据的质量。...Databricks会持续开发Koalas——基于Apache Spark的pandas API实现,让数据科学家能够在分布式环境中更高效地处理大数据。...Spark 3.0为PySpark API做了多个增强功能: 带有类型提示的新pandas API pandas UDF最初是在Spark 2.3中引入的,用于扩展PySpark中的用户定义函数,并将pandas
2018 年 4 月 27 日,TiDB 发布 2.0 GA 版。相比 1.0 版本,对 MySQL 兼容性、系统稳定性、优化器和执行器做了很多改进。...* Raft snapshot 处理完之后立即通知 PD,加快调度速度 * 解决 RocksDB 刷盘导致性能抖动问题 * 提升在数据删除之后的空间回收 * 加速启动过程中的垃圾清理过程 * 使用 `...请求的扫描的数据量,防止超时 * 限制接收 snapshot 过程中的内存占用,防止 OOM * 提升 CI test 的速度 * 解决由于 snapshot 太多导致的 OOM 问题 * 配置 gRPC...TiDB 于 2015 年 5 月在 GitHub 创建,同年 12 月发布 Alpha 版本,而后于 2016 年 6 月发布 Beta 版,12 月发布 RC1 版, 2017 年 3 月发布 RC2...版,6 月发布 RC3 版,8 月发布 RC4 版,10 月发版 TiDB 1.0,并在 2018 年 3 月发版 2.0 RC1。
2014 年 2 月,Spark 成为 Apache 的顶级项目; 2014 年 11 月, Spark 的母公司 Databricks 团队使用 Spark 刷新数据排序世界记录。...RDD 详解 1) 为什么要有 RDD? 在许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘中,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。...; 由于以上问题,Shark 维护了 Hive 的一个分支,并且无法合并进主线,难以为继; 在 2014 年 7 月 1 日的 Spark Summit 上,Databricks 宣布终止对 Shark...,即48MB,此时,再加上reduce端执行的聚合函数的代码,可能会创建大量的对象,这可能会导致内存溢出,即OOM。...这就导致有可能在Spark任务运行过程中,由于频繁大量的网络通讯,本地机器的网卡流量会激增。
领取专属 10元无门槛券
手把手带您无忧上云