如有侵权,请联系

MapReduce

概述

  • MapReduce 任务分为两个阶段,map和reduce。每个阶段都以键-值对作为输入,输出,类型由程序员来做选择。需要编写两个函数:map函数和reduce函数。
  • 实现mapreduce 需要三样东西,map函数,reduce函数,和一些用来运行作业的代码。

Map函数

  • 使用java时,map函数可以有Mapper类来表示,Mapper类声明了一个抽象的map()方法。Mapper类型是一个泛型类型,有四个形参类型,分别指定了map函数的输入键,输入值,输出键,输出值的类型。
  • Hadoop本身提供了一套可优化网络序列化传输的基本类型,而不是直接使用Java的内置类型。这些类型位于org.apache.hadoop.io包中。(LongWritable=Long、Text=String、IntWritable=Integer).
  • map()方法的输入是一个 键和一个值,map()方法还提供了Context实例用于输出内容的写入。

Reduce函数

  • reduce函数继承Reducer类,有四个参数用于指定输入和输出类型。
  • reduce函数的输入类型必须与map函数的输出类型相同

Job/Driver

  • Job对象指定作业执行规范,可以用它来控制整个作业的运行。在集群上运行这个作业时,要把代码打成一个jar。不必明确指定jar的文件名,在Job对象的setJarClass()方法中传递一个类即可。Hadoop利用这个类来查找包含它的Jar文件,进而找到相关的JAR文件 。
  • 构造Job对象之后,需要指定输入和输出数据的路径。、通过FileInputFormat 类的静态方法addInputPath() 来定义输入数据的路径。这个路径可以是单个文件一个目录(此时,将这个目录下的所有文件当作输入)或符合特定文件模式的一些列文件。可以通过多次调用addInputPath()方法来实现多路径的输入。 、通过 FileOutputFormat中的静态方法setOutputPah() 指定输出路径(只能由一个输出路径),此目录用于指定reduce函数 的写入目录。在运行前该目录应该不存在,否则hadoop会报错并拒绝运行作业。目的是防止数据丢失。
  • 接着通过setMapperClass() 和setReducerClass()方法指定要用的map类和reduce类。
  • 通过setOutputKeyClass() 和setOutputValueClass()方法控制reduce函数的输出类型,并且必须和Reducer类产生的相匹配。map函数的输出类型默认情况下和reduce函数是相同的,因此如果mapper产生和reducer相同的类型时,不需要单独设置。但是,如果不同,则必须通过通过setOutputKeyClass() 和setOutputValueClass()方法来设置map函数的输出类型。
  • 在设置定义map和reduce函数的类之后,可以开始运行作业。Job中的waitForCompletion()方法提交并等待执行完成。该方法唯一的参数是一个标识,指示是否已生成详细输出。当标识为true(成功时),作业会把其进度写在控制台。