limit hadoop中multipleoutput中mapper的no没有reducer

vh0rcniy  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(412)

嗨,我有一个从hbase读取记录并写入文本文件的应用程序hbase表有200个区域。我在mapper类中使用multipleoutputs写入多个文件,并从传入的记录中生成文件名。
我正在制作40个独特的文件名。我能够正确地获取记录,但我的问题是,当mapreduce完成时,它会创建40个文件,以及2k个附加了m-000等名称的文件。
这是因为我有200个区域,每个Map器有200个Map器,每个Map器有40个唯一的文件,所以它创建了40*200个文件。
我不知道如何避免这种情况没有自定义分区。
是否有任何方法可以强制将记录写入所属的文件,而不是拆分为多个文件。
我使用了自定义分区器类,它工作正常,但我不想使用它,因为我只是从hbase读取,而不是做reducer操作。此外,如果任何额外的文件名,我必须创建,然后我必须改变我的代码也。
这是我的Map代码

public class DefaultMapper extends TableMapper<NullWritable, Text> {
        private Text text = new Text();
        MultipleOutputs<NullWritable, Text> multipleOutputs;
        String strName = "";

        @Override()
        public void setup(Context context) throws java.io.IOException, java.lang.InterruptedException {
            multipleOutputs = new MultipleOutputs<NullWritable, Text>(context);
        }
String FILE_NAME = new String(value.getValue(Bytes.toBytes(HbaseBulkLoadMapperConstants.COLUMN_FAMILY),Bytes.toBytes(HbaseBulkLoadMapperConstants.FILE_NAME)));

        multipleOutputs.write(NullWritable.get(), new Text(text.toString()),FILE_NAME);
        //context.write(NullWritable.get(), text);
    }

无减速器等级
理想情况下,我的输出就是这样的 Japan.BUS.gz 应该创建文件。其他文件也是非常小的文件

Japan.BUS-m-00193.gz
Japan.BUS-m-00194.gz
Japan.BUS-m-00195.gz
Japan.BUS-m-00196.gz
8hhllhi2

8hhllhi21#

我也遇到过同样的情况,也提出了解决办法。

MultipleOutputs multipleOutputs = null;

String keyToFind = new String();

    public void setup(Context context) throws IOException, InterruptedException
    {
        this.multipleOutputs_normal = new MultipleOutputs<KEYOUT, VALUEOUT>(context);
    }

public void map(NullWritable key , Text values, Context context) throws IOException, InterruptedException
{

   String valToFindInCol[] = values.toString.split(",");/**Lets say comma seperated**/

    if (keyToFind .equals(valToFindInCol[2].toString())|| keyToFind == null) /**Say you need to match 2 position element**/
    {
        this.multipleOutputs.write(NullWritable.get(),<valToWrite>, valToFindInCol[2]);
    } 
    else 
    {
        this.multipleOutputs.close();
        this.multipleOutputs = null;
        this.multipleOutputs = new MultipleOutputs<KEYOUT, VALUEOUT>(context);

        this.multipleOutputs.write(NullWritable.get(),<valToWrite>, valToFindInCol[2]);

    }

    keyToFind=valToFindInCol[2];
}

相关问题