【问题标题】:Could hadoop let mapper send partial data to reducer, and output the remaining data to HDFS directly?hadoop能否让mapper将部分数据发送到reducer,将剩余数据直接输出到HDFS?
【发布时间】:2014-05-22 22:11:20
【问题描述】:

正如标题所说,我有一个关于map-reduce的任务设计:

经过思考,我认为只需要将部分数据(可能是10%的数据)发送到reducer,剩下的数据就直接输出到HDFS。然后最后,我只是将这两个来自 mapper 和 reducer 的输出文件结合起来(我必须得到一个关于这个总数据的统一文件或目录)。我认为这样做可以降低此任务运行的带宽成本。

那么我的想法可以实现吗? (我知道如何直接从mapper输出到HDFS,但这需要mapper既输出到HDFS又发送数据到reducer)

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    一种解决方案是对 90% 的文件使用 MultipleOutputs's write() method,而对于剩余的 10%,您可以使用映射器中的普通 context.write(),这样,它们就只会进入减速器。

    MultipOutputs 中的这个函数可以使用 -

    void write(K key, V value, String baseOutputPath);
    

    第二种解决方案是直接使用FileSystem(来自 Hadoop Api)让 Mapper 将 90% 的文件输出到 HDFS。但是我不知道如果你运行很多映射器会有多高效。上面的 MultipleOutput 也是如此 -

    类似:

    在 mapper 的 setup() 函数中执行此操作 -

    FileSystem fs = file.getFileSystem(context.getConfiguration());
    FSDataOutputStream fileOut = fs.create(new Path("your_hdfs_filename"));
    

    map() 函数中执行此操作 -

    create() 函数会返回一个 FSDataOutputStream 对象。使用 write() 函数写入文件。

    完成后在 cleanup() 函数中关闭 FileSystem 对象。 像 - fs.close();

    【讨论】:

    • 如果我使用 MultipleOuputs,我希望 90% 的数据输出到 HDFS 是 key-> type1 value-> type2,而 10% 的数据进入 reduce,有 key -> type3 value- >类型3。那么我可以用不同的键值类型来实现吗? @JtheRocker
    • @JoJo,是的,这也是可能的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多