[
http://issues.apache.org/jira/browse/HADOOP-372?page=comments#action_12430683 ]
Michel Tourn commented on HADOOP-372:
-------------------------------------
Support for "all-pairs" joins is a far-reaching requirement that I don't touch
here.
But I agree with Doug's last comment:
>In other words, if you're going to define custom mappers anyway,
>then it's no more work to define custom Input formats.
Moreover, unless I am missing something, the current APIs already nicely
address the requirement in the JIRA issue title.
JobConf.addInputPath(Path dir)
JobConf.setInputFormat(Class theClass)
InputFormat {
FileSplit[] getSplits(FileSystem, JobConf, preferredNumSplits)
RecordReader getRecordReader(FileSystem fs, FileSplit split,
JobConf job, Reporter reporter)
...
}
Given this current API the flow looks like this:
During Task execution ( InputFormat.getRecordReader() ):
taks's FileSplit + job's single InputFormat -> Path context -> inputDirectory
context --> dispatched "sub" InputFormat --> getRecordReader --> RecordReader
instance.
During JobTracker splits computation ( InputFormat.getSplits() ):
job's single InputFormat + job's list of input directories --> list of input
dirs/files --> list of sub-InputFormat-s --> dispatch and "aggregate" the
results from your sub-InputFormat-s .getSplits()
This is enough to implement the special case discussed in the HADOOP-372 title:
InputDirectory --> InputFormat
A framework class or the examples or the Wiki FAQ could demonstrate how one can
write such a *generic* dispatching class:
class DispatchInputFormat(InputFormat[], JobConf) implements InputFormat
It is generic but not universal.
different applications will need to use different information to make the
InputFormat dispatch / aggregation decisions.
Now three ways to customize this DispatchInputFormat.
1./3. Writing zero java code:
replace:
>job.addInputPath("foo", FooInput.class);
with:
job.set("DispatchInputFormat.inputdirmap", "foo=org.example.FooInput
bar=org.example.BarInput")
If you want client-side type checking for the classnames, do it in a helper
method.
For example:
static void DispatchInputFormat.addDir(
JobConf, Path dir, Class<InputFormat> clazz)
Call:
DispatchInputFormat.add(job, new Path("foo"), FooInput.class);
DispatchInputFormat.add(job, new Path("bar"), BarInput.class);
Where Class<InputFormat> uses Generics to enforce at compile-time that FooInput
implements InputFormat.
2./3. code reuse without copy-paste
A few well-placed hooks could allow users to reuse and customize the
DispatchInputFormat code without duplicating it:
class MyInputFormat extends DispatchInputFormat {
//override
protected InputFormat inputDirToFormat(Path inputDir) {
...
}
}
3./3. code reuse with copy-paste
And for more complex requirements that do not fit well with inputDirToFormat():
one would instead use DispatchInputFormat as a starting point, a source code
example.
> should allow to specify different inputformat classes for different input
> dirs for Map/Reduce jobs
> --------------------------------------------------------------------------------------------------
>
> Key: HADOOP-372
> URL: http://issues.apache.org/jira/browse/HADOOP-372
> Project: Hadoop
> Issue Type: New Feature
> Components: mapred
> Affects Versions: 0.4.0
> Environment: all
> Reporter: Runping Qi
> Assigned To: Owen O'Malley
>
> Right now, the user can specify multiple input directories for a map reduce
> job.
> However, the files under all the directories are assumed to be in the same
> format,
> with the same key/value classes. This proves to be a serious limit in many
> situations.
> Here is an example. Suppose I have three simple tables:
> one has URLs and their rank values (page ranks),
> another has URLs and their classification values,
> and the third one has the URL meta data such as crawl status, last crawl
> time, etc.
> Suppose now I need a job to generate a list of URLs to be crawled next.
> The decision depends on the info in all the three tables.
> Right now, there is no easy way to accomplish this.
> However, this job can be done if the framework allows to specify different
> inputformats for different input dirs.
> Suppose my three tables are in the following directory respectively:
> rankTable, classificationTable. and metaDataTable.
> If we extend JobConf class with the following method (as Owen suggested to
> me):
> addInputPath(aPath, anInputFormatClass, anInputKeyClass,
> anInputValueClass)
> Then I can specify my job as follows:
> addInputPath(rankTable, SequenceFileInputFormat.class, UTF8.class,
> DoubleWritable.class)
> addInputPath(classificationTable, TextInputFormat.class, UTF8,class,
> UTF8.class)
> addInputPath(metaDataTable, SequenceFileInputFormat.class, UTF8.class,
> MyRecord.class)
> If an input directory is added through the current API, it will have the same
> meaning as it is now.
> Thus this extension will not affect any applications that do not need this
> new feature.
> It is relatively easy for the M/R framework to create an appropriate record
> reader for a map task based on the above information.
> And that is the only change needed for supporting this extension.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira