如今搜推广场景Dump流程普通面临着数据一致性差,开发效率低,维护成本高这三大痛点。在流批分离架构的状况下,同一份数据于流处理以及批处理里,借由两套代码、两套逻辑来予以实现,稍有不留意,便会致使数据对不上,业务方每日光是核对数据,就得耗费大半天的时间。
流批分离架构的困境
得物社区搜索早期实践之时,Dump流程运用的是典型的流批分离架构,流处理借助DTS订阅MySQL主表变更,由Flink消费那些变更事件并反查关联表去构建宽表,达成秒级的增量更新,批处理却是每日凌晨把MySQL数据全量抽取到ODPS,经由Spark处理多源数据并依照业务逻辑拼接,最后输出ODPS表以供离线使用。
由这种架构所带来的问题,是非常明显且容易看见的。针对同一个业务逻辑而言,流任务就得撰写一套Flink SQL,批任务则要撰写一套Spark SQL,并且这两套代码是由不同的开发人员去进行维护的。在某次社区搜索倒排表进行重构的时候,正是由于流批这两套代码之中,对于一个状态字段的处理逻辑存在不一致的情况,进而导致线上实时数据与离线报表数据之间相差了15%,整个团队耗费了两天的时间去排查,才最终定位到了问题所在。
大禹平台流批一体架构设计
为处理上述问题,得物技术团队以大禹平台为基础,构建了流批一体化的新质Dump架构。该架构底层依靠公司的DJob Cron定时任务、Flink/Spark流批计算能力以及多种存储系统,上层统一对搜索、推荐、广告等多种业务场景提供支持。大禹平台分成管理平台与后台系统两部分,管理平台具备处理逻辑的DAG开发、Debug、回归验证、监控大盘等能力,后台系统会把配置转变为实际执行任务。
核心突破当中,在于把Dump流程分解成三个标准化阶段,镜像阶段承担着MySQL数据同步的职责,宽表阶段达成具体的业务逻辑拼接,导出阶段会把结果宽表输出至引擎数据源。每一个阶段都同时对Spark和Flink这两种处理框架予以支持,不过底层运用统一的DAG编排引擎,把流批任务抽象成同一样的计算拓扑,从架构层面确保数据源头的天然致性。
一次开发流批复用的实现机制
平台当中内置了标准化的UDF开发的模板,还有,平台内置了运行时框架,这是达成一次开发、流批复用的关键之处。进行开发的时候,开发者仅仅需要专心于业务逻辑的实现,在编写UDF代码之后,进行一次注册,如此一来,就能够毫无缝隙地嵌入進流式与批量处理的流程。借助于定义特定的方法类完成消息类型的封装,用户是可以利用UDF去实现数据过滤以及驱动删除等逻辑的。
就拿社区搜索倒排表来说,此情形下,用户借助重写UDF里的那方式来达成自身的业务逻辑,凭借drop方式将无效数据给过滤掉,运用特定方式达成对下游索引发送删除消息这事,这般一套机制,把原来本应需两人天才能完成的开发工作量,压缩至半天以内,并且完全消除了因流批代码不一致所引发的数据偏差风险。
可视化编排与任务全生命周期管理
提供一站式任务开发生命周期管理的大禹管理平台,它涵盖着任务创建,可视化流程编排,实例调度与资源管控这类核心环节。Dump任务凭借可视化编排达成业务配置,用户只要拖拽算子节点,配置参数,就能直观构建数据处理逻辑。像图中所示那样,通过拖拽算子的方式使Dump任务的流程图清晰明了,开发效率提高了50%以上。
执行实例是以可视化流程图形式,将任务执行的全流程完整呈现出来,每个节点都清晰地展示着输入参数以及输出结果。当遇到任务异常的情况时,它支持针对指定节点进行手动重试这个操作,或者是终止操作,如此方便工作人员快速定位问题,随即进行流程干预。平台给出了流批数据回归验证的这般能力,它支持模板化配置,还支持一键复用,某次上线之前通过回归验证,提前发现了8处数据质量方面的问题。
数据复用与分层管理能力
public abstract class AlgoDumpUDF implements UDFFunction, Serializable {
//消息类型 add/delete/drop 三种
public AlgoDumpMessageType algoDumpMessageType =
AlgoDumpMessageType.MESSAGE_TYPE_ADD;
@Override
public AlgoDumpMessageType getStatus() {
return algoDumpMessageType;
}
//调用该方法实现增量驱动删除
@Override
public void delete(Object key, String reason) {
this.algoDumpMessageType = AlgoDumpMessageType.MESSAGE_TYPE_DELETE;
}
//调用该方法实现增量过滤
@Override
public void drop(Object key, String reason) {
this.algoDumpMessageType = AlgoDumpMessageType.MESSAGE_TYPE_DROP;
}
/**
* 用户重写该方法完成业务逻辑开发
*/
public void process() throws Exception {
}
}
大禹平台为任务产出予以双重应用的支持,它是能够对接计算引擎的那个存在,同时它还能扮演公共数据的角色,被下游任务进行高效复用。借助标准化的导出算子以及接入算子,清晰的数据复用链路得以构建而成,上游任务会把公共数据设置成导出,并且下游任务借助接入算子能够一键引用,不需要进行重复开发以及数据搬运。
public class MyUdf extends AlgoDumpUDF implements Serializable {
public Tuple2 process(String id, String taskname)
throws Exception {
//过滤消息
if(StringUtils.isBlank(id)) {
this.drop(id, "drop by id null");
}
//驱动增量删除消息
if(id.equals(0)) {
this.delete(id, "delete by id = 0");
}
//用户写具体业务逻辑
String a1 = "";
if (taskname.equals("dddddd")) {
a1 = "ddd";
}
String b1 = "test";
return new Tuple2<>(a1, b1);
}
}
平台对于任务实例运行,还存在着大全量与小全量这两种模式的支持情况,针对那些有着部分频繁更新字段需求的相关任务而言,能够达成快速加载的效果。在任务复用方面呢,其支持数据进行分层管理,就好比穿搭精选推介Dump任务,得以把动态到商品的关系当作核心主表,进而直接复用上层所产出的内容特征基础表、内容审核表以及天级离线统计特征表等,凭借DAG编排,能够快速搭建起涵盖动态至商品的大宽表。
业务场景实践与落地效果
倒排表链路于社区搜索场合出现,在此链路里Dump任务有核心实体,该核心实体是动态内容这个东西,它把动态实时内容流和天级统计特征以及商品多维特征进行融合,经由流批一体处理方式生成高时效的倒排索引宽表。此架构上线之后,实时数据跟离线数据在一致性方面达到了百分百,开发新需求之际不再需要同时去维护两套代码用于不同数据处理。
穿搭精选推荐之场景,同样对架构的有效性予以了验证。以动态与商品的关系作为主表,融合具备多源流批特征的数据,大禹平台所拥有的统一编排效能,使得原本繁杂的多源数据拼接,变得简单且能够进行管理。当下,这一套架构已然对得物社区的搜索、推荐等核心业务起到了支撑作用,日均处理的数据量达到数十亿条之多,开发效率提升幅度超过60%,数据质量方面的问题下降了80%。
在平常的开发期间,你有没有碰到过那种流批数据不相符的状况呢?欢迎于评论区域分享你所拥有的经历,去点赞并且转发这篇文章,从而让更多的兄弟躲开这些状况。




还没有评论,来说两句吧...