嗨,我有一个从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
1条答案
按热度按时间8hhllhi21#
我也遇到过同样的情况,也提出了解决办法。