开发者社区 > 大数据与机器学习 > 实时数仓 Hologres > 正文

Hologres报错什么原因?

Hologres报错什么原因?ERROR: Total memory used by all existing queries exceeded memory limitation.

展开
收起
真的很搞笑 2023-10-31 19:02:10 140 0
1 条回答
写回答
取消 提交回答
  • 报错原因:数据量太大或者导入逻辑太复杂,导致超出了内存限制。 (说明:实例由多个节点组成,一个节点标准的内存上限是64G,节点内存会分为3部分,1/3计算,1/3缓存,1/3元数据。这里的报错是计算内存超了)
    解决方案:
    查询场景:
    1、先对表执行一下analyze tablename;
    2、对于复杂sql,先进行优化。
    例如:● 1、将经常join的key设置为distribution_key。
    ● 2、count distinc多的sql可以换成 APPROX_COUNT_DISTINCT这个函数(原理:count distinct相当于在join了,多个就多个在join,耗费资源比较多。)写入场景:
    排查步骤1:当导入query包含查询,但部分table没有analyze,或者analyze过,但数据又有更新导致不准确,导致查询优化器决策join order有误,会引起内存开销多高。
    解决方法:对所有参与的内表、外表执行analyze tablename,更新表的统计元信息,可以帮助查询优化器生成更优的执行计划;
    排查步骤2:当表的列数较多,单行数据量较大时,单次读取的数据量会更大,通过在sql前加以下参数来控制单词读取数据行数,可以有效减少OOM情况
    set hg_experimental_query_batch_size = 1024;--默认为8192
    insert into holo_table select from mc_table;
    排查步骤3:降低导入的并发度,也会有效减少导入过程中的内存开销,并发度通过参数hg_experimental_foreign_table_executor_max_dop控制,默认为实例的Core数,可以在导入时设置更小的dop参数,降低导入的内存使用。
    set hg_experimental_foreign_table_executor_max_dop = 8;
    insert into holo_table select
    from mc_table;
    排查步骤4:以上操作都做完了,还是导入不了,如果使用的是insert on conflict,排查是否外表重复数据太多,重复数据太多也会导致导入性能不好,可以现在是odps做一下去重,再导入。
    排查步骤5:可以升级至1.1.24版本,新版本会对内存进行动态调整,后台会实时刷新当前内存水位,若是有空闲,则会分配更多内存给计算使用。
    排查步骤6:以上步骤都做完了,需要扩容了!,此回答整理自钉群“实时数仓Hologres交流群”

    2023-11-01 08:58:57
    赞同 展开评论 打赏

本技术圈将为大家分析有关阿里云产品Hologres的最新产品动态、技术解读等,也欢迎大家加入钉钉群--实时数仓Hologres交流群32314975

相关产品

  • 实时数仓 Hologres
  • 相关电子书

    更多
    实时数仓Workshop(广州站)- 李佳林 立即下载
    阿里云实时数仓Hologres技术揭秘2.0 立即下载
    实时数仓Hologres技术实战一本通2.0版(下) 立即下载