MapReduce简介:
MapReduce”分而治之“的思想处处可见,适用于大量复杂的任务处理场景(大规模数据处理场景)。
Map负责”分“,即把复杂的任务分解为若干个”简单的任务“来处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总。
MapReduce运行再Yarn集群上(资源调度的平台)
经典案列:wordcount
1、分析数据准备:
先启动hadoop:
start-dfs.sh
start-yarn.sh
新建一个新的文件:
cd /export/testdata
vim big.txt
向文件写入以下内容并保存(单词与单词之间用空格隔开)
Hello world hadoop
Hive sqoop flume hello
Kitty tom jerry world
hadoop Kitty tom jerry world
这些是要进行词频统计的数据
2、上传到HDFS
- 在HDFS上新建文件夹
hadoop fs -mkdir -p /wordcount/input
- 使用put上传数据到HDFS
hadoop fs -put big.txt /wordcount/input
(可以打开http://192.168.110.101:50070/explorer.html,并点击进入相应目录确认是否上传成功)
3、编写程序
- 新建maven项目,导入项目所需的依赖
2.pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chen.cn</groupId>
<artifactId>mapreduce_wordcount</artifactId>
<version>1.0-SNAPSHOT</version>
<!--全局参数的设置-->
<properties>
<!--设置项目的编码为UTF-8-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--使用java8进行编码-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--使用java8来进行源码编译-->
<maven.compiler.target>1.8</maven.compiler.target>
<!--设置hadoop的版本-->
<hadoop.version>3.1.2</hadoop.version>
</properties>
<!--jar包的依赖-->
<dependencies>
<!--测试的依赖坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--日志打印的依赖坐标-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<!--hadoop的通用模块的依赖坐标-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--hadoop的对HDFS分布式文件系统访问的技术支持的依赖坐标-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--hadoop的客户端访问的依赖坐标-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
</project>
3.在com.chen.cn包下新建类:
WcMapTask
package com.chen.cn;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WcMapTask extends Mapper <LongWritable, Text,Text, IntWritable>{
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] words = line.split(" ");
for (String word : words){
context.write(new Text(word),new IntWritable(1));
}
}
}
WcReduceTask
package com.chen.cn;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WcReduceTask extends Reducer <Text, IntWritable,Text,IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (IntWritable value : values){
count += value.get();
}
context.write(key,new IntWritable(count));
}
}
WcMrJob(Driver类/启动类,描述Job)
package com.chen.cn;
import org.apache.hadoop.conf.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;
public class WcMrJob {
public static void main(String[] args) throws Exception {
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
//设置Driver类
job.setJarByClass(WcMrJob.class);
//设置运行哪个map Task
job.setMapperClass(WcMapTask.class);
//设置运行哪个reduce Task
job.setReducerClass(WcReduceTask.class);
//设置map Task的输出的(key,value)的数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置reduce Task的输出的(key,value)的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定要处理的数据所在的位置
FileInputFormat.setInputPaths(job,"hdfs://192.168.244.121:8020/wordcount/input/big.txt");
//指定处理之后的结果数据保存位置
FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.244.121:8020/wordcount/output"));
//向yarn集群提交job,并且设置一直到执行结束
boolean res = job.waitForCompletion(true);
//运行成功,通过System.exit(0),退出虚拟机,结束任务
System.exit(res?0:1);
}
}
目录结构:
4、项目打包
点击Maven->mapreduce_wordcount->Lifecycle->package,即可进行项目打包
打包过程(等待一小会):
打包完成,最终会在target下生成jar包,复制到桌面
5、上传jar包到集群
rz -E
上传完成,输入ll检查是否存在成功上传jar包:
6、运行写好的wordcount代码
hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar com.chen.cn.WcMrJob
(需要再等待一会)
运行成功:
访问yarn的资源调度平台 http://192.168.244.121:8088/cluster
查看在HDFS生成的文件:
hadoop fs -ls /wordcount/output
或者查看 http://192.168.244.121:50070/explorer.html#/wordcount
令人激动的时刻!!!
查看统计结果:
hadoop fs -cat /wordcount/output/part-r-00000
可以看到统计的结果! 自此完成wordcount案例~