mapreduce编程初级实践_MapReduce编程实践-基于
IDEAMaven实现单词统计分析
在开始MapReduce编程之前,需要做好如下准备⼯作。
(1)搭建好单机版本或者伪分布式Hadoop环境;
CentOS 7 单机安装最新版Hadoop v3.1.2以及配置和简单测试
Hadoop v3.1.2 伪分布式安装(Pseudo-Distributed Operation)
(2)在HDFS中创建好input⽂件夹,并上传⽂本⽂件到HDFS中的input⽂件夹中;
创建input⽂件夹
bin/hadoop fs -mkdir input
上传本地input⽂件夹中⽂件到HDFS中的input⽂件夹中
bin/hadoop fs -put input/*.txt input
查看HDFS ⽬录(-R 是ls命令的递归选项)
bin/hadoop fs -ls -R
如果output ⽬录已经存在,则删除output ⽂件夹(重新运⾏应⽤时,也需要⾸先将HDFS中的output⽂件夹删除,然后在运⾏) bin/hadoop fs -rm -r output
再次查看HDFS⽬录
bin/hadoop fs -ls -R
(3)删除output ⽂件夹,MapReduce应⽤运⾏时会将结果存放在该⽬录中;
编写MapReduce应⽤,主要包括如下⼏个步骤:
(1)编写Map处理逻辑;
maven打包本地jar包
(2)编写Reduce处理逻辑;
(3)编写main ⽅法;
(4)编译打包代码,以及运⾏应⽤程序
⼀,编写Map处理逻辑
⾸先,通过IDEA创建⼀个Maven项⽬,并添加对hadoop-client的引⽤。
添加对hadoop-client jar包的引⽤:
<dependency>
<groupId>org.apache.hadoopgroupId> <artifactId>hadoop-clientartifactId>
<version>3.1.2version>
dependency>
通过继承Mapper类来实现Map处理逻辑。
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.StringTokenizer;
public class TokenizerMapper extends Mapper {
private static final IntWritable one = new IntWritable(1);
private Text word = new Text();
public TokenizerMapper() {
}
@Override
public void map(Object key, Text value, Mapper.Context context)
throws IOException, InterruptedException {
StringTokenizer itr = new String());
while(itr.hasMoreTokens()) {
this.word.Token());
context.write(this.word, one);
}
}
}
Map过程需要继承org.apache.hadoop.mapreduce包中 Mapper 类,并重写其map⽅法。
public class TokenizerMapper extends Mapper
其中的模板参数:第⼀个Object表⽰输⼊key的类型;第⼆个Text表⽰输⼊value的类型;第三个Text表⽰表⽰输出键的类型;第四个IntWritable表⽰输出值的类型。
作为map⽅法输⼊的键值对,其value值存储的是⽂本⽂件中的⼀⾏(以回车符为⾏结束标记),⽽key值为该⾏的⾸字母相对于⽂本⽂件的⾸地址的偏移量。然后StringTokenizer类将每⼀⾏拆分成为⼀个个的单词,并将作为map⽅法的结果输出,其余的⼯作都交有 MapReduce 框架处理。
StringTokenizer是Java⼯具包中的⼀个类,⽤于将字符串进⾏拆分—默认情况下使⽤空格作为分隔符进⾏分割。
⼆,编写Reduce处理逻辑
在Map运⾏结束得到中间结果后,接下来进⼊Shuffle阶段,在这个阶段中Hadoop⾃动将Map的输出结果进⾏分区、排序、合并,然后分发给对应的Reduce任务去处理。
下⾯是Reduce处理逻辑的具体代码:
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.Iterator;
public class IntSumReducer extends Reducer {
private IntWritable result = new IntWritable();
public IntSumReducer() {}
@Override
public void reduce(Text key, Iterable values, Reducer.Context context)
throws IOException, InterruptedException {
int sum = 0;
IntWritable val;
for(Iterator i = values.iterator(); i.hasNext(); sum +=()){
val = (();
}
context.write(key, sult);
}
}
继承Hadoop提供的类(Reducer),并override其⽅法(reduce)。
public class IntSumReducer extends Reducer
其中模板参数同Map⼀样,依次表⽰是输⼊键类型,输⼊值类型,输出键类型,输出值类型。
public void reduce(Text key, Iterable values, Context context)
reduce ⽅法的输⼊参数 key 为单个单词,⽽ values 是由各Mapper上对应单词的计数值所组成的列表(⼀个实现了 Iterable 接⼝的变量,可以理解成 values ⾥包含若⼲个 IntWritable 整数,可以通过迭代的⽅式遍历所有的值),所以只要遍历 values 并求和,即可得到某个单词出现的总次数。
当Reduce过程结束时,就可以得到最终需要的数据了。
三,编写main⽅法
为了让前⾯的Map/Reduce处理类能够协同⼯作,需要在main⽅法中通过Job 类设置Hadoop应⽤程序运⾏时的环境变量。
package com.rickie;
import com.rickie.wordcount.IntSumReducer;
import com.rickie.wordcount.TokenizerMapper;
import org.f.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import java.io.IOException;
/**
* Word Count
*
*/
public class WordCount
{
public static void main( String[] args ) throws IOException, ClassNotFoundException, InterruptedException { System.out.println( "Hello World!" );
Configuration conf = new Configuration();
String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
if(otherArgs.length < 2) {
}
// 设置环境参数
Job job = Instance(conf, "word count");
// 设置整个应⽤的类名
job.setJarByClass(WordCount.class);
// 添加Mapper 类
job.setMapperClass(TokenizerMapper.class);
// 添加Reducer 类
job.setReducerClass(IntSumReducer.class);
// 设置key 输出类型
job.setOutputKeyClass(Text.class);
// 设置value 输出类型

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。