ITPub博客

首页 > 数据库 > 数据库开发技术 > Celeborn 加速 Spark 计算大PK(下)

Celeborn 加速 Spark 计算大PK(下)

原创 数据库开发技术 作者:安瑞哥是码农 时间:2024-01-26 23:09:30 0 删除 编辑


上篇文章写了我对 Celeborn 的初体验,从它的官网内容、基础服务部署、开发环境准备,这3个维度进行了比较细致的体验和描述。


从前期的体验来看,部署跟开发环境的准备也都还比较顺利,但是对于它最重要的功能——shuffle 计算的优化(提速),由于篇幅关系,在上文中并未得到体现(本地模式运行的程序没啥说服力)。


那么今天这篇内容,咱就专门针对 Celeborn 是否能对 Spark 任务的 shuffle 有优化提速的效果,开展一番「正儿八经」、「轰轰烈烈」的对比测试(Spark on yarn、大数据量、多场景),看这款工具是否值得大家一用。


PS:本文以 hadoop 3.1 + spark 3.2 + Celeborn0.32-incubating 进行测试验证。



0. 测前准备


就在上篇文章发出不久,一个星球球友就找到我,问:能不能在你正经测试的时候,数据量搞大一点?比如50T啥的,没有的话,我可以借你。


听这话,感觉有点瞧不起我呢,赶紧告诉他,咱可是屯了上PB级别的数据量哟,而且都是生产级的真实数据呢。


所以数据量在我这里,从来都不是问题,问题在于如何设计这个测试场景,让它更贴合大多数人在实际工作中的场景要求。


基于这次测试对比,我准备设计「2个定量」跟「2个变量」:


定量1:基于 Spark batch 计算框架,且用 Spark on yarn 模式运行;


定量2:都是基于hadoop3.1、以及3个计算节点来展开,对比组之间,用同样的并行度,同样的内存和CPU配比,公平得厉害;


变量1:单次计算的数据量会逐步递增,但是也不会大到离谱,毕竟我的测试集群计算能力有限,而且其实大部分同学的所谓大数据项目,单个任务也没有几个能达到离谱的数据量,咱就不装那个逼了,控制在 GB 量级即可;


变量2:会采用几个不同的业务计算 SQL 来达到不同计算场景的目的,毕竟理论上,不同的 SQL 语句,会带来不同的 shuffle 过程,而不同的 shuffle 过程,势必就会带来不同的计算效率影响。


至于程序的设计方式,很简单,因为我们的核心是为了测试出 Celeborn 对 shuffle 的影响。


那么一切跟它无关的设计就都不需要,比如 SQL 的计算结果不需要入库,直接打印出来就好了,处理流程拉的越长,理论上对结果的干扰就会越大。


具体的代码在上一篇文章中已经给出,有兴趣的同学可自行查看。


Celeborn 真的能对 shuffle 提速吗?(上)



1. 正片开始


PS:为了减少比如网络动荡、集群负载不稳定带来的影响,每个场景下的对比,都执行2次,最后取平均值算成绩。


1.1 基于 SQL01 情况下


SELECT
    target_ip,
    lower(domain) AS lower_domain,
    count(target_ip,lower(domain)) as count
FROM t
where
target_ip != null or target_ip != ''
GROUP BY
    target_ip,
    lower_domain
ORDER BY
    count DESC
LIMIT 100

1.1.1 3G数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:58秒



利用 Celeborn 情况下,耗时:46秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:52秒



利用 Celeborn 情况下,耗时:44秒


小结:利用 Celeborn 后,执行效率提高8秒。



1.1.2 11.1G 数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:142秒。



利用 Celeborn 情况下,耗时:142秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:174秒。



利用 Celeborn 情况下,耗时:109秒。



小结:利用 Celeborn 后,执行效率提高33秒。


1.1.3 88G 数据量时


第1次测试结果:


不利用 Celeborn 情况下,耗时:16分32秒



利用 Celeborn 情况下,耗时:14分14秒



第2次测试结果:


不利用 Celeborn 情况下,耗时:16分16秒



利用 Celeborn 情况下,耗时:14分52秒


小结:利用 Celeborn 后,执行效率提高84秒。



1.1.4 1017.3G 数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:1小时7分05秒



利用 Celeborn 情况下,耗时:54分33秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:44分41秒



利用 Celeborn 情况下,耗时:56分40秒



小结:利用 Celeborn 后,执行效率几乎打平。



