作者回复: 好问题,不过专栏最开始的计划没有包含这部分,原因是这部分其实网上都能查到,不过如果后续大家对这块疑问较多,到时候咱们也可以加餐,专门说说监控的事儿。
作者回复: 说得非常好! 1的场景非常常见,很多时候都是知其然,而不知其所以然,稀里糊涂就算完事了,交差就行。 2的回答满分💯,无可挑剔。
作者回复: 可以的,后面找机会讲一讲,到时候看大家需要,可以开个直播当面讲,比较直观,图文讲UI很多细节都说不到。
作者回复: 好问题,这部分咱们主要是给出了方法论,确实没有介绍具体的监控方法。是这样的,一般定位性能瓶颈,我们都会从硬件的计算资源出发。我们往往把一项操作、或者计算,归类为CPU密集型、内存密集型、I/O密集型和网络密集型。对于不同硬件资源的消耗,我们会推荐使用不同的系统命令,或是可视化的监控工具(如Ganglia、Prometheus等),工具这块咱们文中有举例。 这块不太好讲,难点在于,我们需要结合非常具体的cases,来介绍具体的方法,但是介绍的方法,不见得适用你日常开发中遇到的cases。所以咱们只抛出了方法论,却没有深入介绍具体的方法。 不过,其实即便没有这些工具辅助,或者没有案例分析,结合经验,我们也能大概知道哪些操作属于哪种密集型操作,从而有的放矢地去调整不同资源消耗的平衡,比方说: CPU密集型:(解)压缩、(反)序列化、hash、排序 内存密集型:大量的RDD Cache、DataFrame Cache、数据倾斜场景,等等 磁盘密集型:Shuffle 网络密集型:Shuffle 实际上,不止是磁盘与网络,Shuffle会消耗所有的计算资源,因此一般来说,在Spark的应用当中,99%的性能瓶颈,都来自Shuffle。因此,一旦把Shuffle这头拦路虎干掉,性能往往呈数量级地提升。 东一榔头、西一棒子,说的有点乱,不知道能不能回答你的困惑,有问题再讨论哈~
作者回复: 没错,性能调优的本质,其实就是用软件驱动硬件,让硬件在运行时能够高效协同,充分压榨每一类硬件资源的“剩余价值”。最早在IBM那会,可能是2011年吧,我们做IBM智能分析系统一体机,就是用软硬搭配的方式做数仓。那会对于硬件资源的协同,我们甚至有量化的比例,我记得是1:4:8,1cpu:4g内存:8块SAS盘。那会很早了,还用RAID阵列来提高I/O效率,当时网络用了最高配置,应该是万兆网我记得。虽然说场景不同,但是以硬件资源平衡为导向的思路,如出一辙。
作者回复: 太多了,可以随便在搜索引擎里面搜“Spark UDF performance”之类的关键字,(用Google或是Bing的国际版),比如这里:https://stackoverflow.com/questions/38296609/spark-functions-vs-udf-performance,非常详尽地介绍了UDF与Spark原生的SQL functions性能差在哪里~ 另外,建议关注Databricks官方的技术博客,里面也有几篇讲到UDF与Spark原生SQL functions之间的性能差异,我稍后翻到了再发给你~
作者回复: 1. 对,两个不错的监控工具~ 运行时监控系统利用率。另外,spark应该自动清除临时目录,听上去是个bug。 2. 后验是最实在的方式,不过这块,就像你说的,要注意系统误差,也就是你得保证n次尝试的运行时环境是一样的,否则的话很难判断,是调优的作用,还是系统变化。
作者回复: 没错,1是典型的盲目调优,2的思路很赞~
作者回复: 好问题,我倒不觉得是资源调度的问题,而是任务调度的问题。可以看到,执行效率不高的几个case,都把并行度设置的很大,并行度高就会存在任务调度开销过大的隐患,从而造成CPU看上去很忙,但忙的都不是“正事”,都忙着去调度任务了,而不是忙着执行任务。后面的CPU利用率那一讲,会详细聊这些内容,不妨关注一下~
作者回复: 对,第一个是非常的典型case~ 第二个监控也没问题,可以结合你说的这些工具,对硬件资源的消耗情况进行量化监控,现在的UI都做得比较到位了,指标既丰富又直观。 另外,后面的章节安排,大体上就是按照你说的思路展开的哈~ 😁