您的位置:首页 > 运维架构

Hadoop 多输入和多输出研究(如何在Job History中获取相关信息)

2017-05-11 17:39 1326 查看

Hadoop FileInputFormat多输入

使用FileInputFormat来指定多个输入.当我们使用

FileInputFormat.setInputPaths(JobConf conf, Path... inputPaths)
FileInputFormat.addInputPaths(JobConf conf, String commaSeparatedPaths)


来设定有多个输入路径的时候,首先第一点,这多个输入路径都是使用的同一个Mapper来运行。然后配置参数中,key是”mapreduce.input.fileinputformat.inputdir”,不同的输入路径通过”,”来进行分割的多个路径。所以,这种情况下的多输入可以在Job History的已经完成的Job的配置文件里面,来查找”mapreduce.input.fileinputformat.inputdir”的标签对应的值,然后通过”,”来进行分割就可以找到输入。

通过程序代码的测试,下面是我通过FileInputFormat来设置多个输入路径在配置文件中的值。

程序中的部分代码:

FileInputFormat.setInputPaths(job,new Path("/tmp/data1.txt"),new   Path("/tmp/data2.txt"),new Path("/tmp/data3.txt"));
System.out.println(job.getConfiguration().get("mapreduce.input.fileinputformat.inputdir"));


因为是本地文件,所以是file开头,如果是hdfs文件,应该是hdfs开头。下面是输出的结果:

file:/tmp/data1.txt,file:/tmp/data2.txt,file:/tmp/data3.txt


Hadoop MultipleInputs 多输入

上面的那种情况是有很多的输入路径,但是他们都只能使用相同的Mapper来进行相应的逻辑上的处理。使用MultipleInputs可以为每个路径指定不同的InputFormat和Mapper类。

MultipleInputs.addInputPath(Job job, Path path,Class<? extends InputFormat> inputFormatClass)


我们如果在配置文件中进行获取该配置项的话,要使用mapreduce.input.multipleinputs.dir.formats来获取。下面是代码测试。这里是部分代码:

MultipleInputs.addInputPath(job,new Path("/tmp/data1.txt"), TextInputFormat.class,WordMapper.class);
MultipleInputs.addInputPath(job,new Path("/tmp/data2.txt"), TextInputFormat.class,TestMapper.class);
MultipleInputs.addInputPath(job,new Path("/tmp/data3.txt"), TextInputFormat.class,WordMapper.class);
MultipleInputs.addInputPath(job,new Path("/tmp/data4.txt"), TextInputFormat.class,WordMapper.class);
System.out.println(job.getConfiguration().get("mapreduce.input.multipleinputs.dir.formats"));


输出的结果:

/tmp/data1.txt;org.apache.hadoop.mapreduce.lib.input.TextInputFormat,/tmp/data2.txt;org.apache.hadoop.mapreduce.lib.input.TextInputFormat,/tmp/data3.txt;org.apache.hadoop.mapreduce.lib.input.TextInputFormat,/tmp/data4.txt;org.apache.hadoop.mapreduce.lib.input.TextInputFormat


Hadoop MultipleOutputFormat

有时候,我们使用Hadoop处理数据时,在Reduce阶段,我们可能想对每一个输出的key进行单独输出一个目录或文件,这样方便数据分析,比如根据某个时间段对日志文件进行时间段归类等等。这时候我们就可以使用MultipleOutputs类,来搞定这件事.

这里我在指定的输出目录下面,指定了三个文件,hello,world,game三个文件,把一个reducer中的数据,输出到了这三个文件中。



所以,可以通过mapreduce.output.fileoutputformat.outputdir在history server相应的xml中找到其对应的文件夹,进行文件的遍历。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: