public void map(Object key,Text value,Context context) throws IOException,InterruptedException{...}
map()方法里面有三个参数,Object key,Text value就是输入的key和value,第三个参数Context context可以记录输入的key和value,此外context还会记录map运算的状态。
2.Reducer里面的reduce()方法
pubilic void reduce(Text key,Iterable<IntWritable>values,Context context) throws IOException,InterruptedException{...}
reduce()函数的输入也是一个key/value的形式,不过它的value是一个迭代器的形式Iterable<IntWritable>values,也就是说reduce中的values是一个key对应一组的值得value。
3.main()函数
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration()
String[] otherArgs =
new GenericOptionsParser(conf, args).getRemainingArgs()
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in><out>")
System.exit(2)
}
Job job = new Job(conf, "word count")//构建一个job
job.setJarByClass(WordCount.class)
job.setMapperClass(TokenizerMapper.class)
job.setCombinerClass(IntSumReducer.class)
job.setReducerClass(IntSumReducer.class)
job.setOutputKeyClass(Text.class)
job.setOutputValueClass(IntWritable.class)
FileInputFormat.addInputPath(job, new Path(otherArgs[0]))
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]))
System.exit(job.waitForCompletion(true) ? 0 : 1)
}
(1)Configuration conf=new Configuration()//初始化
运行mapreduce程序前都要初始化Configuration,该类主要是读取mapreduce系统配置信息,这些信息包括hdfs还有mapreduce,兄扮州也就是安装hadoop时候的配置文件例如:core-site.xml、hdfs-site.xml和mapred-site.xml等等文件里的信息。
程序员开发mapreduce时候只是在填空,在map函数和reduce函数里编写实际进行的业务逻辑,其它的工作羡蔽都是交给mapreduce框架自己 *** 作的,但是至少我们要告诉它怎么 *** 作啊,比如hdfs在哪里啊,mapreduce的jobstracker在哪里啊,而这些信息就在conf包下的配置文件里。
(2) Job job = new Job(conf, "word count")
在mapreduce框架里一个mapreduce任务也叫mapreduce作业也叫做一个mapreduce的job。
具体的map和reduce运算就是task了缺氏,这里我们构建一个job,构建时候有两个参数,一个是conf,一个是这个job的名称。
(3) job.setOutputKeyClass(Text.class)
job.setOutputValueClass(IntWritable.class)
定义输出的key/value的类型,也就是最终存储在hdfs上结果文件的key/value的类型。
(4)
FileInputFormat.addInputPath(job, new Path(otherArgs[0]))
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]))
System.exit(job.waitForCompletion(true) ? 0 : 1)
第一行就是构建输入的数据文件
第二行是构建输出的数据文件
最后一行是如果job运行成功了,程序就正常退出。
FileInputFormat和FileOutputFormat可以设置输入输出文件路径,
mapreduce计算时候:
输入文件必须存在,不然mapreduce任务直接退出。
输出一般是一个文件夹,而且该文件夹不能存在。
1.输入:输入数据分为键/值对,由集群中的每个节点处理。2.映射函数:使用输入数据中的每个键/值对来调用用户定义的映射函数,以生成一组中间键/值对简饥芹。3.Shuffle:将中间的键/值对分组,并将其发送到正确的节点。4.Reduce函数:将同一个键的中间值赋给reduce函数并聚合它们。5.输出:将最终的键/值对发送到输出文件。1)输入数据接口:InputFormat。默认的实现类是:TextInputFormat。TextInputFormat的功能逻辑是:一次读取一行文本,然后以该行的起始偏移量为键,将行内容作为值返回。CombineTextInputFormat可以将多个小文件合并成一个切片,提高处理效率。(2)逻辑处理接口:映射器用户根据业务肢码需求实现三种方法:map() setup() cleanup()。(3)划分器划分HashPartitioner有一个默认实现,逻辑是根据key和numReduces的哈希值返回一个分区号;key.hashCode()&Integer。最大值% numReduces如果业务上有特殊需求,可以定制分区。(4)厘米平行排序当我们使用自定义对象作为输出的键时,必须实现WritableComparable接口,并在其中重写compareTo()方法。部分排序:每个最终输出文件的内部排序。全排序:对所有数据进行排序,通常只减少一次。二次排序:排序有两个条件。(5)合并者合并合并器合并可以提高程序执行的效率,减少IO传输。但使用时不得影响原业务处理结果。(6)逻辑处理接口:减速器用户根据业务需求实现三种方法:reduce() setup() cleanup()。(7)输出数据接口:OutputFormat默认的实现类是TextOutputFormat,功拦毕能逻辑是:为每个KV对输出一行到目标文本文件。用户还可以自定义输出格式。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)