【问题标题】:Shuffle large data file(s) in mapreduce在 mapreduce 中随机播放大数据文件
【发布时间】:2014-07-22 04:08:46
【问题描述】:

假设我有一个数十亿行的文件,大小为 500G 到 1T。如何生成具有相同行的新文件,但随机打乱行?如果可以的话,洗牌应该是完全随机的。

【问题讨论】:

    标签: java algorithm mapreduce


    【解决方案1】:

    创建一个映射器,将GUID 映射到您的线路。以下 Hadoop 映射器说明了逻辑:

    public class ShuffleMapper extends Mapper<LongWritable, Text, Text, Text> {
      @Override
      protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        context.write(new Text(UUID.randomUUID().toString()), value);
      }
    }
    

    在 reducer 中,您只需收集行(值)。这可以使用单个 reducer 来完成,或者如果您遇到资源问题(例如,本地磁盘已满),您可以拆分多个 reducer,然后在命令行中只使用 concat 行。

    注意:这并不一定会像 Fisher-Yates 那样提供公正的洗牌,但这种解决方案更易于实施且速度相当快。

    【讨论】:

    • 聪明。我会在这篇关于随机抽样的文章中添加一个链接。它可以用来做洗牌:had00b.blogspot.com/2013/07/random-subset-in-mapreduce.html
    • 一个问题:reducer的个数对随机性有影响吗?
    • @JackLei 它不应该,至少没有影响到我的想法。对随机性的唯一影响应该是由 UUID 算法引起的,所以看看它有多“随机”(它可能是时间相关的,因此同时运行的映射器可能会导致相同的序列——尽管这也不太可能发生)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多