• 请不要在回答技术问题时复制粘贴 AI 生成的内容
elepant
V2EX  ›  程序员

大数据量 join 操作

  •  
  •   elepant · Jan 9, 2019 · 5297 views
    This topic created in 2681 days ago, the information mentioned may be changed or developed.
    • 一个数据文件记录数在 100 万左右,记作 a ;
    • 另一个数据文件记录数在 40 万左右,记作 b。

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

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

    Supplement 1  ·  Jan 14, 2019

    于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 replies    2019-01-10 10:57:45 +08:00
    zbinlin
        1
    zbinlin  
       Jan 9, 2019
    试试 PostgreSQL
    surfire91
        2
    surfire91  
       Jan 9, 2019   ❤️ 1
    就这么点数据,索引加好了不得起飞?
    hilbertz
        3
    hilbertz  
       Jan 9, 2019
    怎么可能性能吃紧,你跑在树莓派上吗
    elepant
        4
    elepant  
    OP
       Jan 9, 2019
    @hilbertz a 表有 70+字段,b 表有 30+字段,join 的结果需要包含 a 表所有字段,然后将 join 结果写入文本文件
    elepant
        5
    elepant  
    OP
       Jan 9, 2019
    @surfire91 跟索引优化有关?
    elepant
        6
    elepant  
    OP
       Jan 9, 2019
    @zbinlin 这个 join 性能很好?
    lanterboy
        7
    lanterboy  
       Jan 9, 2019
    先弄清楚 性能吃紧的瓶颈在业务代码还是数据库
    TKKONE
        8
    TKKONE  
    PRO
       Jan 9, 2019 via Android
    这点数据都性能紧张的话,还搭建 hive 不是更紧张?
    elepant
        9
    elepant  
    OP
       Jan 9, 2019 via Android
    @lanterboy 是的,明天确认下是数据库问题还是文件 IO 问题,生产环境 a 表在千万级别
    elepant
        10
    elepant  
    OP
       Jan 9, 2019 via Android
    @surfire91 索引是已经加了的,跑完大概在 5 分钟左右
    glacer
        11
    glacer  
       Jan 9, 2019
    楼主的性能吃紧在 IO,每次都返回 100w 行 100+字段的数据,这能不慢吗
    surfire91
        12
    surfire91  
       Jan 9, 2019
    @Asan 跑完是指什么跑完,只查了库,还干了别的吗?如果查库就占了近 5 分钟,那查询还是有问题的,100 个字段要说多也不多,主要还是看字段类型长度,两个表总共占了多少空间?机器什么配置?多大内存?
    magicsilence
        13
    magicsilence  
       Jan 9, 2019
    千万 A 表和四十万 B 表全 load 到 hive, 一个 hql 就能搞定。

    sparksql 和 hbase 都不用。

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