如何将不同的数据集传递给同一作业的两个不同Map器

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

我有一个Map器,比如singlegroupidentifiermapper.java
现在,这是一个通用Map器,它基于使用缓存从驱动程序类传递给它的属性文件(包含过滤器和键值字段索引),对Map器输入值/记录的一行执行所有过滤。
只有reducer业务逻辑是不同的,它的实现保持了Map器逻辑的通用性,并使用上面提到的propertyfile来实现。
现在我的问题是我有多个来源的输入,有不同的格式。那意味着我必须做一些事情

MultipleInputs.addInputPath(conf, new Path("/inputA"),TextInputFormat.class, SingleGroupIdentifierMapper.class);
MultipleInputs.addInputPath(conf, new Path("/inputB"),TextInputFormat.class, SingleGroupIdentifierMapper.class);

但是我从驱动程序类传递到Map器以实现基于字段索引的过滤器的缓存属性文件是公共的,所以我如何将两个不同的属性文件传递到同一Map器,如果它处理,比如说输入a,那么它将使用propertyfilea(过滤并创建键值对),如果它处理,如果输入b,那么它将使用propertyfileb(过滤并创建键值对)。
可以更改Map器的泛型代码来处理此场景,但是如何在泛型类中处理此问题,以及如何在同一Map器类中标识输入是否来自inputa/inputb,并相应地对数据应用propertyfile配置。
我们是否可以将参数传递给这个Map器类的构造函数,以指定它来自inputb,或者它需要读取缓存中的哪个属性文件。?
例如:
multipleinputs.addinputpath(conf,new path(“/inputb”),textinputformat.class,args[],singlegroupidentifiermapper.class);
其中args[]被传递给singlegroupidentifiermapper类的构造函数,我们定义该构造函数作为输入并将其设置为属性。
任何想法或专业知识都是最受欢迎的。
希望我能清楚地表达我的问题,如果需要更清楚的问题,请问我。
提前谢谢,干杯:)

iaqfqrcu

iaqfqrcu1#

不幸的是,多输入不是那么灵活。但是有一种解决方法,可以将inputsplit路径与Map器的setup方法中的属性文件相匹配。如果不使用任何类型的combine格式,则单个Map程序将处理单个文件中的单个拆分:
将属性文件添加到缓存时,请使用/propfile#1#props#u a和/propfile#u 2#props#u b
将输入路径添加到job.getconfiguration().set(“props\u a”,“/inputa”)和job.getconfiguration().set(“props\u b”,“/inputb”)中
在mapper.setup(context context)方法中,使用context.getinputsplit().tostring()获取分割的路径。然后将其与context.getconfiguration().get(“props\u a”)或props\u b中保存的路径匹配
如果您使用的是某种combine
格式,则需要对其进行扩展,重写使用jobcontext中的信息来构建pathfilter[]的getsplits,并调用createpool,这将创建包含来自同一组(inputa或inputb)的文件的拆分。

相关问题