V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
elepant
V2EX  ›  程序员

大数据量 join 操作

  •  
  •   elepant · 2019 年 1 月 9 日 · 5135 次点击
    这是一个创建于 2574 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 一个数据文件记录数在 100 万左右,记作 a ;
    • 另一个数据文件记录数在 40 万左右,记作 b。

    a 和 b 通过字段 C 是有关联的,现在要把 a left join b,把 a 中的某些字段的值从 b 中补充过来。目前的做法是两个文件的数据分别建表入 MySQL,然后 join 操作,但是性能吃紧。想问下懂大数据的 v 友,使用大数据技术有没有更好的解决方案。

    目前自己调研是使用 Hbase Hive SparkSQL 去搞,但是自己之前没有搞过大数据不知道这个调研结果是否可以

    第 1 条附言  ·  2019 年 1 月 14 日

    于2019-01-11解决,性能问题出现在如下地方:

    1. 数据文件a入库太耗时,debug发现Mybatis解析SQL耗时太久;
    2. 表a left join b查询时,全部查询出96万条数据,jvm直接OOM。

    解决方法:

    • 数据文件a入库使用JdbcTemplate的batchUpdate方法,每5000条数据进行一次批量插入,减少Mybatis解析SQL耗时,同时JDBC url 加上参数:useServerPrepStmts=false&rewriteBatchedStatements=true&useCompression=true;优化后该过程耗时为原来的1/3,控制在2min内,业务可接受;
    • 表a left join b查询,也使用分批查询的方式,减少单次查询对象创建数量,并同时将查询结果写入文本文件(业务需要),整个过程由原来的程序挂起甚至OOM变为控制在2min内业务可接受的时间范围;
    • 并没有用什么大数据技术 [手动摊手]
    25 条回复    2019-01-10 10:57:45 +08:00
    zbinlin
        1
    zbinlin  
       2019 年 1 月 9 日
    试试 PostgreSQL
    surfire91
        2
    surfire91  
       2019 年 1 月 9 日   ❤️ 1
    就这么点数据,索引加好了不得起飞?
    hilbertz
        3
    hilbertz  
       2019 年 1 月 9 日
    怎么可能性能吃紧,你跑在树莓派上吗
    elepant
        4
    elepant  
    OP
       2019 年 1 月 9 日
    @hilbertz a 表有 70+字段,b 表有 30+字段,join 的结果需要包含 a 表所有字段,然后将 join 结果写入文本文件
    elepant
        5
    elepant  
    OP
       2019 年 1 月 9 日
    @surfire91 跟索引优化有关?
    elepant
        6
    elepant  
    OP
       2019 年 1 月 9 日
    @zbinlin 这个 join 性能很好?
    lanterboy
        7
    lanterboy  
       2019 年 1 月 9 日
    先弄清楚 性能吃紧的瓶颈在业务代码还是数据库
    TKKONE
        8
    TKKONE  
    PRO
       2019 年 1 月 9 日 via Android
    这点数据都性能紧张的话,还搭建 hive 不是更紧张?
    elepant
        9
    elepant  
    OP
       2019 年 1 月 9 日 via Android
    @lanterboy 是的,明天确认下是数据库问题还是文件 IO 问题,生产环境 a 表在千万级别
    elepant
        10
    elepant  
    OP
       2019 年 1 月 9 日 via Android
    @surfire91 索引是已经加了的,跑完大概在 5 分钟左右
    glacer
        11
    glacer  
       2019 年 1 月 9 日
    楼主的性能吃紧在 IO,每次都返回 100w 行 100+字段的数据,这能不慢吗
    surfire91
        12
    surfire91  
       2019 年 1 月 9 日
    @Asan 跑完是指什么跑完,只查了库,还干了别的吗?如果查库就占了近 5 分钟,那查询还是有问题的,100 个字段要说多也不多,主要还是看字段类型长度,两个表总共占了多少空间?机器什么配置?多大内存?
    magicsilence
        13
    magicsilence  
       2019 年 1 月 9 日
    千万 A 表和四十万 B 表全 load 到 hive, 一个 hql 就能搞定。

    sparksql 和 hbase 都不用。

    另:hive 可以 on spark
    sss007
        14
    sss007  
       2019 年 1 月 9 日
    建个视图试试
    Mac
        15
    Mac  
       2019 年 1 月 9 日 via Android
    很明显 io 的瓶颈,每次都全量输出不慢才怪呢
    sunnyadamm
        16
    sunnyadamm  
       2019 年 1 月 9 日
    io 问题,量不大,
    zhchyu999
        17
    zhchyu999  
       2019 年 1 月 9 日
    SQLServer 也能很轻松的搞定,这点量远远不到大数据;
    试试优化下你的业务逻辑或者查询逻辑,是否真的需要这么多数据全量 join,能否先缩小一下范围
    尽量少的引入外部组件,业务扔不掉,后期维护真的很难
    F281M6Dh8DXpD1g2
        18
    F281M6Dh8DXpD1g2  
       2019 年 1 月 9 日 via iPad
    Spark sql 就行了,要不了多久
    laqow
        19
    laqow  
       2019 年 1 月 9 日 via Android
    没有后续查找需要的话是不是只把 B 放数据库,然后逐个 A 行用 C 关键字查询 B 把结果放回 A 就可以了?
    50infivedays
        20
    50infivedays  
       2019 年 1 月 9 日
    这个量确实比较小
    loading
        21
    loading  
       2019 年 1 月 9 日 via Android
    先试下分页,每次都全量,io 吧。
    zeraba
        22
    zeraba  
       2019 年 1 月 9 日 via Android
    C 字段两个表都加好索引 类型和表的字符集保持一致,这点数据不算啥大数据
    31p7410
        23
    31p7410  
       2019 年 1 月 9 日
    这个数据量太小了,hive 就能搞定
    crazypig14
        24
    crazypig14  
       2019 年 1 月 10 日
    这点数据量 mysql 确定不行? explain 过 sql 了么?
    SmiteChow
        25
    SmiteChow  
       2019 年 1 月 10 日
    数据量不大 索引建好了 不费事
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:37 · PVG 08:37 · LAX 16:37 · JFK 19:37
    ♥ Do have faith in what you're doing.