Hadoop化繁爲簡(三)—探索Mapreduce簡要原理與實踐

目錄-探索mapreduce

  一、Mapreduce的模型簡介與特性?Yarn的做用?html

  二、mapreduce的工做原理是怎樣的?java

  三、配置Yarn與Mapreduce、演示Mapreduce例子程序node

  四、javaApi開發Mapreduce程序面試

發散思考-入門mapreduce

  思考題:假設有一個長度爲1000萬的int數組,求數組數據長度。apache

  答:若是是應試考試,你說以爲太簡單了吧,一個for循環就搞定。但是,它是一個面試,你如何經過解決這一個問題就脫穎而出呢?凡是,大數據量計算必定要向多線程方向去靠。windows

  

  思考題:設計一個解決方案,把分佈在四臺機器上的數據報表統計出來。數組

  

  數據向計算靠近:把數據網絡傳輸所有彙總在一塊兒,而後用應用程序計算。緩存

  計算向數據靠近:把應用程序放在存儲數據的機器節點上,而後把用網絡傳輸計算結果彙總。安全

mapreduce簡介 

  mapreduce就是將存儲在分佈式文件系統hdfs的一個大規模數據集,會被切分許多個獨立的小數據塊,這些小數據塊能夠被多個Map任務並行處理。網絡

  mapreduce特性:分佈式存儲、工做調度、負載均衡、容錯處理、網絡通訊。

  mapreduce設計理念:計算向數據靠攏、「分而治之」。

  Yarn被稱爲調度引擎,那怎麼個調度法?

  答:假設你已經瞭解Hdfs文件系統,當客戶端提交一個計算任務給hadoop集羣,Master(NameNode)會先拆分計算任務,那麼怎麼把任務分配給空閒機器呢?那怎麼識別空閒機器呢?這些任務就交給Yarn這個調度引擎處理。

  

  若是你對Hadoop的環境部署、分佈式文件系統還爲入門,可參照下述文章:

  Hadoop化繁爲簡(一)-從安裝Linux到搭建集羣環境
  Hadoop化繁爲簡(二)—層層遞進輕鬆入門hdfs

mapreduce工做流程

  舉例:計算文件中單詞出現的次數,咱們能夠用抽象的思惟假設它是一個超級超級大的文件。

  注:個人機器的物理架構是一個Master、三個Slave,如上圖所示。此處暫且不討論Block與InputSplit的關係。

  

  1. Master負責協調調度做業,Slave負責執行Map、Reduce任務。
  2. 在分佈式文件系統下存在/input/words.txt大文件,Master將大文件按行分紅5個分片,而且把任務分配給Slave分配給空閒機器。把任務分配給靠近數據節點(在文件系統中,文件可能只在Slave一、Slave2這兩臺機器上,因此把拆分任務儘可能分配給存儲文件的機器上)。
  3. 執行Map任務:把每一個分片上的任務,按行拆分單詞,而且把單詞做爲key、出現次數做爲value。而且把中件結果,也就是shuffle的<k,v>結果存儲在本地緩衝區中,當緩存滿了,清空緩存,把緩存數據寫入到本地文件系統中,被稱爲「溢寫」。當一個Map任務完成之後,它會立刻通知Master機器,須要Master安排機器來領取數據執行Reduce任務。
  4. 在shuffle過程當中,可能有一個疑問,是怎樣把相同key值的value放在一塊去的呢?在數據結構中,有一個hash查找的概念,在這裏就是採用hashMap函數。
  5. 執行Reduce任務:在執行Reduce任務以前,會把分佈在不一樣機器上的同一個結果集經過shuffle過程歸併在一塊兒。例如,假設上面的input是一個超級大的文件,每一行被分佈在不一樣機器上,那麼java這個key值可能在Slave一、Slave2當中都有,那麼就須要先把Slave一、Slave2的java派發在同一臺機器上執行Reduce任務。最後,Reduce任務就是把List<K,V>遍歷,按照key把value相加。

  建議:理論先知道輪廓,立刻進行實踐,最少總結再研究細節。

