HashTable 在蚂蚁转化归因中的极致运用

news2024/10/7 14:30:58

作者:开七 蚂蚁集团数据技术专家

本文围绕 hash cluster 表运用及 Shuffle 过程原理进行讨论,欢迎各位开发者加入大数据计算 MaxCompute 社区:https://developer.aliyun.com/group/maxcompute

概述

蚂蚁的转化归因在初期运行两个多小时的情况下,进行了一系列优化,其中建立hash cluster表及强制hash关联及Shuffle的手动干预进行remove操作此部分优化占了较大比重。本文则主要讲述hash cluster表的一些运用。

Hash cluster表具有两个作用:

  • 存储预排序的重排压缩。Hash cluster表采用分桶排序操作,若相同的值重复度高,则可以达到更好的压缩效果。

  • 下游任务的Shuffle Remove。Hash cluster表由于采用对指定字段分桶操作,下游若一些关联、聚合操作与分桶键策略相同,则会进行Shuffle Remove操作。MaxCompute操作中,Shuffle是昂贵的,因此有必要在优化阶段尽可能移除不必要的Shuffle。什么情况下可以移除Shuffle?简单来说就是数据本身已经具有某些数据分布特性,刚好这个数据分布特性满足了上游算子对这份数据的分布要求,就不需要再做Shuffle,这个也是Hash cluster表的重要应用场景。

前言

转化归因任务加工相对较复杂,在此对其中关键步骤做个说明:

1、源头分三部分,访问日志数据A,点击日志数据B,接入的事件数据C,此三部分数据表已设置为4096分桶的hash表。

2、以上三部分数据以用户进行分组,分别传入用户的点击、访问和事件数据,通过udf处理得到单用户的归因结果数据(以字条串返回)。

3、返回以用户粒度的结果数据进行字段拆分后以用户的事件id进行膨胀,膨胀后关联用户事件数据补充事件数据后其它字段。

4、上一步关联后的结果数据以日志id进行膨胀,膨胀后的数据关联访问和点击日志数据得到日志中的其它一些补充字段。

以上步骤按单用户数据处理过程流程大致如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMR7tkd1-1684723382294)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b6c137ce3d324099a5b00d9eaa520aac~tplv-k3u1fbpfcp-zoom-1.image "1.jpg")]

以支付宝支付线来讲,最初总计运行两个来小时,加工逻辑步骤有近十来个任务。后续进行了udf优化并逻辑合并为一个script,图2右部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KX4iZboC-1684723382295)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/461d95a774e244ab9d879c24fa05d280~tplv-k3u1fbpfcp-zoom-1.image "image.png")]

在这里插入图片描述

优化过程

中间状态

以下任务是在经过多任务合并为一script任务后内容,其中源头输入表点击(mid_log_clk_xxxx_di)和访问(mid_log_vst_xxxx_di)表建立hash cluster,而事件表是以事件代码为二级分区的普通表(事件表是通过页面通过不同的事件码在线接入后生成不同的任务产出的表),以支付线为例,任务改造后稳定在半小时左右,但目前随着事件增加有所增长。

点击访问建表主要内容

CLUSTERED BY (user_id ASC) SORTED BY (user_id ASC,log_id ASC) INTO 4096 BUCKETS

整体运行图如下,相比原来十来个任务,无论是日常运行、历史回刷都变的相对简洁。

在这里插入图片描述

在此过程中个人分析若事件输入表能在运行过程中变hash cluster的话,那下游按理可再减少一些Shuffle操作,尝试对事件表增加 DISTRIBUTE BY user_id SORT BY scene_type,order_id 操作且设置参数set odps.sql.reducer.instances=4096,但测试发现下游对此无感知,联系MaxCompute 开发人员得知目前暂无此功能。

接入事件hash表不能在运行中得到那只能再增加一个任务把事件数据插入一cluster表供任务使用,但由于在主链路上,增加的时间影响整体产出时间,但以支付线几个亿数据量为例,插入cluster表整体3分钟左右,建立cluster后整体执行图如下:

在这里插入图片描述

以上执行图已经相当简单,运行速度相比原来任务及增加的上游整体也有一定的提升,但是发现两主task中,m3和m4同样都是4096实例,都是按用户分桶进行的分发,按理此两M应该是可以Shuffle remove进行合并的,问及MaxCompute开发人员大致是一些复杂操作后属性丢失后不能消除Shuffle。

