大数据计算MaxCompute这种情况有没有解决或者规避的办法?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在MaxCompute中,针对大数据计算任务的性能优化和问题规避,通常需要从数据倾斜、资源调优、SQL语法限制以及数据类型处理等多个方面入手。以下是针对您提到的问题的具体解决或规避方法:
数据倾斜是大数据计算中的常见问题,可能导致某些任务节点运行时间过长甚至失败。以下是针对不同场景的解决方案:
倍数表取模相等Join
使用一个倍数表(如number
列)将热点值记录放大N倍,从而减少数据倾斜。例如:
SELECT eleme_uid, ...
FROM (
SELECT eleme_uid, ... FROM <viewtable>
) t1
LEFT JOIN (
SELECT /*+mapjoin(<multipletable>)*/ eleme_uid, number ...
FROM <customertable> JOIN <multipletable>
) t2
ON t1.eleme_uid = t2.eleme_uid AND mod(t1.<value_col>, 10) + 1 = t2.number;
注意:此方法会导致数据膨胀N倍,需权衡性能与资源消耗。
热点值单独处理
针对热点值记录新增eleme_uid_join
列,通过随机分配正整数的方式分散热点值,非热点值保持不变。例如:
CASE
WHEN eleme_uid IN (<热点值列表>) THEN CONCAT(eleme_uid, '_', FLOOR(RAND() * 1000))
ELSE eleme_uid
END AS eleme_uid_join
在Join时使用eleme_uid_join
列进行关联,既能减少倾斜,又能避免无效膨胀。
odps.sql.groupby.skewindata=true;
,让系统自动处理倾斜数据。odps.sql.reshuffle.dynamicpt=false;
,避免引入额外的Reduce阶段,从而提升性能。SET odps.sql.mapper.split.size=128;
INSERT OVERWRITE TABLE data_demo3 PARTITION(ds, hh)
SELECT * FROM dwd_alsc_ent_shop_info_hi;
spark.driver.memory
参数值,建议与spark.driver.cores
保持1:4
的比例。如果仍出现OutOfMemoryError
,可进一步增加spark.driver.memoryOverhead
参数。spark.executor.instances
参数来分散负载。spark.hadoop.odps.cupid.disk.driver.device_size
参数,默认值为20 GB,可根据需求适当增大。LEFT OUTER JOIN
替代。例如:
SELECT a.*
FROM a
LEFT OUTER JOIN (SELECT DISTINCT ds FROM b) bb
ON a.ds = bb.ds
WHERE bb.ds IS NULL;
ORDER BY
必须与LIMIT
一起使用。如果需要放开限制,可在Session级别设置odps.sql.validate.orderby.limit=false;
。由于DOUBLE类型存在精度差,建议通过以下方式比较两个数值是否相等:
ABS(value1 - value2) < threshold
其中threshold
为足够小的值(如1e-6
)。
在Session级别执行以下命令打开2.0数据类型开关:
SET odps.sql.decimal.odps2=true;
同时建议调小DECIMAL类型的长度,避免数据溢出。
MaxCompute表中单字段最大长度为8 MB。对于超大字段,建议拆分为多个字段存储,并根据业务特性设计拆分逻辑。
通过DataFrame写表时,如果报错lifecycle is not specified in mandatory mode
,需在代码中设置生命周期:
from odps import options
options.lifecycle = 7 # 单位为天
如果写入时提示Perhaps the datastream from server is crushed
,请检查数据列数是否与目标表一致。
如果PyODPS脚本任务不定时出现连接失败,可通过以下方式解决: - 增加超时时间:
from odps import options
options.connect_timeout = 30
以上方法涵盖了MaxCompute中常见的性能优化和问题规避策略,您可以根据具体场景选择合适的解决方案。
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。