配置yarn與執行mapreduce  

注:假設已經參考上述文章,配置好hadoop環境、hdfs。

一、配置計算引擎mapreduce和調度引擎yarn。

二、Master(nameNode)的mapred-site.xml

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

三、Master(namenode)和Slave(datanode)的yarn-site.xml

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
</property>
 
<property>  
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle</value>  
</property>  
 
<property>
    <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

四、start-yarn.sh啓動集羣,若是沒有配置環境變量,須要在/hadoop/sbin/目錄下執行。

五、利用jps查看集羣啓動狀況或者利用網頁http://master:8088/觀察。

六、查找mapreduce示例程序:/find /usr/local/hadoop -name *example*.jar 查找示例文件

七、執行 hadoop jar **.jar wordcount /input /output2

八、可利用網頁(http://master:8088/cluster)查看job執行狀況

利用JavaAPI執行mapreduce程序

一、添加jar-pom.xml包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>aaorn-mapreduce</artifactId>
    <packaging>jar</packaging>
     <!--hadoop公共部分 Begin-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--hadoop公共部分 End-->

        <!--hadoop分佈式文件系統 Begin-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--hadoop分佈式文件系統 End-->

        <!--hadoop mapreduce Begin-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!--hadoop mapreduce End-->
    </dependencies>
</project>

二、配置log4j.properties,放到src/main/resources目錄下

log4j.rootCategory=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

三、編Map程序

//Mapper的輸入是key:行號(LongWritable) value:每一行的文本(Text) //Mapper的輸出是key:單詞(Text) value:出現的次數(LongWritable)
public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //單詞按空格分割
        String [] values=value.toString().split(" "); final LongWritable MAP_VALUE=new LongWritable(1); for(String s:values){ context.write(new Text(s),MAP_VALUE); } } }

四、編寫Reduce程序

//Reducer的輸入是key:單詞(Text) value:單詞出現的次數集合(Iterable<LongWritable>) //Reducer的輸出是key:單詞(Text) value:出現的總次數(LongWritable)
public class WordCountReducer extends Reducer<Text,LongWritable,Text,LongWritable>{ @Override protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { long count=0; for(LongWritable value:values){ count+=value.get(); } context.write(key,new LongWritable(count)); } }

五、測試程序

public class Test { public static void main(String [] args) throws Exception{ Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://master:9000/"); //先寫完程序再打jar包。
        conf.set("mapreduce.job.jar", "D:/intelij-workspace/aaron-bigdata/aaorn-mapreduce/target/aaorn-mapreduce-1.0-SNAPSHOT.jar".trim()); conf.set("mapreduce.framework.name", "yarn"); conf.set("yarn.resourcemanager.hostname", "master"); conf.set("mapreduce.app-submission.cross-platform", "true"); Job job = Job.getInstance(conf); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileInputFormat.setInputPaths(job,"hdfs://master:9000/input/"); FileOutputFormat.setOutputPath(job,new Path("hdfs://master:9000/output/")); job.waitForCompletion(true); } }

五、測試結果

 

六、可能出現的問題

(1)namenode處於安全模式:http://www.cnblogs.com/qiuyong/p/6944375.html

(2)windows本地用戶訪問權限問題:配置執行時的虛擬機參數-DHADOOP_USER_NAME=root

 

(3)若是遇到其餘問題,歡迎留言。若是哪裏有寫的不當或者不夠完善的,歡迎提出建議,以便博主完善爲網友提供更加優質的文章。

版權聲明

  做者:邱勇Aaron

  出處:http://www.cnblogs.com/qiuyong/

  您的支持是對博主深刻思考總結的最大鼓勵。

  本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,尊重做者的勞動成果。

相關文章
相關標籤/搜索