分布式並行計算MapReduce


這個作業的要求來自於:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319

1.用自己的話闡明Hadoop平台上HDFS和MapReduce的功能、工作原理和工作過程。

HDFS

    功能:分布式文件系統,用來存儲海量數據。

    工作原理和過程:HDFS是Hadoop的分布式文件系統,HDFS中的文件會默認存儲3份,存儲在不同的機器上,提供容錯機制,副本丟失或者宕機的自動恢復。HDFS總體上采用Master/Slave的架構,整個HDFS架構由Client、NameNode、Secondary NameNode和DataNode構成。NameNode負責存儲整個集群的元數據信息,Client可以根據元數據信息找到對應的文件,DataNode負責數據的實際存儲。當一個文件上傳到HDFS的時候,DataNode會按照Block為基本單位分布在各個DataNode中,而且為了保護數據的一致性和容錯性,一般一份數據會在不同的DataNode上默認存儲三份。如下圖所示:

 

MapReduce

    功能:並行處理框架,實現任務分解和調度。

    工作原理和過程:MapReduce的工作過程分成兩個階段,map階段和reduce階段。每個階段都有鍵值對作為輸入輸出,map函數和reduce函數的具體實現由程序員完成。MapReduce的框架也是采用Master/Slave的方式組織,如下圖所示。由四部分組成,分別為Client、JobTracker、TaskTracker以及Task。JobTracker主要負責資源監控和作業調度。JobTracker監控TaskTracker是否存活,任務執行的狀態以及資源的使用情況,並且把得到的信息交給TaskSceduler。TaskSceduler根據每個TaskTracker的情況給分配響應的任務。TaskTracker會周期性通過heartbeats向JobTracker發送資源的使用情況,任務的執行狀況等信息,同時會接收JobTracker的指令,TaskTracker把自己可支配的資源分成若干個Slot,Task只有拿到一個Slot資源才能執行任務。Task任務分成Map Task和Reduce Task兩種任務,都是由TaskTracker進行調度的。

 

 

2.HDFS上運行MapReduce

mapper.py

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 Map extends Mapper<LongWritable, Text, Text,IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    public void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException {
        word.set(value.toString());
        context.write(word, one);
    }
}

reduce.py

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.Iterator;

public class Reduce extends Reducer<Text, IntWritable, Text,IntWritable> {
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for(IntWritable intWritable : values){
            sum += intWritable.get();
        }
        context.write(key, new IntWritable(sum));
    }
}
 
        
#!/usr/bin/env python
cd /home/hadoop/wc
sudo gedit reduce.py
#賦予權限
chmod a+x /home/hadoop/map.py
 
        

本機上測試運行代碼:

echo "foo foo quux labs foo bar quux" | /home/hadoop/wc/mapper.py

echo "foo foo quux labs foo bar quux" | /home/hadoop/wc/mapper.py | sort -k1,1 | /home/hadoop/wc/reducer.p
啟動Hadoop,HDFS, JobTracker, TaskTracker:

放到HDFS上運行

下載並上傳文件到hdfs上:

#上傳文件
cd  /home/hadoop/wc
wget http://www.gutenberg.org/files/5000/5000-8.txt
wget http://www.gutenberg.org/cache/epub/20417/pg20417.txt
 
#下載文件
cd /usr/hadoop/wc
hdfs dfs -put /home/hadoop/hadoop/gutenberg/*.txt /user/hadoop/input

新建一個文件5000-8.txt,運行結果如下:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM