前话
接上一篇中在没有OpenApi的情况下写批量实例作业的情景:Pyodps批量处理作业_二两窝子面的博客-CSDN博客
后来在实际使用时进行了许多优化,可以直接使用instance.get_logview_address()得到每一个并行实例的logview地址,通过地址即可查看该实例的运行日志。但需要注意的是,该logview地址默认的是域名是http://logview.odps.aliyun.com,如果是专有云则需要替换成自己的域名。
问题
开始使用批量实例的脚本后出现了一个显著的问题,就是在上下游两个批量作业间存在着依赖与运维难以同时得到保障的情况。在上游作业中,因为使用了并行提交实例的方法,因此作业本身并不会报错,所以为了能保障运维,加入了实例状态追踪与主动抛错的方式。但是上游批量作业报错会直接卡住整个下游批量作业,但实际上上下游两个批量作业中的各个实例是一对一的依赖关系,因为上游作业中一个实例报错而卡住下游所有应该生成的实例是不合理的。但是如果上游不把错误实例抛出又会导致运维无法保障。
解决方法
为解决上述问题,率先想到了用一个实体的报错表去记录上游错误实例(如果以表为操作对象,那么记录表名就可以了),并且去掉上游作业的主动抛错。在下游作业时先读取该报错表,遍询地对不在该报错表中的对象进行实例生成(排除报错上游实例的表名),最后再主动报错抛出这个报错表的信息(如果报错表不为空),即上游作业的错误信息由下游作业抛出。
按上述方式,可以维系上下游依赖关系并保障并发实例的独立性,同时依然可以对报错信息进行抛出从而保障运维。
上下文
那么是否一定要使用中间的实体表呢,这时突然想起了ODPS有上下文参数输出的功能,那么实际上可以用一个列表容器记录下报错的实例,然后通过上下文将列表以参数形式直接传给下游节点去使用就可以了。这样就不必创建、清空、写入和读取一张实体表了。
上下文参数的使用在官方文档里已经详细描述了,这里不赘述,可以直接参照:
配置节点上下文 - 数据开发(DataStudio)| 阿里云
py脚本用print输出参数、shell用echo、sql则通过select。
注意
这里有个非常重要的点,就是上游输出参数的节点必须是赋值节点!
(本人使用的是专有云,目前使用数据开发里的节点进行参数输出是无效的,而必须使用控制里的赋值节点,不知道是否和标准版一致)