react中進一步封裝axios,對錯誤資訊進行攔截
阿新 • • 發佈:2020-12-27
技術標籤:大資料
MapReduce是Hadoop上的一個計算框架,計算過程分為Map階段和Reduce階段。使用者只需要編寫map()和reduce()函式即可完成簡單的
分散式的程式設計。
map函式以鍵值對為輸入,產生一系列鍵值對作為中間輸出,寫入本地磁碟
,MapReduce會自動將中間資料按key值聚集,將key值相同的資料統一交給reduce函式處理。
reduce函式以鍵值對作為輸入,經過彙總計算後將資料寫入HDFS
MapReduce的五個可程式設計元件
- InputFormat通過InputFormat類定義如何分割和讀取輸入檔案,Hadoop提供了多種輸入格式,其中有一個抽象類FileInputFormat,所有操檔案的InputFormat類都是從它繼承功能和屬性。
- Mapper將輸入的資料轉換成特定的鍵值對
- Partitoner確定Mapper產生的key/value傳送給哪個Reducer處理
- Reducer對相同或key的資料彙總計算
- OutputFormat 指定輸出格式
上程式碼:統計西遊記中“悟空”出現的次數
建立一個Java maven專案,新增依賴。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.1</ version>
</dependency>
程式碼有三個類,APP類,Mapper類,Reduce類。APP類配置MapReduce作業資訊,Mapper做對映,Reduce做彙總
App類
package com.yjb.hadoop;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop. io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) throws IOException, ClassNotFoundException, InterruptedException
{
Configuration conf=new Configuration();
//叢集名字,配置檔案裡有
conf.set("fs.defaultFS", "hdfs://mycluster");
FileSystem fs = FileSystem.get(conf);
//刪除檔案,否則每次重新執行都會提示目錄已存在
fs.delete(new Path("/output"), true);
//作業名
Job job = Job.getInstance(conf,"App");
//作業啟動類
job.setJarByClass(App.class);
//可程式設計元件InputFormat,設定輸入格式,預設使用TextInputFormat
//job.setInputFormatClass(cls);
//可程式設計元件Mapper
job.setMapperClass(WordCountMapper.class);
//可程式設計元件Partitioner
//job.setPartitionerClass(cls);
//可程式設計元件Reducer
job.setReducerClass(WordCountReduce.class);
//可程式設計元件OutputFormat,設定輸出格式,預設使用TextInputFormat
//job.setOutputFormatClass(cls);
//設定reduce作業數量
job.setNumReduceTasks(1);
//輸出key型別
job.setOutputKeyClass(Text.class);
//輸出值型別
job.setOutputValueClass(Text.class);
//輸入目錄
String in ="/input";
//輸出目錄
String out="/output";
Path input = new Path(in);
Path output= new Path(out);
FileInputFormat.addInputPath(job, input);
FileOutputFormat.setOutputPath(job, output);
//成功輸出0失敗輸出1
System.out.println(job.waitForCompletion(true)?0:1);
}
}
這裡注意上面程式碼中的五個可程式設計元件
mapper類
package com.yjb.hadoop;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class WordCountMapper extends Mapper<Object, Text, Text, Text>{
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
//預設一個value一行,統計一行裡有多少"悟空"
String s=value.toString();
Pattern pattern = Pattern.compile("悟空");
Matcher matcher = pattern.matcher(s);
int count=0;
while(matcher.find()){
count++;
}
context.write(new Text("悟空"), new Text(String.valueOf(count)));
}
}
reduce類
package com.yjb.hadoop;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReduce extends Reducer<Text, Text, Text, Text>{
@Override
protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
int c=0;
for(Text v:values) {
String s=v.toString();
System.out.println("s:"+s);
c=c+Integer.valueOf(s);
}
context.write(key, new Text("出現了:"+c+"次"));
}
}
將西遊記文件上傳到hdfs的/input/目錄下,注意一定是utf8編碼的檔案。
匯出程式包,在hadoop上執行
hadoop jar ABC.jar #我匯出的jar包
對上面的程式碼做一點改進,分別統計,八戒,大師兄,猴哥,沙師弟出現的次數
package com.yjb.hadoop;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class WordCountMapper extends Mapper<Object, Text, Text, Text> {
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
// 八戒,大師兄,猴哥,沙師弟出現的次數
String s = value.toString();
String[] p= {"八戒","大師兄","猴哥","沙師弟"};
for(String sp:p) {
Pattern pattern = Pattern.compile(sp);
Matcher matcher = pattern.matcher(s);
int count = 0;
while (matcher.find()) {
count++;
}
context.write(new Text(sp), new Text(String.valueOf(count)));
}
}
}
執行結果:
震驚!西遊記原著中竟然從來沒出現過猴哥,也沒出現過沙師弟!