[SPARK][SQL] 面试问题之Spark AQE新特性

哦,前年我遇到了 Spark,一个新的 AQE 功能,真是个好东西。

想一想,以前在使用SparkSQL时,尤其是上百TB的数据时,查询执行速度非常慢,有时甚至不知道如何调优。
AQE就是为了解决这个问题而出现的。

底线是这样的:
1 实时调整:我记得去年有一个金融客户搭建了一个包含数千个节点的大型集群来执行ETL任务。
原本需要两个小时,但AQE开通后,速度加快了一个小时。
它根据运行时的中间结果实时更改计划。
不像以前,你必须跑才能找出问题所在。

2 自动优化部分。
有一天,我在北京的时候,一个电商客户的数据划分得太细,上千个部分,Join运行时崩溃了。
AQE可以自动合并这些小分区。
我翻阅杂志,发现上面写着:“哎,这版块太小了,合并几个吧。
”这将使您不必手动配置它。

3 加入策略:我以前见过这种情况。
某个连接本来可以使用BroadcastHashJoin,但系统没有选择它,因此速度非常慢。
AQE可以看统计信息,自动改成BroadcastHashJoin,性能立马提升。

4 处理中的倾斜:我也遇到过这种情况。
有一年,在一个电信项目中,某个连接密钥包含大量数据,无法直接访问。
AQE可以自动拆解这一大段并进行多批次处理。
当发布结束时,客户会说,“嘿,这次没有卡住。

5 设置参数:当然,你不能完全放过情况。
我还尝试调整这个 AdvisoryPartitionSizeInBytes,根据我的数据,它运行得更快。
然而,我必须承认,我对调优并不是很了解。
有时参数设置错误,效果很不好。
所以需要进行几次尝试。

一般来说,AQE 旨在让 SparkSQL 变得更加智能。
在执行请求时,它可以开动自己的大脑,根据实际情况调整计划,所以你不必跟踪一切。
在大数据量和大规模集群中,这确实可以消除很多痛苦并显着提高效率。

不过该功能只有Spark 3 .0之后才可用。
如果您仍在使用旧版本,您将无法享受此优惠。
更何况,他也不是万能的。
有时候你还是要统一一个具体的任务,一步步教它跑得比别人快。
我以前没有接触过这个,所以我不敢说任何愚蠢的话。

35道必会的大数据面试题及答案,面试一定会问到的题目

说白了,大数据面试题的核心就是测试你是否能够实施技术任务,理解业务需求。
这3 5 个问题实际上围绕着这几个关键点:技术选型、性能优化、数据治理和解决实际问题的能力。

要扩大规模,技术选型尤为重要。
比如实时计数系统,我们去年的亿级项目使用了Flink+Redis,但前提是我们要懂得使用HyperLogLog算法。
去年我们就遇到了一个陷阱,就是因为我们没有控制好Redis的内存,导致它在峰值的时候直接崩溃了。
还有一点就是数据倾斜的问题。
去年的一个电商项目,Join操作卡住了4 8 小时。
后来发现是某个空值字段导致的。
改用DISTRIBUTE BY并添加随机前缀后,处理时间直接从两天缩短到3 0分钟。
还有一个很关键的细节,比如Hive和SparkSQL的优化器之间的区别。
去年我们重构报表系统的时候,因为不了解Catalyst优化器,几乎损失了5 0%的查询效率。
最终我们通过重写UDF解决了这个问题。

一开始我以为HBase是通用的NoSQL,但后来发现这是错误的。
在处理社交平台的实时推荐日志时,HBase的写入吞吐量根本无法承受。
改用Kafka+Redis后性能才达标。
等等,还有一件事。
在优化大数据集群的存储成本时,去年我们使用了Zstandard压缩,存储空间直接减少了7 0%,但前提是要知道如何使用HDFS的冷热数据分层策略——很多人没有注意到这一点。

结束:建议多准备几个能够体现分布式系统调优经验的项目,更不要提轻栈技术的概念了。

spark面试必须掌握的知识点概览

上周,一位客户在 Spark 面试时问我他应该了解哪些知识点。
我给它分配了,主要有SparkRuntime、SparkCore、SparkStreaming、SparkSQL和StructuredStreaming这五个主要的。
下面详细说一下各个模块的内容。

第一个是 SparkRuntime。
该模块包括集群角色和模式。
例如,在Standalone模式下,有Master、Worker、Executive和Driver角色,每个角色都有不同的分工。
在YARN模式下,有ResourceManager和NodeManager。
您应该了解Spark应用程序的部署过程,包括驱动程序和可执行文件的启动过程、RPC通信方式以及Cluster Manager中各个角色的作用。

然后是财富管理和调整。
该重点包括执行内存分配策略、任务精益性能和解决方案,例如数据分区优化、自定义分区和执行存在监控以及动态分配方法。

接下来是 SparkCore。
该模块的核心是RDD。
你应该掌握 RDD 的五个主要特性,如除法、不变性、并行操作等以及运算符分配。
还需要了解DAG的生成和分区逻辑以及任务调度的执行过程。

然后就是数据局部性,这需要你了解PROCESS_LOCAL、NODE_LOCAL等数据局部性原则以及其他优先级数据局部性原则,以及它们的使用方法和潜在的陷阱。

算子比较和优化重点是ReduceByKey和GroupByKey的区别、相关map部分和预分区条件、广播变量(broadcast)的原理和使用陷阱以及线程安全机制和Accumulator应用条件等。

在SparkStreaming的这一部分,你应该了解微批处理的原理,例如receiver和directAPI模式的区别、direct模式的正确实现、检查点的使用等。

性能调优部分包括批处理时间设置、任务倾斜解决、内存管理、Kafka分区和Spark并行化等。
在SparkSQL的这一部分,你应该了解运算符和优化、存储格式的比较、操作策略等。

最后,StructuredStreaming。
这个模块的主要特点包括动态表概念、附加的SQL引擎、实时处理、水印方法等等,反正你能理解。
祝你面试顺利!我还在考虑这个问题,如果还有什么问题可以问我。