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

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

概念

幂等这个词在软件研发中经常被提到。比如消息发送时不应该同时给同个用户推送多次相同的消息,针对同一笔交易的付款也不应该在重试过程中扣多次钱。曾见过一个案例,有个对于一个单据的确认模块没有考虑到幂等性,导致对应的单据有两条确认记录。其实幂等这个词是个数学的概念,表示这个操作执行多次的结果和执行一次是完全一样的。严格的定义这里不展开讨论,有兴趣的可以到网上搜一下,会有很多介绍。通俗一些说,幂等表示这个操作可以多次重跑,不用担心重跑后到结果会乱掉。就赋值而言,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.JobConf的setOutputOverwrite(boolean isOverwrite)来实现。
如果需要改成幂等的,可以使用前面SQL里提到的,把数据写入特定的分区里来实现。

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

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

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

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

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

  1. 离线计算平台在汽车之家的演进之路

    本次的分享内容分成四个部分: 1.汽车之家离线计算平台现状 2.平台构建过程中遇到的问题 3.基于构建过程中问题的解决方案 4.离线计算平台未来规划 ▌汽车之家离线计算平台现状 1. 汽车之家离线计算 ...

  2. python幂次方计算公式_python中计算三次方怎么表示

    Python中幂运算可以使用**表示,Python中三次方可以表示为x**3,即为x的3次方. **是Python中算术运算符表示幂运算,Python中算术运算符还有加.减.乘.除.取模.取整除. 运 ...

  3. mysql怎么计算幂_在MySQL中计算数字的幂?

    要计算数字的幂,请使用POWER()函数.让我们首先创建一个表-create table DemoTable ( Amount int ); 使用插入命令在表中插入一些记录-insert into D ...

  4. 基于Hadoop的58同城离线计算平台设计与实践

    作者:余意,来自:DataFun 导读:58离线计算平台基于 Hadoop 生态体系打造,单集群4000+台服务器,数百 PB 存储,日40万计算任务,面临挑战极大.58大数据平台的定位主要是服务数据 ...

  5. 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)

    1.背景-流式计算与storm 2011年在海量数据处理领域,Hadoop是人们津津乐道的技术,Hadoop不仅可以用来存储海量数据,还以用来计算海量数据.因为其高吞吐.高可靠等特点,很多互联网公司都 ...

  6. 分布式离线计算—Spark—基础介绍

    原文作者:饥渴的小苹果 原文地址:[Spark]Spark基础教程 目录 Spark特点 Spark相对于Hadoop的优势 Spark生态系统 Spark基本概念 Spark结构设计 Spark各种 ...

  7. 离线计算成本节省的神兵利器

    摘要: 对于创业成长型的企业来说,离线计算已经必不可少了,通过离线计算我们可以生成复杂的业务报表,通过离线计算我们也能精确的算出用户画像.离线计算已经当今的企业中成为了不可或缺的存在.那么使用弹性计算 ...

  8. OPPO大数据离线计算平台架构演进

    1 前言 OPPO的大数据离线计算发展,经历了哪些阶段?在生产中遇到哪些经典的大数据问题?我们是怎么解决的,从中有哪些架构上的升级演进?未来的OPPO离线平台有哪些方向规划?今天会给大家一一揭秘. 2 ...

  9. Python黑马头条推荐系统第一天 架构介绍和离线计算更新Item画像

    Python黑马头条推荐系统项目课程定位.目标 定位 课程是机器学习(包含推荐算法)算法原理在推荐系统的实践 深入推荐系统的业务流场景.工具使用 作为人工智能的数据挖掘(推荐系统)方向应用项目 目标 ...

最新文章

  1. ecshop支付方式含线下自提
  2. TensorFlow实现案例汇集:代码+笔记
  3. python123数字形式转换_【Python系统学习02】数据类型与类型转换
  4. 工作2年后悟出的道理
  5. python列表求平均值_python与统计概率思维
  6. tensorflow 各个版本的 CUDA 以及 Cudnn 版本对应关系
  7. iphone编译警告
  8. 搭建 | 一步成功搭建Centos + Kubernetes 环境
  9. Python3基础12(collections、struct、itertools、chardet等的使用)
  10. 英国莽汉司机认罪:放任特斯拉自动驾驶,自己躺在副驾悠哉悠哉
  11. 5.7和5.6的mysql_mysql5.6与5.7版本的区别
  12. javascript之对象
  13. 416.分割等和子集
  14. VBB Arduino仿真软件的使用
  15. RGB 与 RGBA 与 16进制 与 HSL 之间的简单转换
  16. linux麒麟认证,【麒麟在线讲堂】优麒麟生物特征认证系统-03驱动开发
  17. win10 Kafka环境搭建 + 编译C++(librdkafka) 封装库
  18. python从excel中读取数据 写入word_Java调用python脚本,读取excel表格数据并写入word文档-Go语言中文社区...
  19. Jsckson 实现 java 对象与 JSONObject 和 JSONArray 互转
  20. chrome更新到80以上版本后,带来的跨域请求cookie丢失问题

热门文章

  1. java如何画百分比圆环_canvas绘制百分比圆环进度条
  2. vue获取input的属性_vuejs 中如何优雅的获取 Input 值
  3. clickhouse建库_专访ClickHouse创始人:数据库竞争依旧火热,技术整合势在必行
  4. linux监控电脑配置,Zabbix基本配置及监控主机
  5. java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器
  6. c语言程序综合实习学生成绩,C语言程序设计综合实习报告
  7. python tab和空格混用_Python编程常见十大错误,看完你自己都笑了!
  8. 你愿意隐姓埋名一辈子吗?” #百年百人系列
  9. MIT陈刚教授案件新进展,律师反诉美检察官利用不实信息制造舆情、干扰司法公正...
  10. 简单的解释,让你秒懂“最优化” 问题