DataWorks使用python脚本往maxcompute写数据都是比较慢的吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在DataWorks中使用Python脚本向MaxCompute写入数据的性能问题,主要取决于数据处理方式和代码实现的具体方法。以下从多个角度分析可能导致写入速度较慢的原因,并提供优化建议。
MaxCompute支持两种主要的数据写入方式:write_table()
和 open_writer()
。这两种方式的性能差异较大:
write_table()
每次调用write_table()
时,MaxCompute都会在服务端生成一个文件。这种操作的时间开销较大,且过多的小文件会降低后续查询效率,甚至可能造成服务端内存不足。
优化建议:尽量避免频繁调用write_table()
,而是通过一次性写入多组数据或传入一个Generator对象来减少文件数量。
open_writer()
open_writer()
默认将数据写入到Block中,这种方式比write_table()
更高效,适合批量写入场景。
推荐使用:如果需要高效写入大量数据,优先选择open_writer()
。
PyODPS提供了多种数据处理方式,但不同的处理方式对性能的影响显著:
拉取数据到本地处理(不推荐)
如果使用to_pandas
接口将MaxCompute中的数据下载到本地进行处理,再上传回MaxCompute,这种方式会彻底丧失MaxCompute的大规模并行计算能力。此外,单机内存限制可能导致OOM(Out of Memory)问题,尤其是在处理大规模数据时。
重要提醒:请勿将全量数据下载到本地处理,这不仅低效,还可能违反DataWorks的资源限制。
提交到MaxCompute分布式执行(推荐)
推荐使用PyODPS的分布式DataFrame功能,将主要计算任务提交到MaxCompute集群执行。例如,使用map
或apply
接口对数据进行处理,这些操作最终会被翻译成SQL并在MaxCompute集群中分布式执行,本地几乎没有内存消耗。
优化建议:尽量利用PyODPS的分布式计算能力,避免在客户端节点上进行数据处理。
DataWorks对PyODPS节点的运行环境有严格的资源限制,这可能影响写入性能:
内存限制
PyODPS节点获取本地处理的数据不能超过50 MB,节点运行时占用内存不能超过1 GB。如果超出限制,任务会被系统中止。
优化建议:避免在PyODPS任务中添加额外的Python数据处理代码,尽量将计算逻辑提交到MaxCompute执行。
CPU和内存压力
DataWorks为了防止对Gate Way造成压力,对PyODPS节点的CPU和内存使用都有严格限制。如果发现任务报错Got killed
,表明内存使用超限。
优化建议:尽量避免本地数据操作,通过PyODPS发起的SQL和DataFrame任务(除to_pandas
外)不受此限制。
在DataWorks中配置同步任务时,可以通过调整作业速率上限和并发线程数来优化写入性能:
作业速率上限
在脚本中配置speed
参数,设置是否进行限速以及并发线程数。例如:
"speed": {
"throttle": false,
"concurrent": 1
}
throttle
:设置是否进行限速。concurrent
:设置离线同步任务内,可以从源并行读取或并行写入数据存储端的最大线程数。脏数据检查规则
配置errorLimit
参数,设置脏数据的最大容忍条数。例如:
"errorLimit": {
"record": "1024"
}
优化建议:合理设置脏数据容忍条数,避免因少量脏数据导致任务失败。
Instance Tunnel的开启
DataWorks上默认未开启Instance Tunnel,即instance.open_reader
默认使用Result接口,最多只能获取一万条记录。如果需要获取更多数据,需手动开启Instance Tunnel。
优化建议:通过设置options.tunnel.limit_instance_tunnel = False
关闭Limit限制,确保能够获取全部数据。
第三方依赖包的限制
DataWorks中执行的非自定义函数代码可以使用平台预装的Numpy和Pandas,但不支持其他带有二进制代码的第三方包。
优化建议:尽量使用平台预装的库,避免引入不支持的第三方依赖。
在DataWorks中使用Python脚本向MaxCompute写入数据时,性能问题通常与数据写入方式、数据处理方式、环境限制以及调度配置有关。为提升写入效率,请遵循以下建议:
open_writer()
,避免频繁调用write_table()
。通过以上优化措施,可以显著提升Python脚本向MaxCompute写入数据的效率。
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。