V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fdgdbr
V2EX  ›  程序员

一个 spark 计算任务需要对两张大表做 join 操作,有什么解决方案么

  •  
  •   fdgdbr · 2020-05-21 18:12:56 +08:00 · 2931 次点击
    这是一个创建于 1407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说计算 sql 是 select * from table_a left join table_b on a.id=b.id
    其中 table_a 和 table_b 的数据量都很大,几亿到几十亿的数量。直接把上面的 sql 扔给 spark 算的话,架构师跟我说内存会爆,即使用集群也会爆,那有什么解决方案吗
    7 条回复    2020-05-22 14:03:18 +08:00
    enrio
        1
    enrio  
       2020-05-21 18:46:22 +08:00
    可以先将数据集进行切分,比如第一次只要"a"开头的 id,第二次只要"b"开头的,以此类推。你可以有各种各样的方法将数据缩小到一个集群能负担的量级。
    再一个使用 id 作为 key,将数据分到各个结点上去,这样 Shuffle 也不严重,数据都是在节点内部进行 join 。
    对 Spark SQL 不算太了解,不知道它内部会如何进行转化。
    levelworm
        2
    levelworm  
       2020-05-21 21:18:02 +08:00 via Android
    我琢磨着把大的那张表拆分然后一点点和另外一张 join 可以吗?
    bsidb
        3
    bsidb  
       2020-05-22 08:41:15 +08:00
    Spark 2.x 系列中 Spark SQL 的内部实现已经挺优化的,数据量特别大的情况下,如果内存不够会自动利用磁盘。如果数据量特别大,可以在程序中设置 SparkConf 的 spark.sql.shuffle.partitions 选项,将 partition 数量设置调高(默认是 200 ),这样每个 partition 的数据量就比较小,不会撑爆内存。
    SmiteChow
        4
    SmiteChow  
       2020-05-22 10:50:57 +08:00
    驱动表优化
    SmiteChow
        5
    SmiteChow  
       2020-05-22 10:57:02 +08:00
    如果没有优化的条件就自己手动创造,例如按照时间手动分批 join,用时间换空间
    MarsBar
        6
    MarsBar  
       2020-05-22 11:07:13 +08:00
    首先你 ab 两个表有多少字段 每个字段大概有多大
    你的 join 结果需要全部的字段(*)吗 还是只需要一些
    这些都会影响到你最后的性能

    如同 @bsidb 所说 spark2.x 现在都优化过了 只要不是 cartesian join 正常的集群应该都是能 handle 的住的
    sonice
        7
    sonice  
       2020-05-22 14:03:18 +08:00
    不带时间窗口的吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1179 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:19 · PVG 02:19 · LAX 11:19 · JFK 14:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.