离线计算中的幂等和DataWorks中的相关事项

简介: 概念 幂等这个词在软件研发中经常被提到。比如消息发送时不应该同时给同个用户推送多次相同的消息,针对同一笔交易的付款也不应该在重试过程中扣多次钱。曾见过一个案例,有个对于一个单据的确认模块没有考虑到幂等性,导致对应的单据有两条确认记录。

概念

幂等这个词在软件研发中经常被提到。比如消息发送时不应该同时给同个用户推送多次相同的消息,针对同一笔交易的付款也不应该在重试过程中扣多次钱。曾见过一个案例,有个对于一个单据的确认模块没有考虑到幂等性,导致对应的单据有两条确认记录。其实幂等这个词是个数学的概念,表示这个操作执行多次的结果和执行一次是完全一样的。严格的定义这里不展开讨论,有兴趣的可以到网上搜一下,会有很多介绍。通俗一些说,幂等表示这个操作可以多次重跑,不用担心重跑后到结果会乱掉。就赋值而言,i=1就是个幂等到操作,无论做多少次赋值,只要有做成功一次,i的值就是1。而i++就不是一个幂等的操作。如果多次执行这个操作,i的值会不断增加1。

从前面的例子也可以看出,幂等的优势是可以屏蔽重试带来的问题。在分布式的环境里,一般会通过消息中间件、异步调用等方式实现服务之间的解耦。在这过程中,如出现系统异常状况下的状态不明确的情况,一般会进行重试。如果应用不满足幂等的要求,则就会出现错误的结果。

离线计算与幂等

离线计算里的一个作业经常是非常重的,跑一个作业要较多时间。而且由于其特性,经常是凌晨开始计算,在OLTP业务调用量上来以前需要产出结果。如果发现问题,经常没有太多的时间留给技术人员去详细定位问题的原因,然后清理脏数据后重新进行计算。这时候我们需要计算能够进行任意次的重跑,也就是说计算需要满足幂等性。对于一个满足幂等性要求的作业,出现问题的时候,我们可以首先先重跑一下作业,以期能尽快恢复业务,后续再根据之前的日志慢慢定位问题。下面我们以MaxCompute+ DataWorks为例,从不同的角度里讨论离线计算的典型场景——离线数仓,看看都有哪些地方需要做到幂等以及如何做到。

计算

目前的离线计算,出于开发的效率考虑,一般都会考虑使用SQL进行代码开发。SQL里包含DDL和DML两种语句。除了SQL,计算引擎一般还支持MapReduce、Graph等计算模型。

DDL

DDL语法可以通过语句里的if exists/if not exists来确保幂等性。比如创建表可以用create table if not exists xxx,删除表可以通过drop table if exists xxx来保证不报错而且可以重复执行。当然创建表也可以先删除后再创建来事先幂等性。诚然,如果是建表这种“一次性”的操作可以在上线的时候手工做好,但是日常的分区创建/删除等操作就需要通过写进代码里,通过if exists/if not exists来保证可以重试。

DML

DML对数据有影响的是Insert操作。目前Insert有两种模式:Insert into和Insert overwrite。其中Insert into是把数据追加到原来的数据里,而Insert overwrite是把以前的数据直接覆盖。所以可以清楚得看到,Insert into是不满足幂等性要求的,而Insert overwrite是满足的。如果使用Dataworks的SQL节点跑一个Insert into的作业,会有提示

!!!警告!!!
在SQL中使用insert into语句有可能造成不可预料的数据重复,尽管对于insert into语句已经取消SQL级别的重试,但仍然存在进行任务级别重试的可能性,请尽量避免对insert into语句的使用!

我也曾去了解一些使用Insert into的用户,要使用这种数据更新方式的原因,除去手工数据订正,发现一般都是针对一些不会变化的数据(比如网站的日志、每天的统计结果等)每天需要追加到表里。其实这种更好的方法是创建一个分区表,把每天需要Insert into的数据改成Insert overwrite到每天的一个不同分区里。

MapReduce

MapReduce默认就是使用覆盖写入的模式的。如果确实有需要追加写入,可以使用com.aliyun.odps.mapred.conf.JobConfsetOutputOverwrite(boolean isOverwrite)来实现。
如果需要改成幂等的,可以使用前面SQL里提到的,把数据写入特定的分区里来实现。

ETL

ETL我们暂时不考虑数据清洗(一般数据清洗是通过计算来实现的),而这只讨论数据的同步。在Dataworks里,数据的同步通过数据集成模块来实现。在数仓中,数据同步包括数据导入到数仓和数据从数仓中导出两种场景。

