Hadoop实践(三)---MapReduce相关编程笔记

29 篇文章 6 订阅
23 篇文章 0 订阅

1、Keys是WritableComparable类对象 values是writable实例

在编写map和reduce函数时,避免每一项输出分配一个新对象,这一过程常在for或者foreach循环中完成,这样会创建数千甚至上百万个writable实例,这些实例的生命周期极短,会造成Java垃圾回收器工作加大。

错误例子:

    public void mymap extend Mapper<>{
        for(String word : words){
            output.collect(new Text(word),new Intwtitable(1));
        }
    }

2、MapReduceV1 和MapReduceV2的区别

        ResourceManager代替集群管理器,
        ApplicationMaster代替一个专用且短暂的JobTracker,
        NodeManager代替TaskTracker。

3、YARN配置支持SPARK

在Hadoop 2.0的yarn-site.xml中可增加spark_shuffle,配置如下:

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark-shuffle</value>
</property>

4、Combiner

当使用Combiner时,需要遵循其规定的限制条件。这就需要修改Mapper、Combiner和Reducer输出的键和值的类。

Combiner规定有关键的约束条件是:

  • Combiner输入和输出的键和值类必须和相应Mapper输出的键和值类一致

使用Combiner并不会自动提高性能,在合适的地方使用Combiner才可以提升效率。运行Combiner也会造成额外的开销,如果随意使用Combiner,很可能因为额外的开销造成程序效率低下。

5、Partitioner

  • Partitioner类,其用于决定将键分配到哪个Reducer(在Reducer中键已被排序)
  • job.setPartitionerClass(),用于保证键传输到合适的Reducer中,并按键进行排序

对Reducer数量的设置:

  • job.setNumReducer(12)进行硬编码
  • -D mapred.reduce.task=12 使用参数设置(新版API使用mapreduce.job.reduces)

  1. Partitioner类在org.apache.hadoop.mapreduce.Partitioner定义的,该类用于分配Reducer之间的键。

  2. Partitioner类的一个实例与Mapper的实例在同一个JVM上执行。

  3. 在Mapper实例中每次调用context.write()的时候都会调用Partitioner类的getPartition方法,int getPartition(K key, V value, int NumReducrTasks)返回的是Reducer的索引值。

  4. 当Partitioner没有自定义的时候,Hadoop框架会使用一个默认的Partitioner,即org.apache.hadoop.mapreduce.lib.partition.HashPartitioner

HashPartitioner调用hashCode()方法处理键实例,且执行模运算(即对NumReduceTasks取模)。对于每个Reducer,在Partitioner分离键后,Reducer才会按键排序。每个Reducer都排序,但是Reducer之间并没有按键排序,使用的公式:(key.hashcode()&Integer.MAX_VALUE)%NumReduceTasks)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值