最终状态

虽然图5的执行计划相对来说已经非常简洁,但一些实际结果与认知不同时总想找到问题出在哪里。因此,我对任务中的一些sql嵌套进行层次减少,对一些关联先拆解再慢慢增加,在此过程中发现增加了一个小表的mapjoin会导致下游需要进行Shuffle(理论上小表mapjoin不影响主表分发),其中一个黑名单列表,数据量少且近三年都无增加数据,因此直接改造为固定值传入,另外一个小表在最后再进行mapjoin关联,最终执行图如下,只有一个主的task,非常简洁。

在这里插入图片描述

以下为m2中的算子,非常复杂,但无需Shuffle执行效率非常高。

在这里插入图片描述

执行结果

最终执行时长不到20分钟,相对原先减少一半,而且消耗的cu及内存都有所降低,转化归因整体链路产出提前20分钟+。
在这里插入图片描述

在这里插入图片描述

总结

1、本文的一些优化整体是基于 Hash Clustering Table的建立,在创建Hash表时需要考虑分桶键的设定,并不是说一定要所有的关联键设置为分桶键,在考虑Hash的一些任务性能的同时,也需要考虑表的存储压缩大小。

2、针对MaxCompute平台的一些策略原理,首先需要有自己的一些自身认知,很多时候不一定是一两个文档能够说清楚,更需要一些实践的测试来加深知识点的理解。

3、MaxCompute很多方面已经非常智能及高效,希望在自动的优化方面可以更加智能

MaxCompute发布免费试用计划,为数仓建设提速 】新用户可0元领取5000CU*小时计算资源与100GB存储,有效期3个月。 立即领取>>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook拆分的深度思考:社交媒体真的是必需品吗?

在当今数字化时代,社交媒体已经成为我们日常生活中不可或缺的一部分。而Facebook作为其中的巨头之一,不可否认地对人们的社交行为和信息传播产生了巨大的影响。 然而,随着越来越多的争议和讨论浮出水面,我们有必要进行深入思考&a…

文档处理新探究成果——前沿技术CCIG文档图像智能分析论坛分享

目录 前言 一、文档分析与识别最新研究 二、视觉-语言预训练模型及迁移学习 三、篡改文本图像的生成与检测技术 四、智能文档处理技术在工业界的应用与挑战 总结 前言 图文智能处理前沿技术一直是我所关注的技术,尤其在现在集成多态大模型的基础之上&#xff0…

关于PCBA元器件布局的重要性

SMT贴片加工逐步往高密度、细间距的设计发展,元器件的最小间距设计,需考虑SMT厂家的经验和工艺完善程度。元器件最小间距的设计,除了保证SMT焊盘间安全距离外,还应考虑元器件的可维护性。 器件布局时保证安全间距 1、安全距离跟…

设计模式-简单例子理解适配器模式、装饰器模式

文章目录 一、适配器模式1. 要点2. Demo 二、装饰器模式1. 要点2. Demo 三、区别 本文参考: 基本原理:装饰器模式 | 菜鸟教程 (runoob.com) 基本原理:适配器模式 | 菜鸟教程 (runoob.com) 优缺点和区别,装饰模式:适配器…

微服务流量控制组件Sentinel

1 简介 Sentinel是阿里开源的项目,是一款面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障服务的稳定性。 核心思想是:根据对应资源配置的规则来为资源执行相…

西米支付:“中止”支付牌照,汇卡支付机构“失联”

近日,又一家支付公司因“失联”被列入了经营异常名录。 工商信息显示,目前被“中止”中的持牌支付机构广东汇卡商务服务有限公司(简称“汇卡支付”)因“通过登记的住所或者经营场所无法联系” 被广州市市场监督管理局列入经营异常…

网络进阶学习:单臂路由(灵魂五问)

单臂路由(灵魂五问) 一问:什么是单臂路由?二问:单臂路由这一概念怎么出现的?三问:单臂路由解决什么问题?能不能用其他方式取代单臂路由?四问:单臂路由最合适的应用场景&…

电脑E盘被不小心格式化了?别急,介绍三种数据恢复方法

电脑E盘格式化后如何恢复数据?意外的电脑E盘格式化或许是每个人都遇到过的问题。然而,当您发现您的重要数据已经丢失时,您可能会感到沮丧甚至绝望。但请不要担心。在本文中,我们将介绍一些有助于您找回数据的方法,希望…

