如何解决手动调参中问题?火山引擎DataLeap来告诉你
发布时间:2023-11-15 15:27 作者:匿名

字节跳动数据平台目前使用了1万多个任务执行队列,支持DTS、HSQL、Spark、Python、Flink、Shell等50多种类型的任务。


在手动调参的过程中,我们常常面临以下困境:

• 专业知识缺乏

○ 通常由数据分析师来执行优化任务,但他们更侧重于业务场景而非底层逻辑。因此,我们希望通过自动化方案沉淀专业知识,提供一站式解决方案。

• 一致性与可重复性缺失

○ 不同人员操作可能导致不一致的结果,手动调优往往难以复现。例如,昨天的分区调优效果良好,但明天可能因数据量增加而导致内存溢出(OOM),后续运维包括复盘将需要投入大量时间成本。


针对业务方的优化需求,通常包括提高系统稳定性、降低运营成本、解决任务阻塞及提升系统健康度等多个方面。为选择最适合的优化策略,需深入理解以下几个常见场景:

• 稳定性与健康度:提高稳定性通常意味着需要牺牲一些资源利用率以保障运行效率;而提升健康度则旨在追求较高的资源利用率,尽管可能会对运行效率产生一些影响。

• 成本优化:主要包括回收无效成本和最大化资源利用率两个方向。由于业务方常存在大量未被充分利用的资源,我们需要协助他们提升任务的运行效率和缩短产出时间。

• 解决阻塞:通过调整算力和内存等参数来缓解阻塞。若参数调优无法完全解决阻塞问题,就需要与用户协作,优化任务的调度时间。


针对上述场景火山引擎DataLeap提供了一系列实时监控和自适应调整方案,以增强Spark等底层引擎的性能和稳定性:

• OOM自适应处理:针对易发生OOM的任务,我们将其调度至独立的executor,让其独享container资源,从而在不增加总资源的前提下,减缓OOM的发生,保障任务的稳定运行。

• Shuffle溢写分裂管理:我们设定了每个容器的Shuffle磁盘写入量阈值。一旦写入量超过阈值,系统会自动分裂出新的容器,避免单个容器的溢写,同时减轻ESS的压力。

• Shuffle分级限流机制:根据任务的优先级,分配不同的查询处理速率(QPS)。高优先级任务将获得更多的QPS,而低优先级任务的QPS会相应限制,以防止ESS服务过载,确保高优先级任务的顺利执行。

• 节点黑名单优化:为了降低任务失败率,我们实现了节点黑名单机制。当节点因特定失败原因被标记时,任务会尽量避免在该节点上执行。我们还提供了设置黑名单节点数量上限的功能,防止过多节点被拉黑,影响整个集群的可用性。

• 失败回滚与参数管理:当任务实例失败时,系统会自动将参数回滚至上一个稳定版本。若连续失败两次,系统会自动抹除推荐参数并暂停优化,以避免对任务造成进一步的干扰。这种机制有助于降低业务波动对执行的风险,同时减少人工干预的成本。

通过火山引擎DataLeap这样一站式解决方案,用户可以快速发起治理。系统界面可以看到每个用户当前可治理的资源量等信息,可以批量或者单个开启优化,可以选择激进或普通策略,支持小文件优化,系统会根据业务场景自动适配。在做优化方案的同时,系统就会预估出成本和收益。