俗话说一个程序员开始学习书法的时候拿起笔就是写 HelloWorld.没错我们学习一个新的语言或者新的知识的时候都是从基本的HelloWorld开始。大数据的HelloWorld我们可以参考
/hadoop-3.1.3/share/hadoop/mapreduce 目录下的 hadoop-mapreduce-examples-3.1.3.jar 文件 可以在linux中使用sz + 文件名的方式下载到windows中 解压使用反编译工具进行反编译。然后根据源码我们参考编写自己的WordCount
源码如下:
编码实操
需求:
输入数据 ,期望输出 【统计单词次数】
banzhang 1
cls 2
hadoop 1
jiao 1
ss 2
xue 1
步骤:
一;环境准备
①加入依赖
②加入日志文件
二:编码
Map阶段:
1. map()方法中把传入的数据转为String类型
2. 根据空格切分出单词
3. 输出<单词,1>
Reduce阶段:
1. 汇总各个key(单词)的个数,遍历value数据进行累加
2. 输出key的总数
Driver
1. 获取配置文件对象,获取job对象实例
2. 指定程序jar的本地路径
3. 指定Mapper/Reducer类
4. 指定Mapper输出的kv数据类型
5. 指定最终输出的kv数据类型
6. 指定job处理的原始数据路径
7. 指定job输出结果路径
依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.9.2</version>
</dependency>
log4.j
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
Mapper类
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> { Text k = new Text(); IntWritable v = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //1.获取一行 String line=value.toString(); //2.切割 String[] word = line.split(" "); //3.输出 for (String s : word) { k.set(s); context.write(k,v); } }
Reduce类
public class WordContReduce extends Reducer<Text, IntWritable,Text,IntWritable> { int sum; IntWritable v = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { //1.累加求和 sum=0; for (IntWritable count : values) { sum+=count.get(); } //2.输出 v.set(sum); context.write(key,v); } }
Driver类
public static void main(String[] args) throws Exception { //1.获取配置信息获取job信息 Configuration conf = new Configuration(); Job job = Job.getInstance(conf); //2.关联本Driver程序的jar job.setJarByClass(WordCountDriver.class); //3.关联mapper和reduce的jar job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordContReduce.class); //4.设置mapper 输出的kv类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); //5.设置最终的输出kv类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //6设置输入和输出的路径 FileInputFormat.setInputPaths(job,new Path("E:\\bigData\\guigu\\input")); FileOutputFormat.setOutputPath(job,new Path("E:\\bigData\\guigu\\output2")); //7.提交job boolean b = job.waitForCompletion(true); System.exit(b?0:1); } }
成功时候可以在输出的路径中看到对应的文件
打开文件即可看到我们想看到的结果。