2023年5月DAMA-CDGA/CDGP数据治理认证咋样

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

uvc驱动ioctl分析下

uvc驱动ioctl分析下 文章目录 uvc驱动ioctl分析下uvc_ioctl_enum_input枚举输入uvc_query_ctrl__uvc_query_ctrluvc_ioctl_g_input 获取输入uvc_ioctl_s_input 设置输入uvc_query_v4l2_ctrluvc_ioctl_queryctrl查询控制器uvc_ioctl_query_ext_ctrl查询扩展控制器 uvc_ioctl_g_c…

系统分析师经典易错题,解题思路二

企业应用集成(Enterprise Application Integration EAI)技术企业应用集成技术可以消除信息孤岛,它将多个企业信息系统连接起来,实现无缝集成,使他们就像一个整体一样。EAI是伴随着企业信息系统的发展而产生和演变的,企业的价值取向是推动EAI技术发展的原动力,而EAI的实现…

煤矿电子封条系统 yolov7网络模型

煤矿电子封条系统通过yolov7网络模型算法,煤矿电子封条系统可以实现对煤矿井下人员的出入管理,提高对煤矿井下人员的监管效果。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和通道乘数。然后&…

从热爱到深耕,在开发路上的他们勇敢逐梦

2022年的程序员节, #大龄程序员去哪儿了#成为了社交媒体上最火的话题之一,程序员的职场成长问题在社会上引起了广泛关注。 有2位在技术领域摸爬滚打很多年的开发者,35岁后的他们,有70后,有80后,依然在编程…

【Java编程系列】Springcloud-gateway自带限流方案实践篇

1、前言 作为一个后端开发,对于后端服务的安全性方面,一定要有足够的考虑。近期的开发工作中,有一个实现分享外部链接的需求点,个人认为这一块会有安全隐患。比如,因为这个分享的外链会被用户无限制点开查看&#xff0…

常见分布函数。

一维常见分布函数 1.离散型 ① 0 - 1分布 记 X~B(1,p) 如果X的概率分布为 ( 1 0 p 1 − p ) \begin{pmatrix} 1 & 0 \\ p & 1-p \end{pmatrix} (1p​01−p​),则称X服从参数为P的0-1分布&#xff08;0<p<1&#xff09;。 注&#xff1a;0-1分布又称一次伯努利试…

iOS-Telegraph异步响应实现

背景 Telegraph该库只支持管理本地同步请求&#xff0c;为了长远打算&#xff0c;需要研究是否能使response异步回调的方法 参考gitHub-Telegraph文档 现象&#xff1a;根据文档说明和示例&#xff0c;以及查看源码实现确认该第三方库确实只支持管理本地同步的请求响应 它的…

【程序员日记】——从业务编排到低代码 | 京东云技术团队

之前总聊微服务&#xff0c;今天换一个话题—低代码。 低代码这个词也是最近这几年很火的概念&#xff0c;尤其是遇到大环境下行&#xff0c;很多大厂和互联网那个公司也在慢慢在低代码方向发力&#xff0c;当然&#xff0c;对于传统项目交付型的软件公司&#xff0c;低代码也…

LabVIEWCompactRIO 开发指南28 可重入和非重入子VI之间的权衡

LabVIEWCompactRIO 开发指南28 了解可重入和非重入子VI之间的权衡 重入是子VI执行属性中的设置。在LabVIEW FPGA中&#xff0c;子VI执行默认设置为可重入。重入在FPGA逻辑中创建子VI的多个副本。这能够并行执行子VI的多个副本&#xff0c;同时存储不同且独立的数据存储。 在…

计算GMAC和GFLOPS

GMAC 代表“Giga Multiply-Add Operations per Second”&#xff08;每秒千兆乘法累加运算&#xff09;&#xff0c;是用于衡量深度学习模型计算效率的指标。它表示每秒在模型中执行的乘法累加运算的数量&#xff0c;以每秒十亿 (giga) 表示。 乘法累加 (MAC) 运算是许多数学计…

opencv_c++学习(十七)

一、边缘检测 左侧上面的曲线表示的是像素从左到右的变化&#xff0c;下面的曲线是上面曲线求导而得。 Sobel边缘检测算子&#xff1a; Sobel(InputArray src, outputArray dst,int ddepth, int dx, int dy, int ksize 3, double scale 1, double delta 0, int borderType …