1.2 基于 SQL02 情况下


select
client_ip,
max(row_num2) as max
from
(
select
client_ip,
row_num2,
date_min
from
(
select
client_ip,
sub_date,
row_number() over (partition by client_ip,sub_date order by client_ip,sub_date) as row_num2,
date_min
from
(
select
client_ip,
date_min,
row_number() over (partition by client_ip order by date_min) as row_num,
try_add(cast(date_min as long), row_num) as sub_date
from
(
select
client_ip,
substring(time,0,12) AS date_min,
row_number() over (partition by client_ip,substring(time,0,12) order by substring(time,0,12)) as row_num
from
t
where
length(time)=14
) A
where A.row_num=1
) B
) C
)D
group by
D.client_ip
order by max desc
limit 100;

1.2.1 3G数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:2分59秒



利用 Celeborn 情况下,耗时:1分28秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:1分36秒



利用 Celeborn 情况下,耗时:1分21秒


小结:利用 Celeborn 后,执行效率提高53秒。


1.2.2 11.1G数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:4分26秒



利用 Celeborn 情况下,耗时:3分55秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:4分01秒



利用 Celeborn 情况下,耗时:4分23秒


小结:利用 Celeborn 后,执行效率提高4秒。



1.2.3 88G数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:31分钟



利用 Celeborn 情况下,耗时:29分52秒



第2次测试结论:


不利用 Celeborn 情况下,耗时:34分15秒



利用 Celeborn 情况下,耗时:29分04秒。


小结:利用 Celeborn 后,执行效率提高3分10秒。


1.2.4 1107.1G数据量时


第1次测试结论:


不利用 Celeborn 情况下,耗时:Null


为啥?因为我跑了3次,都跑失败了,前两次是数据块异常导致的,而这一次又是因为下面这个连接原因:


但是,开启了 Celeborn 之后,就这个问题就没有了,好评!


利用 Celeborn 情况下,耗时:1小时34分30秒



因为这个场景的测试,每跑一次都太耗时了,时间关系,第二趟咱就暂时不测了,行不(为了这趟测试,前后已折腾了两天)。


小结:利用 Celeborn 后,能成功跑完任务,而不开启 Celeborn 情况下,尝试3次都失败。




2. 测试过程说明


在以上测试过程中,为了尽可能减少干扰,在确保集群负载稳定的情况下,通过启用 Celeborn 跟不启用 Celeborn 功能交替串行的方式来执行测试程序。


在执行过程中,也出现过几次因为处理数据量太大,导致内存不足(跟是否开启 Celeborn 无关),或者网络连接异常而执行失败(没有开启 Celeborn 情况下),只能一次次调整参数,重试,每重试一次就得浪费至少1个小时,好好考验了一把我的耐心。


在测试过程中还发现,启用了 Celeborn 功能之后,随着处理数据量的加大和计算复杂度的提高,稳定性能得到很好的保障。


但并不能像某些「广告文」中宣称的那样,可以有效减少「堆外内存」的使用,至少,我这个场景下就不行(如下错误显示,原本设置的堆外内存太小,需要手动增加)。


在测试过程中,我也是一直瞪着眼珠子,密切注视 shuffle 数据目录的变化,生怕这玩意在摸鱼。


在计算过程中,发现对应目录大小会一直增加,直到整个 Spark 程序运行结束,对应文件跟目录就会很快删除。



最后


针对以上这些真实的测试对比结果,总结如下:


sql条件
数据量
平均耗时(大概)
提速效果
sql01
3G
50秒
8秒
sql01
11G
140秒
33秒
sql01
88G
15分钟
84秒
sql01
1017G
55分钟
几乎打平
sql02 3G 100秒
53秒
sql02 11G 4分20秒
4秒
sql02 88G 32分钟
3分10秒
sql02 1017G 1个半小时
完胜



从以上结果可以看出来,让我比较欣喜的是,启用 Celeborn 之后,能够保证 Spark 任务在处理大数据量,以及比较复杂的计算时,程序的稳定性。


至于它的提速,确实有一定的加速效果,只不过呢,总体来看,提的比较有限,而且偶尔还会「翻个车」,以我的评判标准,算差强人意吧。


那么对于 Celeborn 的表现, 你怎么看?




你可以添加我的私人微信(或加入知识星球),跟一群热爱技术的小伙伴一起成长...


原文作者:安瑞哥是码农;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-02-16

  • 博文量
    228
  • 访问量
    115476