美文网首页
2.mapreduce实例

2.mapreduce实例

作者: matthewfly | 来源:发表于2020-12-11 10:49 被阅读0次

1.介绍

存储在hdfs中的文件,分布在集群各节点上,将数据汇总处理显然是不现实的。通过mapreduce,可以将计算移至各节点进行同步计算,然后在汇总结果。通俗讲,就是讲用于处理数据的jar包或其他语言可以执行文件分发至hdfs各DataNode,各DataNode运行jar包,最后汇总数据。

2.过程

mapreduce分为map、shuffle和reduce三个过程。其中map阶段对数据进行提取,分离出关心的数据并进行排序,shuffle阶段按照给定的key分发进行reduce处理,其中key值相同的将分发到相同节点。
比如,要统计url的调用量情况。map中将url从数据集中分离出来,并统计数量,用HashMap存的话,key是url,value就是出现的次数,然后以url为key输出。reduce阶段,相同的url数据都会汇总到同一节点,对接收到的值进行累加就行。流程如下:


mapreduce.png

3.实例

新建java工程读取已有hdfs文件,依赖如下:

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

定义输出类型,只需要统计次数:

@Data
public class UrlWritable implements Writable {
    private int count;

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeInt(count);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        this.count = dataInput.readInt();
    }

    @Override
    public String toString() {
        return count;
    }
}

定义mapper,从数据中获取url,并置次数为1,输出key为url。

public class UrlMapper extends Mapper<LongWritable, Text, Text, UrlWritable> {
    private final Text keyText = new Text();
    private final UrlWritable urlWritable = new UrlWritable();

    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split("\t");
        String url = fields[2];
        this.urlWritable.setCount(1);
        keyText.set(url);
        context.write(keyText, this.urlWritable);
    }
}

reducer汇总次数

public class UrlReducer extends Reducer<Text, UrlWritable, Text, UrlWritable> {
    private final UrlWritable urlWritable = new UrlWritable();

    public void reduce(Text key, Iterable<UrlWritable> values, Context context)
        throws IOException, InterruptedException {
        int count = 0;
        for (UrlWritable val : values) {
            count += val.getCount();
        }
        urlWritable.setCount(count);
        context.write(key, urlWritable);
    }
}

main方法:

public class MainClass {
    public static void main(String[] args) {
        Configuration conf = new Configuration();
        // 任务名称
        Job job = Job.getInstance(conf, "test_job");
        job.setJarByClass(MainClass.class);
        // mapper
        job.setMapperClass(UrlMapper.class);
        // mapper结束后提前对结果进行汇总(这里都是去和,与reducer一致)
        job.setCombinerClass(UrlReducer.class);
        // reducer
        job.setReducerClass(UrlReducer.class);
        // 输出文件类型,文本文件
        job.setOutputKeyClass(Text.class);
        // 输出对象
        job.setOutputValueClass(UrlWritable.class);
        // 输入文件类型,根据hdfs文件类型确定
        job.setInputFormatClass(SequenceFileInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        // hdfs中输出路径
        FileOutputFormat.setOutputPath(job, new Path("/flume/test/output"));
        // hdfs中输出入路径,可以有多个
        FileInputFormat.addInputPath(job, new Path("/flume/test/logs"));
        jobs.add(job);
        job.waitForCompletion(true)
    }
}

打包工程生产jar包,test.jar。在hadoop上提交jar包:

/data0/apps/hadoop-3.2.1/bin/hadoop jar test.jar test.com.MainClass

注:若工程中依赖了本地jar包,比如需要发送邮件的mail.jar,那么需要使用fatjar。配置里面添加:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
    </build>

生产的target目录下,使用origin jar包。

相关文章

  • 2.mapreduce实例

    1.介绍 存储在hdfs中的文件,分布在集群各节点上,将数据汇总处理显然是不现实的。通过mapreduce,可以将...

  • Hadoop大数据平台架构与实践-基础篇

    一、Hadoop两大核心组成 1.HDFS 分布式文件系统:存储2.MapReduce: 并行计算 二、HDFS基...

  • SQL C语言基本操作

    相关API 打开 实例 关闭 实例 获取错误消息 操作表 实例创建 实例插入 实例修改 实例删除 实例回调查询 非回调

  • Python-数据类型及其操作方法

    数字类型 代码实例: 字符串类型 代码实例: 列表 代码实例: 元组 代码实例 字典: 代码实例 集合 代码实例:

  • HTML基础-03

    HTML 标题 实例 HTML 段落 实例 HTML 链接 实例 HTML 图像 实例

  • Python 类属性、实例属性、类方法、实例方法

    1、实例属性 实例属性,就是赋给由类创建的实例的属性,实例属性属于它所属的实例,不同实例之间的实例属性可以不同。 ...

  • STL算法之常用拷贝和替换

    copy API 实例 replace API 实例 replace_if API 实例 swap API 实例

  • Vue 基础

    Vue 实例 1. Vue实例 2. 实例属性 3. 实例方法/数据 4. 实例方法/事件 5. 实例方法/生命周...

  • 类中的方法

    1.实例方法的调用方式 实例对象.实例方法() 类对象.实例方法(实例对象) 例如: class Student ...

  • C语言100例

    C 练习实例01C 练习实例02C 练习实例03C 练习实例04C 练习实例05C 练习实例06 C 练习实例07...

网友评论

      本文标题:2.mapreduce实例

      本文链接:https://www.haomeiwen.com/subject/qgafgktx.html