MapReduce 学习1

MapReduce概述
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.

MapReduce合并了两种经典函数:

映射(Mapping)对集合里的每个目标应用同一个操作。即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping。

如:[1,2]  ==> [1X2,2X2] ==> [2,4]

化简(Reducing )遍历集合中的元素来返回一个综合的结果。即,输出表单里一列数字的和这个任务属于reducing。

Mapreduce原理图:

数据源为:k1,v1

客户的需求为k2,v2

一个block块对应多个split,一个split对应一个map任务,一个reduce任务会生成一个part-00000文件则一个reduce输出一个文件

执行的过程:

map任务的阶段:

1.1:读取文件,解释成为key,value键值对,每一行的字节偏移量会作为key, 每一行的文本内容会作为value.每一键值对调用都会执行一次(hadoop系统)

1.2:自定义的Mapper函数,k1,v1为输入值,进行编写自己的逻辑,完成后输出k2,v2(自己手写)

public static class WorldCountMapper extends
        Mapper<LongWritable, Text, Text, LongWritable> {
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException  {
            String[] worlds = value.toString().split(",");
            for(String world :worlds){
                context.write(new Text(world), new LongWritable(1));
            }

        }
    }

1.3:对输出的key、value进行分区。(hadoop系统)

1.4对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。(hadoop系统)
1.5分组后的数据进行归约

reduce任务阶段:

2.1对多个map函数的输出,按照不同的分区,通过网络把数据copy到同一个reduce节点上(hadoop系统)

2.2自定义的reduce函数,k2,v2为输入值,进行编写自己的逻辑,完成后输出k3,v3(自己手写)

     public static class WorldCountReduce extends
        Reducer<Text, LongWritable, Text, LongWritable>{

        protected void reduce(Text k2, Iterable<LongWritable> v2s,
                Context context)
                throws IOException, InterruptedException {
            // TODO Auto-generated method stub
            long sum =0 ;
            for(LongWritable v2:v2s){
                sum += v2.get();
            }
            context.write(k2, new LongWritable(sum));
        }

    }    

2.3 把reduce的输出保存到文件中。

驱动代码:

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();    //加载配置文件
    Job job = new Job(conf);    //创建一个job,供JobTracker使用
    job.setJarByClass(WordCountApp.class);

    job.setMapperClass(WorldCountMapper.class);
    job.setReducerClass(WorldCountReduce.class);

    FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.1.10:9000/input"));//hadoop2.x能够读取文件夹与文件
    //如果想读取子文件夹则需要设置属性
    FileInputFormat.setInputDirRecursive(job, true);
    FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.1.10:9000/output"));

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);

    job.waitForCompletion(true);
}
时间: 2024-10-10 00:26:15

MapReduce 学习1的相关文章

mapreduce学习总结(一)

1. mapper任务一般执行 输入格式解析.投影(选择相关的字段).过滤(过滤掉无关记录). reducer任务一般 2. 对于map任务和ruduce任务,tasktracker有固定数量的任务槽. 3. 分片(split)的大小一般就是文件块大小.map任务的数量取决于文件大小和块大小,不用刻意去设置. 4. 每个分区(partitioner)对应一个reduce任务,所以partition数目等于作业reducer的个数,输出文件由分区号命名,如:part-00000,part-0000

MongoDB MapReduce学习笔记

MapReduce应该算是MongoDB操作中比较复杂的了,自己开始理解的时候还是动了动脑子的,所以记录在此! 命令语法:详细看 db.runCommand( { mapreduce : 字符串,集合名, map : 函数,见下文 reduce : 函数,见下文 [, query : 文档,发往map函数前先给过渡文档] [, sort : 文档,发往map函数前先给文档排序] [, limit : 整数,发往map函数的文档数量上限] [, out : 字符串,统计结果保存的集合] [, ke

MapReduce 学习3-------读取输入文件

1. map任务处理1.1 读取输入文件内容,解析成key.value对.对输入文件的每一行,解析成key.value对.每一个键值对调用一次map函数.wcjob.setInputFormatClass(TextInputFormat.class); InputFormat接口提供了两个方法来实现MapReduce数据源的输入 1.1.1 把输入文件切分成一个一个InputSplit,然后每一个InputSplit分配给一个独立的mapper任务进行处理,InputSplit就是包含输入文件的

MapReduce学习笔记

mapreduce是一种编程模式,用于大规模数据的并行运算.“Map”,“Reduce”是它们的主要思想.用户用Map(映射)函数把一组键值对映射成另一组键值对,指定并发的Reduce(归纳)函数,来保证所有映射的键值对中的每一个共享共同的键组. 工作原理: 如上图: 右图是论文里给出的流程图.一切都是从最上方的user program开始的,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数.图中执行的顺序都用数字标记了. 1.MapReduce库先

hadoop-矩阵相乘法(MapReduce学习)

列行相乘法:参见高度可伸缩的稀疏矩阵乘法_吴志川.pdf package org.bigdata508.util; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; im

hadoop-hdfs、mapreduce学习随笔

HDFS: 1.分布式文件系统:管理网络中跨多台计算机存储的文件系统 2.hadoop定义了一个抽象文件系统概念,具体就是一个java抽象类:org.apache.hadoop.fs.FileSystm,只要某个文件系统实现了该接口,就可以作为hadoop支持的文件系统 3.数据块: hdfs中默认存储是64M的数据块,如果一个文件小于64M,并不占用整个数据块 hadoop dfsadmin -report查看HDFS的基本统计信息 感觉讲解不错的文章链接: http://www.cnblog

MapReduce学习小节v1.1

1.  MapReduce的几个特点: 易编程,良好的扩展性,高容错性 适合海量数据的离线处理 2.  应用场景: 简单的数据统计.搜索引擎建索引.海量数据查找.复杂数据分析算法实现 3. MapReduce的主要几个过程 Input->splitting->mapping->shuffling->reducing->output 4.  map阶段:由一定数量的Map Task组成,而 Map Task通常包括input,splitting,mapping及shufflin

MapReduce 学习6 ---- hadoop2提交到Yarn: Mapreduce执行过程分析

hadoop2提交到Yarn: JOB提交过程 http://www.aboutyun.com/forum.php?mod=viewthread&tid=9366&highlight=hadoop2%CC%E1%BD%BB%B5%BDYarn hadoop2提交到Yarn: Map执行过程 http://www.aboutyun.com/forum.php?mod=viewthread&tid=9370&highlight=hadoop2%CC%E1%BD%BB%B5%BD

MapReduce 学习4 ---- 自定义分区、自定义排序、自定义组分

1. map任务处理 1.3 对输出的key.value进行分区. 分区的目的指的是把相同分类的<k,v>交给同一个reducer任务处理. public static class MyPartitioner<Text, LongWritable> extends Partitioner<Text, LongWritable>{ static HashMap<String,Integer> map = null; static{ map = new Hash