MapReduce的代码编写----wordCount示例
MR的代码编写
1、导入依赖
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>
2、程序示例
words.txt文件:
hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
hadoop hive hbase spark flink
java scala python
java scala python
java scala python
java scala python
java scala python
在HDFS创建目录:
先创建目录wordCount
hdfs dfs -mkdir hdfs://master:9000/wordCount
在目录wordCount下再创建目录input
hdfs dfs -mkdir hdfs://master:9000/wordCount/input
或者迭代创建目录:
hdfs dfs -mkdir -p hdfs://master:9000/wordCount/input
将数据文件上传到虚拟机(将words.txt文件复制到Xftp中)
将数据文件上传到HDFS中
hdfs dfs -put words.txt hdfs://master:9000/wordCount/input
在IDEA中编写代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
//统计每个单词的个数
public class DemoWordCount {
//Map阶段(通过静态类定义Map端输入和输出的key的类型)
//定义4个泛型,泛型类型根据数据而定
public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
/**
* @param key Map端输入的key->偏移量
* @param value Map端输入的value->一行数据
* @param context MapReduce整个过程的上下文环境->可以获取MapReduce程序运行时的一些参数/状态,可以将Map端的输出发送到Reduce
* @throws IOException
* @throws InterruptedException
*
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//实现自己的Map端逻辑
String vStr = value.toString();
//按照空格进行切分,将每个单词切分出来
String[] words = vStr.split(" ");
//遍历每一个单词,构造k-v格式
/**
* hadoop hive hbase spark flink
* ====>变成k-v格式
* hadoop 1
* hive 1
* hbase 1
* spark 1
* flink 1
*/
for (String word : words) {
//将String变成txt
Text keyOut = new Text(word);//代表key
IntWritable valueOut = new IntWritable(1);//代表value--1
//通过context将构建好的k-v发送出去
context.write(keyOut, valueOut);
}
}
}
//Reduce阶段
public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
/**
* @param key Map端输出的数据按照key进行分组过后的数据中的key,在这里相当于每个单词
* @param values Map端输出的数据按照key进行分组过后,相同key的所有的value组成的集合(迭代器)
* @param context MapReduce的上下文环境,主要用于输出数据到HDFS
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//实现自己的Reduce逻辑
int sum = 0; // 保存每个单词的数量
for (IntWritable value : values) {
// 遍历values迭代器
sum = sum + value.get();
}
// 将Reduce统计得到的结果输出到HDFS
context.write(key, new IntWritable(sum));
}
}
//Driver端(将Map、Reduce进行组装)
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
Configuration conf = new Configuration();
// 创建一个Job实例
// MapReduce在运行的时候我们把它称为Job
Job job = Job.getInstance(conf);
// 对Job进行一些简单的配置
job.setJobName("DemoWordCount");
// 通过class类设置运行Job时该执行哪一个类
job.setJarByClass(DemoWordCount.class);
// 对Map端进行配置
// 对Map端输出的Key的类型进行配置
job.setMapOutputKeyClass(Text.class);
// 对Map端输出的Value的类型进行配置
job.setMapOutputValueClass(IntWritable.class);
// 配置Map任务该运行哪一个类
job.setMapperClass(MyMapper.class);
// 对Reduce端进行配置
// 对Reduce端输出的Key的类型进行配置
job.setOutputKeyClass(Text.class);
// 对Reduce端输出的Value的类型进行配置
job.setOutputValueClass(IntWritable.class);
// 配置Reduce任务该运行哪一个类
job.setReducerClass(MyReducer.class);
// 配置输入输出路径
FileInputFormat.addInputPath(job,new Path("/wordCount/input"));
//输出路径不需要提前创建,如果该目录已存在则会报错,加个if语句判断
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path("/wordCount/output"))){
fs.delete(new Path("/wordCount/output"),true);
}
FileOutputFormat.setOutputPath(job,new Path("/wordCount/output"));
// 等待job运行完成
job.waitForCompletion(true);
}
}
通过maven中的package,将代码打包;
将打包好的jar包上传到Xstp中(直接拖进去)
在Xshell中运行jar包(运行之前要切换到jar包所在的目录内)
hadoop jar jar包的名称 代码中类的路径
hadoop jar Hadoop-1.0.jar com.shujia.MapReduce.DemoWordCount
查看运行结果:
hdfs dfs -cat /wordCount/output/part-r-00000
或者
hadoop fs -cat /wordCount/output/part-r-00000
运行结果为:
flink 5
hadoop 5
hbase 5
hive 5
java 5
python 5
scala 5
spark 5
查看运行日志(非必要不看)
yarn logs -applicationId application_1644761997516_0002
application_1644761997516_0002在运行任务期间的前端可以找到
分类:
Hadoop
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了