zoukankan      html  css  js  c++  java
  • 【Hadoop入门学习系列之五】MapReduce 2.0编程实战

    转载:https://blog.csdn.net/shengmingqijiquan/article/details/52916664

    一.MapReduce2.0编程模型
    关于MR编程模型请参考上一篇:【Hadoop入门学习系列之四】MapReduce 2.0应用场景和原理、基本架构和编程模型

    二.MapReduce2.0编程接口
    三种编程方式
    Java(最原始的方式)
    Java编程接口组成;
    旧API所在java包:org.apache.hadoop.mapred
    新API所在java包 :org.apache.hadoop.mapreduce

    新API具有更好的扩展性;
    两种编程接口只是暴露给用户的形式不同而已,内部执行引擎是一样的;
    旧API可以完全兼容Hadoop 2.0,但新API不行

    从hadoop 1.0.0开始,所有发行版均包含新旧 两类API;

    Hadoop Streaming(支持多语言)
    与Linux管道机制一致
     通过标准输入输出实现进程间通信
     标准输入输出是任何语言都有的
     几个举例:
    cat 1.txt | grep “ dong” | sort
    cat 1.txt | python grep.py | java sort.jar

    Hadoop Pipes(支持C/C++)
    备注: Java编程接口是所有编程方式的基础;不同的编程接口只是暴露给用户的形式不同而已,内部执行引擎是一样的; 不同编程方式效率不同。

    三. MapReduce2.0编程步骤及演示,以WordCount为例【java版】
    1.WordCount问题


    2.Map阶段


    3.Reduce阶段


    4.mapper设计与实现


    5.reducer设计与实现


    6.main函数设计与实现


    7.程序运行
    8.问题整理
    【1】输入数据格式解析
    使用默认的TextInputFormat
    每个Map Task处理一个split;
    一个split大小等于一个block【也可以是多个】;
    如果最后一行数据被截断,则读取后一个block前半部分;
    转换成key/value对, key是偏移量, value是行内容。


    【2】数据流


    【3】输入数据解析
    public interface InputFormat<K, V> {
    InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
    RecordReader<K, V> getRecordReader(InputSplit split,
    JobConf job,
    Reporter reporter) throws IOException;
    }
    1
    2
    3
    4
    5
    6
    默认为TextInputFormat,针对文本文件的;
    用户可通过参数mapred.input.format.class设置 InpuFormat实现
    【4】Mapper—map处理逻辑
    public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable {
    void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter)
    throws IOException;
    }
    1
    2
    3
    4
    新API位于org.apache.hadoop.mapreduce.Mapper中
    【5】Partitioner—map输出结构分片
    org.apache.hadoop.mapred(旧API):
    public interface Partitioner<K2, V2> extends JobConfigurable {
    int getPartition(K2 key, V2 value, int numPartitions);
    }
    org.apache.hadoop.mapreduce(新API):
    public abstract class Partitioner<KEY, VALUE> {
    public abstract int getPartition(KEY key, VALUE value, int numPartitions);
    }


    6.Reducer—reduce处理逻辑
    org.apache.hadoop.mapred(旧API):
    public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable {
    void reduce(K2 key, Iterator<V2> values,
    OutputCollector<K3, V3> output, Reporter reporter)
    throws IOException;
    }
    新API位于org.apache.hadoop.mapreduce.Reducer中
    7.小结


    四.总结
    本篇以经典的例子wordcount来详细介绍MR的编程过程和思想,非常有参考学习价值,自己一定要自己多敲几遍代码代码,熟练掌握其中的代码执行原理,未之后的研究hadoop的源码打好基础。
    ————————————————
    版权声明:本文为CSDN博主「数据圈」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/shengmingqijiquan/article/details/52916664

  • 相关阅读:
    PetaLinux 生成 Zynq 操作系统
    单片机、微控制器和微处理器有什么区别
    嵌入式基础概念系列(1) —— GPIO
    学中杂记
    Spring学习笔记
    jdbc一点小笔记
    JSP学习
    Servlet学习的一些笔记
    接触Struts2的ModelDriven<>接口
    android-dialog的位置
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/12118987.html
Copyright © 2011-2022 走看看