MapReduce开发技巧

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50922796 数据类型...
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50922796

数据类型的选择

自定义数据类型

参考:Hadoop提交作业自定义排序和分组

MapWritable/SortedMapWritable

Hadoop中可传输的Map集合,和Java中的Map用法差不多,但是可以用与mapper和reducer之间的数据传输

Map输出不同类型的Value

使用自定义的数据类型继承自GenericWritable可以实现在mapper中输出多个不同类型的value

//使用这个数据类型将可以输出IntWritable和Text两种类型的value
public class MultiValueWritable extends GenericWritable{
    private static Class[] CLASSES = new Class{
        IntWritable.class,
        Text.class
    }

    public MultiValueWritable(){
    }

    public MultiValueWritable(Writable value){
        set(value);
    }

    protected Class[] getTypes(){
        return CLASSES;
    }
}

mapper中context.write的时候可以使用如下的格式:

context.write(key,new MultiValueWritable(new Text("1")));
context.write(key,new MultiValueWritable(IntWritable Text(1)));

reducer的Values迭代器中可以通过这种方式来判断value是那种数据类型:

Writable value = value.get();
if(value instanceof Text){
    ...
}

选择合适的InputFormat/OutputFormat

基本上每个InputFormat都会有一个对应的OutputFormat

TextInputFormat

默认的输入格式,按行读取,key为每行偏移量,value为行的内容

NLineInputFormat

可以指定一次数据文件多少行的内容:

//设置一次读取50行的内容
NLineInputFormat.setNumLinesPerSplit(job,50);

SequenceFileInputFormat

输入的格式为keylen,key,valuelen,value,适合用于多个job之间的数据连接

DBInputFormat

处理数据库输入,待使用测试

自定义的InputFormat

参考:自定义分片策略解决大量小文件问题

同时处理不同类型的输入

参考:多个Mapper和Reducer处理多个输入

Partitioner的选择

TotalOrderPartitioner

对所有reducer中的结果进行排序,默认情况下每个reducer中的内容都是各自排序互不影响的

自定义partitioner

参考:Hadoop作业中自定义分区和归约

KeyFieldBasedPartitioner

在分区的时候mapper的key部分会参与计算
配合参数

map.output.key.field.separator
num.key.fields.for.partition

指定分隔符和要参与分区的字符索引

例如:key=”name-price”,指定map.output.key.field.separator=”-“,num.key.fields.for.partition=1表示key的price部分参与分区计算

二次排序

setSortComparatorClass

map中每个分区调用进行排序,reduce中shuffle之后再次调用

setGroupingComparatorClass

第二次排序,属于同一组的顺序记录并放入同一个value迭代器

分布式缓存的使用

参考:MapReduce中的DistributedCache

作者:@小黑

相关文章
|
数据采集 分布式计算 搜索推荐
Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结(一)
Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结(一)
|
数据采集 缓存 分布式计算
Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结(二)
Hadoop学习---7、OutputFormat数据输出、MapReduce内核源码解析、Join应用、数据清洗、MapReduce开发总结(二)
|
存储 分布式计算 Java
大数据开发笔记(三):Mapreduce
MapReduce是采用一种分而治之的思想设计出来的分布式计算框架,它由两个阶段组成:map阶段和reduce阶段。
211 0
大数据开发笔记(三):Mapreduce
|
缓存 资源调度 分布式计算
一幅长文细学华为MRS大数据开发(五)—— MapReduce和Yarn
本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce,包括MapReduce的原理、流程、使用场景,以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。
657 0
|
存储 分布式计算 资源调度
MapReduce 原理介绍与开发实战
MapReduce 原理介绍与开发实战
278 0
MapReduce 原理介绍与开发实战