MapReduce入門之wordcount
先下流行的大數據,主要需要兩個處理方法。1、海量數據的存儲,2、海量數據的計算。
其中,使用HDFS完成海量數據的分佈式儲存,而海量數據的計算交給MapReduce來進行。
MapReduce簡介
1、定義
MapReduce是一個使用簡單的軟件框架,基於它寫出來的應用程序能夠運行在由上千個商用機器組成的大型集羣上,並以一種可靠的容錯式並行處理TB級的數據集。
2、特點
1、實現一些接口,就可以完成一個分佈式程序,這個分佈式程序可以分佈到大量的PC機器上運行。
2、當計算資源不足時,可以通過簡單的增加機器就可以擴展它的計算能力。
3、它的高容錯性使他可以部署在廉價的PC機器上。hadoop內部可以自行完成,失敗節點任務轉移到另一個節點運行,完全不需要人工的參與。
3、不適合使用MapReduce的計算
1、實時計算——無法快速返回結果
2、流失計算——MapReduce的輸入是靜態的,數據源必須是靜態的。
3、DAG(有向圖)計算——一種反饋機制
4、架構
MapReduce採用Master/Slave的架構。Map輸入整個算法的輸入。Reduce輸出整個算法的最終輸出結果。
四個組成部分包括:Client、JobTracker、TaskTracker、Task
5、執行流程
Mapper的數量是不可以設置的,但是Reduce的數量是自行設置的。
InputFormat->mapper->combin->partition->reducer->OutputFormat
wordcount—-劃分文檔中的單詞數量
準備工作:
在本地建立一個文件。寫入重複內容。如:Hello Mapreduce,Hello Study,Hello Deniece。
然後上傳到hdfs上(hadoop fs -put Mapreduce /MapReduce)
新建三個類:wordcount類、MyMapper類、MyReduce類。分別編寫如下代碼來進行單詞數量統計。
第一個wordcount類:
import java.io.IOException;
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 myMapReduce {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = new Job(conf);
job.setJarByClass(myMapReduce.class);
//文件輸入 /MapReduce 必須存在
FileInputFormat.addInputPath(job, new Path("/MapReduce"));
//文件輸出 /Reduce 不存在 執行結束後,會出現的是log——xtt 目錄
//目錄下文件存有輸出結果
FileOutputFormat.setOutputPath(job, new Path("/log_xtt"));
//設置Map Reduce 兩個類
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
//設置Key爲Text(String)類型
job.setOutputKeyClass(Text.class);
//設置Value爲IntWritable(int)類型
job.setOutputValueClass(IntWritable.class);
//執行
job.waitForCompletion(true);
}
}
第二個MyMapper類:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class MyMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException
{
//value值爲:文檔裏面每一行的字符串
//Text value 是一整行的數據Map源碼會自動循環調用此函數只到把每一行都讀入進來。
String[] str = value.toString().split(" ");
for(String ss:str)
{
context.write(new Text(ss),new IntWritable(1));
//不知道把結果發給誰,用上下文
}
}
}
第三個MyReduce類:
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable>{
protected void reduce(Text key,Iterable<IntWritable> values,Context context) {
int sum = 0;
//轉換成常用的迭代器,迭代相加。
Iterator<IntWritable> it = values.iterator();
while(it.hasNext())
{
sum = sum+it.next().get();
}
try {
context.write(key, new IntWritable(sum));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
此處的寫法,可簡單統計一個文檔中相同的單詞個數。