数据导入的场景要实现幂等性比较容易。首先我们对于导入数据,建议把每天新增的数据导入到新的一个分区里,然后只需要设置导入的MaxCompute表的清洗规则为“写入前清理已有数据Insert Overwr”即可。这样数据在导入的过程中会先清空数据后再导入,从而实现幂等。

a1

数据导出的场景,如果数据是全量导出的,也可以用类似数据导入的方法,配置“导入前准备语句”,把原来的数据全部删除后重新导入。另外如果数据源支持主键冲突设置时,可以通过“主键冲突”设置成“Replace Into”来实现数据的替换。

a2

从上面的截图里可以看到,目前Dataworks本身就支持设置“出错重试”,如果同步作业满足幂等性要求的,可以大胆开启这个设置,从而降低运维成本提高稳定性。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
一站式大数据开发治理平台DataWorks初级课程
DataWorks 从 2009 年开始,十ー年里一直支持阿里巴巴集团内部数据中台的建设,2019 年双 11 稳定支撑每日千万级的任务调度。每天阿里巴巴内部有数万名数据和算法工程师正在使用DataWorks,承了阿里巴巴 99%的据业务构建。本课程主要介绍了阿里巴巴大数据技术发展历程与 DataWorks 几大模块的基本能力。 课程目标  通过讲师的详细讲解与实际演示,学员可以一边学习一边进行实际操作,可以深入了解DataWorks各大模块的使用方式和具体功能,让学员对DataWorks数据集成、开发、分析、运维、安全、治理等方面有深刻的了解,加深对阿里云大数据产品体系的理解与认识。 适合人群  企业数据仓库开发人员  大数据平台开发人员  数据分析师  大数据运维人员  对于大数据平台、数据中台产品感兴趣的开发者
目录
相关文章
|
1天前
|
分布式计算 DataWorks 图计算
在DataWorks中使用PySpark的GraphX进行图计算
在DataWorks中使用PySpark的GraphX进行图计算
11 5
|
2月前
|
消息中间件 DataWorks NoSQL
dataworks离线数据集成,源库或目标库是MC时,走的是Tunnel? 还是走的是datax啊?
dataworks离线数据集成,源库或目标库是MC时,走的是Tunnel? 还是走的是datax啊?
103 0
|
3月前
|
DataWorks 索引
DataWorks现在离线节点手动执行,好慢的,要等好久,用公共集成资源就那么慢嘛?
DataWorks现在离线节点手动执行,好慢的,要等好久,用公共集成资源就那么慢嘛?
21 1
|
4月前
|
SQL 存储 分布式计算
基于MaxCompute+DataWorks离线同步某电商用户购买记录实践
本次实验使用DataWorks的DDL模式新建数据表,然后将保存在本地的某用户购买记录同步到MaxCompute数仓中,本实验采用的是增量数据同步,每次同步过来的数据会直接存储在MaxCompute中,不会覆盖之前的数据。
|
机器学习/深度学习 存储 人工智能
阿里云ODPS升级为一体化大数据平台,满足用户多元化数据计算需求
为满足用户多元化数据计算需求,阿里云ODPS升级为一体化大数据平台。升级后的ODPS支持大规模批量计算、实时分析等服务,提供实时流式计算、机器学习等多种计算能力,可同时调度超10万台以上服务器规模进行并行计算。从09年开始自研的ODPS 平台也是目前中国应用最为广泛的一体化大数据平台。
阿里云ODPS升级为一体化大数据平台,满足用户多元化数据计算需求
|
分布式计算 DataWorks 大数据
离线同步ODPS中多个分区数据
离线同步ODPS中多个分区数据
离线同步ODPS中多个分区数据
|
SQL 消息中间件 分布式计算
DataWorks公共云优先级和离线同步任务实时同步任务速度
1.资源优先级 2.数据集成离线同步提速 3.数据集成实时同步任务提速 4.相关引擎调优
1117 0
|
存储 SQL 分布式计算
DataWorks_数据开发_EMR Spark节点_计算Pi和对接MaxCompute案例
DataWorks_数据开发_EMR Spark节点 1)计算Pi; 2)对接MaxCompute。
519 0
DataWorks_数据开发_EMR Spark节点_计算Pi和对接MaxCompute案例
|
数据采集 存储 分布式计算
DataWorks数据集成离线增量同步配置讲解
本篇为熟能生巧系列19期的离线增量同步讲解部分,鉴于用户咨询需求,单独成一篇,方便大家阅览
3383 0
DataWorks数据集成离线增量同步配置讲解
|
消息中间件 JSON 分布式计算
阿里云Dataworks RestAPI数据源离线数据同步Quick Start
本文以阿里云MQ API:OnsRegionList 为例演示API数据源的使用。
1334 0
阿里云Dataworks RestAPI数据源离线数据同步Quick Start

相关产品

  • 云原生大数据计算服务 MaxCompute