经过上篇文章hadoop之旅5-idea经过maven搭建hdfs环境,相信你们均可以在idea上作hadoop访问hdfs文件系统的开发了。一个云盘其实就能够基于这样的系统作出来。有兴趣的你们能够试着本身去实战一下。java
hadoop jar xxxx.jar 包名+类
命令执行便可,可自行探究MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。他也属于hadoop的核心组件之一,hdfs是一个分布式文件系统,MapReduce就是一个分布式计算框架。专门为计算而生python
最简单的流程图c++
详细过程图spring
在准备好一个输入文件input.txt
,放在项目任意一个目录下,我建的是SpringBoot项目放在resources
下的map_input
目录下apache
c 2
c++ 1
java 2
python 1
复制代码
<properties>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
复制代码
实现map端其实很简单,只须要建立一个类继承Mapper类,而后实现它的map方法便可。编程
public class MyMapper extends Mapper<Object, Text, Text, LongWritable> {
/**
*
* @param key 当前行的标识(键),通常文件输入能够不用管
* @param text 当前行的值
* @param context 上下文内容
* 文件内容:
* java,c++
* c,java
* python,c
*/
@Override
protected void map(Object key, Text text, Context context) throws IOException, InterruptedException {
//拿到当前输入的行内容
String line = text.toString();
//拆分当前行,如 java,c++
String[] lines = line.split(",");
for (String word : lines) {
/**
* 也就是在map端,把输出置为: java 1,c 1,c++ 1等
*/
context.write(new Text(word),new LongWritable(1));
}
}
}
复制代码
同理,继承Reducer类,实现reduce方法便可windows
/**
* 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一块儿)
* 后两个参数:reducer 输出的键,值(即最终结果)
* 在reduce里作累加便可统计出每一个单词的个数
*/
public class MyReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
/**
* key,values
* 以map里的输出的键值:如:map里输出的是:
* c:[1,1]也多是 c:[2] ,主要涉及MapReducer运行原理中的 分片合并 过程
* c++:[1]
* java:[1,1]也多是java:[2]
* python:[1]
*/
long sum = 0; //该单词总共出现的次数
for (LongWritable value : values) {
sum+=value.get();
}
context.write(key,new LongWritable(sum)); //输出结果:如,c:2,java:1...
}
}
复制代码
调用代码很常规,基本上都是同样的模板springboot
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
//线上运行在hadoop集群里须要配置
//conf.set("fs.defaultFS", "hdfs://master:9000/");//主master访问路径
//conf.set("mapreduce.framework.name", "yarn"); //运行框架yarn
//conf.set("yarn.resourcemanager.hostname", "master"); //设置主机
Job job = Job.getInstance(conf); //拿到一个做业job,来执行mapReduce
//设置运行的主类
job.setJarByClass(MapReduceClient.class);
job.setJobName("wordCount"); //设置应用名称
//设置输入文件的位置
FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");
//设置输出文件的位置
FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));
//设置mapper类和reducer类
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReduce.class);
//设置输入,输出类型,map和reduce是同样的话能够只写reducer的
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//执行
job.waitForCompletion(true);
}
复制代码
在本地运行有个要求,须要本地hadoop的bin目录下拥有windows下的执行文件。你们能够下好hadoop以后直接解压,而后把windows执行包复制到bin目录便可bash
最终的运行结果以下app