【问题标题】:Hadoop Custom Input format with the new API使用新 API 的 Hadoop 自定义输入格式
【发布时间】:2012-02-13 10:05:54
【问题描述】:

我是 Hadoop 的新手,遇到以下问题。我要做的是将数据库的一个分片(请不要问我为什么需要这样做等)映射到映射器,然后对这些数据进行某些操作,将结果输出到减速器并使用该输出再次使用相同的分片格式对相同的数据执行第二阶段映射/缩减作业。 Hadoop 不提供任何输入方法来发送数据库的分片。您只能使用LineInputFormatLineRecordReader 逐行发送。 NLineInputFormat 在这种情况下也无济于事。我需要扩展FileInputFormatRecordReader 类来编写我自己的InputFormat。有人建议我使用LineRecordReader,因为底层代码已经处理了FileSplits 以及与拆分文件相关的所有问题。 我现在需要做的就是重写 nextKeyValue() 方法,我不知道该怎么做。

       for(int i=0;i<shard_size;i++){
               if(lineRecordReader.nextKeyValue()){
lineValue.append(lineRecordReader.getCurrentValue().getBytes(),0,lineRecordReader.getCurrentValue().getLength());
  }
}

上面的代码sn-p是写出来的,但不知何故不能正常工作。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    我建议在您的输入文件中放入连接字符串和其他一些指示可以在哪里找到分片。
    Mapper 将获取此信息,连接到数据库并完成工作。我不建议将结果集转换为 hadoop 的可写类 - 这会影响性能。
    我认为要解决的问题是对这个相对较小的输入进行足够的拆分。 您可以简单地创建足够的小文件,每个文件都有几个分片引用,或者您可以调整输入格式以构建小拆分。第二种方式会更灵活。

    【讨论】:

    • 我做的,是这样的
    【解决方案2】:

    我所做的就是这样。我编写了自己的记录阅读器,一次读取 n 行并将它们作为输入发送给映射器

    public boolean nextKeyValue() throws IOException, 
    

    中断异常{

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            if (!lineRecordReader.nextKeyValue()) {
                return false;
            }
            lineKey = lineRecordReader.getCurrentKey();
            lineValue = lineRecordReader.getCurrentValue();
            sb.append(lineValue.toString());
            sb.append(eol);
        }
        lineValue.set(sb.toString());
        //System.out.println(lineValue.toString());
    
        return true;
    
        // throw new UnsupportedOperationException("Not supported yet.");
    } 
    

    你是怎么瘦的

    【讨论】:

    • 这里并非一切都清楚,但是当您决定拆分时,看起来您必须拆分 inputFormat 中的小部分。在将整个大数据块馈送到 RecordReader 之后 - 您别无选择,只能将其提供给您的映射器。
    • @DavidGruzman,它的作用是读取 5 行(5 可以更改为任意数字)并将其发送到映射器。 mapper 接受这 5 行输入,对其进行某些操作,产生几个具有不同键和值的输出,然后将它们发送到 reducer。输入的拆分方式由 linRecordReader 对象封装。
    • 让我这样说更清楚。在经典的 WordCount 应用程序中,它们所做的是将文件中的每一行读入映射器。 mapper 只是输出,(word, one),reducers 然后聚合这些值,对吗?向每个映射器发送一个文件(不仅仅是一行),然后在映射器内逐行读取,随后输出(单词,一个)不是更好吗?然后使用组合器聚合中间值(因为会有很多重复的单词)并将结果发送到化简器。那会更快,因为它不需要太多的映射器实例,我们可以利用 cmb
    • @DavidGruzman,当然,如果您的集群数量有限而不是数千个,那么上述内容当然是正确的。如果您有数以亿计的节点要使用,您可能希望尽可能多地传播您的数据。但是,就我而言,我将使用最多 10 个左右的节点作为 hadoop 集群
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多