MapReduce 规划 六系列 MultipleOutputs采用

MapReduce 规划 六系列 MultipleOutputs采用

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

在前面的示例,输出文件名是默认:

_logs         part-r-00001  part-r-00003  part-r-00005  part-r-00007  part-r-00009  part-r-00011  part-r-00013  _SUCCESS
part-r-00000  part-r-00002  part-r-00004  part-r-00006  part-r-00008  part-r-00010  part-r-00012  part-r-00014

part-r-0000N

另一个_SUCCESS文件标志job执行成功。

另一个文件夹_logs。

可是实际情况中,我们有时候须要依据情况定制我的输出文件名称。

比方我要依据did的值分组,产生不同的输出文件。全部did出现次数在[0, 2)的都输出到a文件里。在[2, 4)的输出大b文件。其它输出到c文件。

这里涉及到的输出类是MultipleOutputs类。

以下是介绍怎样实现。

首先有一个小优化,为了避免每次执行时输入一长串命令,利用maven exec plugin,參考pom.xml配置例如以下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.freebird</groupId>
  <artifactId>mr1_example2</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>mr1_example2</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-core</artifactId>
      <version>1.2.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.3.2</version>
        <executions>
          <execution>
            <goals>
              <goal>exec</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <executable>hadoop</executable>
          <arguments>
            <argument>jar</argument>
            <argument>target/mr1_example2-1.0-SNAPSHOT.jar</argument>
            <argument>org.freebird.LogJob</argument>
            <argument>/user/chenshu/share/logs</argument>
            <argument>/user/chenshu/share/output12</argument>
          </arguments>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

这样每次mvn clean package之后,执行mvn exec:exec命令就可以。

然后在LogJob.java文件加入几行代码:

package org.freebird;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.freebird.reducer.LogReducer;
import org.freebird.mapper.LogMapper;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;



public class LogJob {                                                                                                                                                                                                
                                                                                                                                                                                                                     
    public static void main(String[] args) throws Exception {                                                                                                                                                        
        System.out.println("args[0]:" + args[0]);                                                                                                                                                                    
        System.out.println("args[1]:" + args[1]);                                                                                                                                                                    
                                                                                                                                                                                                                     
        Configuration conf = new Configuration();                                                                                                                                                                    
        Job job = new Job(conf, "sum_did_from_log_file");                                                                                                                                                            
        job.setJarByClass(LogJob.class);                                                                                                                                                                             
                                                                                                                                                                                                                     
        job.setMapperClass(org.freebird.mapper.LogMapper.class);                                                                                                                                                     
        job.setReducerClass(org.freebird.reducer.LogReducer.class);                                                                                                                                                  
                                                                                                                                                                                                                     
        job.setOutputKeyClass(Text.class);                                                                                                                                                                           
        job.setOutputValueClass(IntWritable.class);                                                                                                                                                                  
                                                                                                                                                                                                                     
        MultipleOutputs.addNamedOutput(job, "a", TextOutputFormat.class, Text.class, IntWritable.class);                                                                                                             
        MultipleOutputs.addNamedOutput(job, "b", TextOutputFormat.class, Text.class, Text.class);                                                                                                                    
        MultipleOutputs.addNamedOutput(job, "c", TextOutputFormat.class, Text.class, Text.class);                                                                                                                    
                                                                                                                                                                                                                     
        FileInputFormat.addInputPath(job, new Path(args[0]));                                                                                                                                                        
        FileOutputFormat.setOutputPath(job, new Path(args[1]));                                                                                                                                                      
                                                                                                                                                                                                                     
        System.exit(job.waitForCompletion(true) ? 0 : 1);                                                                                                                                                            
    }                                                                                                                                                                                                                
}

MultipleOutputs.addNamedOutput 函数被调用了三次,设置了文件名称为a,b和c。最后两个參数各自是output key和output value类型。应该和job.setOutputKeyClass以及job.setOutputValueClass保持一致。

最后改动reducer类的代码:

public class LogReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private IntWritable result = new IntWritable();

    private MultipleOutputs outputs;

    @Override
    public void setup(Context context) throws IOException, InterruptedException {
        System.out.println("enter LogReducer:::setup method");
        outputs = new MultipleOutputs(context);
    }

    @Override
    public void cleanup(Context context) throws IOException, InterruptedException {
        System.out.println("enter LogReducer:::cleanup method");
        outputs.close();
    }

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context) throws IOException, InterruptedException {
        System.out.println("enter LogReducer::reduce method");
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        System.out.println("key: " + key.toString() + " sum: " + sum);                                                                                             
        if ((sum < 2) && (sum >= 0)) {
            outputs.write("a", key, sum);
        } else if (sum < 4) {
            outputs.write("b", key, sum);
        } else {
            outputs.write("c", key, sum);
        }
    }
}

