經過上篇文章hadoop之旅5-idea經過maven搭建hdfs環境,相信你們均可以在idea上作hadoop訪問hdfs文件系統的開發了。一個雲盤其實就能夠基於這樣的系統作出來。有興趣的你們能夠試着本身去實戰一下。java
hadoop jar xxxx.jar 包名+類
命令執行便可,可自行探究MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。他也屬於hadoop的核心組件之一,hdfs是一個分佈式文件系統,MapReduce就是一個分佈式計算框架。專門爲計算而生python
最簡單的流程圖c++
詳細過程圖spring
在map,reduce中間還有一系列,合併,排序等等過程,系統會將複雜的數據進行整理篩選,最終到達咱們須要用代碼編寫的業務端。咱們通常狀況作數據離線分析能夠只考慮編寫map端,reduce端便可。話很少說直接帶你們上代碼體會。在準備好一個輸入文件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