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

如何实现一个分布式排序

  •  
  •   SlipStupig 2018-04-21 23:35:18 +08:00 5608 次点击
    这是一个创建于 2802 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设我有 5TB 大小的json数据,需要排序.
    我想实现一个分布式排序, 我想到的是把数据先切割然后按 算数平均 大小分成分若干份,分配到 n 台服务器上,然后合并在一起。

    但问题是在多台服务排序完成后,如何合并能保证 n 台服务器的结果合并, 合并顺序保证有序的呢?

    20 条回复    2018-04-23 11:48:02 +08:00
    verrickt
        1
    verrickt  
       2018-04-21 23:38:44 +08:00 via Android
    归并排序?
    axknightroad
        2
    axknightroad  
       2018-04-21 23:39:00 +08:00
    归并排序了解一下
    WildCat
        3
    WildCat  
       2018-04-21 23:40:19 +08:00 via iPhone
    merge sort
    geelaw
        4
    geelaw  
       2018-04-21 23:41:58 +08:00   1
    看起来这个问题并不是很 trivial,你需要更清楚地描述数据是怎么存起来的。

    比如 5TB 的 JSON 数据是已经切割好的,还是一个单体是 5TB ?后者的话,需要根据数据的情况设计一个 on-the-fly 切割器比较好。

    然后没有理解你说的“切割后按照算术平均分成若干份”,切两次?怎么“按照算术平均数”切分?

    对于这个问题,似乎没有看到什么 speculative 的地方需要用什么特别的切分方式,随便切成好几份就行了。

    最后把有序列表归并一下就好了(归并排序的归并)。不过每台服务器可以根据自身的情况用混合式排序法,比如:每个服务器先尝试归并切分,大小适合 in-memory 排序之后改用快排,但限制深度,超过深度用堆排,并且当切到足够小用插入排序等。当然这是一个比较 trivial 的细节了。
    wweir
        5
    wweir  
       2018-04-21 23:50:45 +08:00 via Android
    我在考虑直接使用任务队列来实现分布式任务分配
    或者找找专门的分布式排序算法
    常规的算法,都是至少需要单机过一次完整的数据
    lsylsy2
        6
    lsylsy2  
       2018-04-21 23:56:22 +08:00
    SlipStupig
        7
    SlipStupig  
    OP
       2018-04-21 23:56:38 +08:00
    @geelaw 非常感谢,5tb 数据在一个文件里面,我说的切割方法是按照文件中的 json 文档(一个文件里面有多个 json )总个数,算数平均是:sum ( json 个数)/服务器数量,我看大家都推荐 merge sort,我还是不知道具体咋操作
    MiffyLiye
        8
    MiffyLiye  
       2018-04-22 00:27:06 +08:00
    搜索 external merge sort,然后 copy & paste。
    vegito2002
        9
    vegito2002  
       2018-04-22 01:13:31 +08:00 via iPad
    随机分配到服务器上, 每个服务器上完成自己的排序, 然后 google k-merge
    sivacohan
        10
    sivacohan  
    PRO
       2018-04-22 01:27:39 +08:00 via iPhone
    map reduce ?
    catror
        11
    catror  
       2018-04-22 02:16:11 +08:00
    上学的时候写过类似的,当时应该是用 OpenMPI 写的,记得 API 挺易用的,可以了解下。
    msg7086
        12
    msg7086  
       2018-04-22 03:03:19 +08:00
    @SlipStupig Merge sort 是算法,你要是自己实现呢,就自己写个程序做,要是自己不会写呢,就找找看有没有现成的包咯。
    swulling
        13
    swulling  
       2018-04-22 03:33:28 +08:00
    别自己造轮子了,一个文件多个 JSON 那就好办的很。直接用 Spark 吧
    billlee
        14
    billlee  
       2018-04-22 04:09:38 +08:00
    terasort
    laxenade
        15
    laxenade  
       2018-04-22 04:29:37 +08:00 via Android
    不要自己瞎造轮子+1 spark, es 什么的先试试
    luban
        16
    luban  
       2018-04-22 05:05:16 +08:00
    我们用 map-reduce 做过,数据量大小 10T 左右,key 的量级 2000 亿,排序好后写入 hbase,供后续查询
    5T 的数据,看 json 大小和 key 的数量,还是很需要计算资源的
    我们当时是 100 台的 Hadoop 集群跑了 3 天左右,集群的单机配置大概是 128G 内存+10 核 20 线程 /20 核 40 线程,当然我们这个还包括了生成 key/value,排序及写入 hbase 的时间,主要耗时还是在排序这块
    swulling
        17
    swulling  
       2018-04-22 10:31:21 +08:00
    @luban 10T 排序 100 台 128g 机器 3 天有点太慢了吧。
    owenliang
        18
    owenliang  
       2018-04-22 11:30:34 +08:00 via Android
    hive 写 sql 了解一下
    param
        19
    param  
       2018-04-23 02:06:44 +08:00 via Android
    首先想到归并排序。。。
    jameslan
        20
    jameslan  
       2018-04-23 11:48:02 +08:00 via Android
    5t 数据还需要排序的场景很少见啊,楼主三思
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     989 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 18:52 PVG 02:52 LAX 10:52 JFK 13:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86