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

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

点此查看原文:http://click.aliyun.com/m/42758/异步

概念分布式

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

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

离线计算与幂等日志

离线计算里的一个做业常常是很是重的,跑一个做业要较多时间。并且因为其特性,常常是凌晨开始计算,在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来保证能够重试。rem

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.JobConf的setOutputOverwrite(boolean isOverwrite)来实现。
若是须要改为幂等的,可使用前面SQL里提到的,把数据写入特定的分区里来实现。

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

数据导入的场景要实现幂等性比较容易。只须要设置导入的MaxCompute表的清洗规则为“写入前清理已有数据Insert Overwr”便可。这样数据在导入的过程当中会先清空数据后再导入,从而实现幂等。

图片描述

数据导出的场景,若是数据是全量导出的,也能够用相似数据导入的方法,配置“导入前准备语句”,把原来的数据所有删除后从新导入。另外若是数据源支持主键冲突设置时,能够经过“主键冲突”设置成“Replace Into”来实现数据的替换。

图片描述

从上面的截图里能够看到,目前Dataworks自己就支持设置“出错重试”,若是同步做业知足幂等性要求的,能够大胆开启这个设置,从而下降运维成本提升稳定性。

扫码获取更多资讯:
图片描述

相关文章
相关标签/搜索