V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sli
V2EX  ›  问与答

百万到亿级数据的快速条件查询

  •  
  •   sli · 2017-07-12 15:16:01 +08:00 · 8187 次点击
    这是一个创建于 2691 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个分析系统, 需要按照日期和一个 index 来查询所有符合条件的 id. 再去重,然后通过 ID 来拿相对的属性.

    现有的架构是用 Hbase 来存储数据, 以date_index 为 rowkey, id 作为 qualifier, 查询直接拿 key 去 get, 简单测试发现取得数据的速度达不到要求. 获取两条数据花费接近两分钟... 实际查询需要获取上百条...

    再之前的做法是以id为 rowkey, date_index 作为 qualifier 然后使用 Hbase 的 ColumnPrefixFilter 来过滤再取所有的 rowkey, 但是查 doc 发现 filter 会做全表扫描... 鉴于数据量每天的增长大概在百万级, 这个性能会随着运行时间越来越差...

    现在的想法是用 ElasticSearch 来做, 直接把属性也索引进去, 求问有没有什么更好的做法...

    20 条回复    2017-07-13 19:22:32 +08:00
    liprais
        1
    liprais  
       2017-07-12 16:01:28 +08:00   ❤️ 1
    为啥不预先算好
    apoclast
        2
    apoclast  
       2017-07-12 16:11:02 +08:00   ❤️ 1
    elasticsearch 可以, 不过亿级略微困难
    sli
        3
    sli  
    OP
       2017-07-12 16:16:26 +08:00
    @liprais 因为查询的这个日期是可选的, 没法预测时间范围...也想过全都提前算好, 把所有可能的时间范围都算一遍...到后期的话, 这个量也是起飞的...
    sli
        4
    sli  
    OP
       2017-07-12 16:19:05 +08:00
    @apoclast 困难是说不太能做到实时么?
    server
        5
    server  
       2017-07-12 16:23:56 +08:00   ❤️ 1
    没有耕坏的地,只有累死的牛,es 还怕这个!!!
    zhmin
        6
    zhmin  
       2017-07-12 18:58:54 +08:00 via iPhone   ❤️ 1
    我觉得是你的 rowkey 没设计好,可以试试用日期和 index 拼接起来,构建 rowkey。亿级的数量,对于 hbase 完全扛得住
    funky
        7
    funky  
       2017-07-12 19:21:56 +08:00   ❤️ 1
    上 OLAP kylin
    rrfeng
        8
    rrfeng  
       2017-07-12 19:42:05 +08:00   ❤️ 1
    两条数据是只 date 范围加 index 联合获取到的 ID 去重之后只有 2 条?
    这个关键在于 index 的区分度啊,不是什么系统能解决的

    另外觉得这个 HBase 比 ES 靠谱。
    rrfeng
        9
    rrfeng  
       2017-07-12 19:42:15 +08:00
    加机器…
    sli
        10
    sli  
    OP
       2017-07-12 20:25:11 +08:00 via iPhone
    @zhmin 现在 rowkey 就是 date 加 index,然后把 id 作为列名,试了下这么取的话,挺慢的...而且 hbase 的 sharding 是按行的,这百万个列全在一个 region,取的时候可能没有真的利用到分布式存储,取连续的行的时候,压力全在一台机子上...
    sli
        11
    sli  
    OP
       2017-07-12 20:26:45 +08:00 via iPhone
    @rrfeng 是按照 date 加 index 这种 rowkey 的方式取了两行,两个一百万列的行,然后取列名去重之后大概还是百万个 ID...
    sli
        12
    sli  
    OP
       2017-07-12 20:27:11 +08:00 via iPhone
    @funky 谢谢,明天我试试
    MasterC
        13
    MasterC  
       2017-07-12 20:29:28 +08:00
    impala
    sli
        14
    sli  
    OP
       2017-07-12 20:30:59 +08:00 via iPhone
    @MasterC 谢谢,我试试
    zhmin
        15
    zhmin  
       2017-07-12 21:51:01 +08:00 via iPhone
    @sli 这个过程是 hbase 查询数据慢,还是去重慢。如果是去重慢,是不是可以加 spark 优化?
    zhmin
        16
    zhmin  
       2017-07-12 21:59:58 +08:00 via iPhone
    @sli 抱歉,问题没看清楚。
    sli
        17
    sli  
    OP
       2017-07-12 22:33:10 +08:00 via iPhone
    @zhmin 是 hbase 取数据慢,spark 可能不太适合这个,hbase 里存的算是对于源数据经过计算之后的中间结果,是在中间结果上做 aggregation 然后展示,要求尽可能实时展示结果...数据量小的话没问题,百万条数据的话 Hbase 就不太能胜任了...
    slixurd
        18
    slixurd  
       2017-07-12 23:47:32 +08:00   ❤️ 1
    ElasticSearch 能做到千万级数据 TP99 几十毫秒的性能
    不过也取决于磁盘速度,最好能上 SSD/内存
    sli
        19
    sli  
    OP
       2017-07-13 03:05:10 +08:00 via iPhone
    @slixurd 谢谢,今儿试试看
    hienchu
        20
    hienchu  
       2017-07-13 19:22:32 +08:00 via iPhone
    如果是对属性做统计的话,es 在亿级别完全没问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2720 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:26 · PVG 20:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.