依据同样key(did)sum的结果大小,写入到不同的文件里。执行后观察一下结果:

[chenshu@hadoopMaster output12]$ ls
a-r-00000  a-r-00004  a-r-00008  a-r-00012  b-r-00001  b-r-00005  b-r-00009  b-r-00013  c-r-00002  c-r-00006  c-r-00010  c-r-00014     part-r-00002  part-r-00006  part-r-00010  part-r-00014
a-r-00001  a-r-00005  a-r-00009  a-r-00013  b-r-00002  b-r-00006  b-r-00010  b-r-00014  c-r-00003  c-r-00007  c-r-00011  _logs         part-r-00003  part-r-00007  part-r-00011  _SUCCESS
a-r-00002  a-r-00006  a-r-00010  a-r-00014  b-r-00003  b-r-00007  b-r-00011  c-r-00000  c-r-00004  c-r-00008  c-r-00012  part-r-00000  part-r-00004  part-r-00008  part-r-00012
a-r-00003  a-r-00007  a-r-00011  b-r-00000  b-r-00004  b-r-00008  b-r-00012  c-r-00001  c-r-00005  c-r-00009  c-r-00013  part-r-00001  part-r-00005  part-r-00009  part-r-00013

打开随意的a,b和c开头的文件,查看值果然是如此

5371700bc7b2231db03afeb0        6
5371700cc7b2231db03afec0        7
5371701cc7b2231db03aff8d        6
5371709dc7b2231db03b0136        6
537170a0c7b2231db03b01ac        6
537170a6c7b2231db03b01fc        6
537170a8c7b2231db03b0217        6
537170b3c7b2231db03b0268        6
53719aa9c7b2231db03b0721        6
53719ad0c7b2231db03b0731        4

使用MultipleOutputs依据sum值对设备ID进行分组成功了。

MapReduce仍然会默认生使part….档,不要紧,它们是空文件。

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116998.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 国外网页设计网站推荐_十大国外设计网站

    国外网页设计网站推荐_十大国外设计网站  国内的大学网站都设计得千篇一律,古老的表格式框架布局,直来直去的排版,还有悲剧的是好多大学的网址只能在IE中浏览,其它浏览器里就错乱了。今天这篇文章和大家分享20个国外大学网站设计欣赏,其实大学网站一样可以设计得很艺术,很精美。BiolaUndergradBatesCollegeMiddleburyCollegeWarnerPacificColleg…

  • Map – LinkedHashSet & LinkedHashMap 源码解析「建议收藏」

    Map – LinkedHashSet & LinkedHashMap 源码解析「建议收藏」总体介绍如果你已看过前面关于HashSet和HashMap,以及TreeSet和TreeMap的讲解,一定能够想到本文将要讲解的LinkedHashSet和LinkedHashMap其实也是一回事。LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,前者仅仅是对后者做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。因此本文将重点分析LinkedHashMap。LinkedHashMap实现了Map接口,即允许放入key

    2022年10月12日
  • vim常用命令详解(vim使用教程)

    目录本文解读来自我对manvim的解读vim介绍vim基本操作打开文件options详解vim的五种模式(是我自己定义的五种)正常模式必要命令详解末行模式常用命令详解可视模式常用命令详解本文解读来自我对manvim的解读当然有很多解读不准确的地方,所有红色标注的地方都是最基本的,也是保证正确的。(不排除我的语言描述有问题)vim介绍vim…

  • fftw_fftw3

    fftw_fftw3http://wenku.baidu.com/link?url=3TS6UqnYfVxGpVBfJIIgxjjcXCKuW9NvklxfBLZaIdWJhY0HrpUSKyyuIHsNI2s4F9tSUOhP7pl7n5PLlSFvWqQdr6XvtpejqQenhJHJ9N7

    2022年10月22日
  • PID控制算法仿真_连续控制系统的充分必要条件

    PID控制算法仿真_连续控制系统的充分必要条件引言PID是Proportional(比例)、Integral(积分)、Differential(微分)三者的缩写。PID调节是连续控制系统中技术最成熟、应用最广泛的调节方式。PID调节实质是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。之前在项目中也用到过不少PID的算法,但大多属于一知半解的状态,或者胡乱调节的程度,最近在学习的过程偶然对PI…

  • jsonobject转string数组_json字符串转jsonobject对象

    jsonobject转string数组_json字符串转jsonobject对象首先在maven中添加阿里的fastjson依赖<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.68</version></dependency…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号