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

如何实现一个分布式排序

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

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

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

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

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

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

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

    最后把有序列表归并一下就好了(归并排序的归并)。不过每台服务器可以根据自身的情况用混合式排序法,比如:每个服务器先尝试归并切分,大小适合 in-memory 排序之后改用快排,但限制深度,超过深度用堆排,并且当切到足够小用插入排序等。当然这是一个比较 trivial 的细节了。
        5
    wweir   2018-04-21 23:50:45 +08:00 via Android
    我在考虑直接使用任务队列来实现分布式任务分配
    或者找找专门的分布式排序算法
    常规的算法,都是至少需要单机过一次完整的数据
        6
    lsylsy2   2018-04-21 23:56:22 +08:00
        7
    SlipStupig   2018-04-21 23:56:38 +08:00
    @geelaw 非常感谢,5tb 数据在一个文件里面,我说的切割方法是按照文件中的 json 文档(一个文件里面有多个 json )总个数,算数平均是:sum ( json 个数)/服务器数量,我看大家都推荐 merge sort,我还是不知道具体咋操作
        8
    MiffyLiye   2018-04-22 00:27:06 +08:00
    搜索 external merge sort,然后 copy & paste。
        9
    vegito2002   364 天前 via iPad
    随机分配到服务器上, 每个服务器上完成自己的排序, 然后 google k-merge
        10
    sivacohan   364 天前 via iPhone
    map reduce ?
        11
    catror   364 天前
    上学的时候写过类似的,当时应该是用 OpenMPI 写的,记得 API 挺易用的,可以了解下。
        12
    msg7086   364 天前
    @SlipStupig Merge sort 是算法,你要是自己实现呢,就自己写个程序做,要是自己不会写呢,就找找看有没有现成的包咯。
        13
    swulling   364 天前
    别自己造轮子了,一个文件多个 JSON 那就好办的很。直接用 Spark 吧
        14
    billlee   364 天前
    terasort
        15
    laxenade   364 天前 via Android
    不要自己瞎造轮子+1 spark, es 什么的先试试
        16
    luban   364 天前
    我们用 map-reduce 做过,数据量大小 10T 左右,key 的量级 2000 亿,排序好后写入 hbase,供后续查询
    5T 的数据,看 json 大小和 key 的数量,还是很需要计算资源的
    我们当时是 100 台的 Hadoop 集群跑了 3 天左右,集群的单机配置大概是 128G 内存+10 核 20 线程 /20 核 40 线程,当然我们这个还包括了生成 key/value,排序及写入 hbase 的时间,主要耗时还是在排序这块
        17
    swulling   364 天前
    @luban 10T 排序 100 台 128g 机器 3 天有点太慢了吧。
        18
    owenliang   364 天前 via Android
    hive 写 sql 了解一下
        19
    param   363 天前 via Android
    首先想到归并排序。。。
        20
    jameslan   363 天前 via Android
    5t 数据还需要排序的场景很少见啊,楼主三思
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1297 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 17:05 · PVG 01:05 · LAX 10:05 · JFK 13:05
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1