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

如何实现一个分布式排序

  •  
  •   SlipStupig · Apr 21, 2018 · 6002 views
  •   You need to sign in to view this topic
    This topic created in 3022 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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