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中找到其对应的文件夹,进行文件的遍历。
相关文章推荐
- 如何写安全的Java Web应用之输入校验(一):不要在输出中包含Debug信息
- 运行hadoop程序,如何在map中获取输入数据的全路径(fullpath)
- vc++调用exe时,如何获取exe的输出信息
- 如何获取android的相关信息,以及安装路径等信息的获取等
- Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中
- 如何获取CPU的相关信息 包括CPU编号、版本、产品名称、制造商
- 如何获取display device 的相关信息,例如分辨率。(EnumDisplaySettings)
- win32调试工具原理OutputDebugString以及如何获取输出信息
- 如何获取请求行的相关信息
- vc++调用exe时,如何获取exe的输出信息(输出显示在IDE的输出中)
- 如何获取Windows命令行参数信息(和Linux中的ps -ef的输出相似)
- vc++调用exe时,如何获取exe的输出信息
- 如何获取任务栏(taskbar)相关信息
- 如何获取文件夹下各子文件夹名,同时将这些信息输出到文本文件中呢?求赐教!
- 在被调用方法中如何获取调用方的相关信息
- 如何从SQL Server备份文件中获取数据库相关信息?
- 如何获取系统的应用程序的相关信息
- 如何获取系统的应用程序的相关信息
- 如何获取网卡相关信息(包括mac, ip, mask, gateway等)?---利用GetAdaptersInfo
- 如何获取display device 的相关信息,例如分辨率。(EnumDisplaySettings)