一、Mapreduce的模型簡介與特性?Yarn的做用?html
二、mapreduce的工做原理是怎樣的?java
三、配置Yarn與Mapreduce、演示Mapreduce例子程序node
四、javaApi開發Mapreduce程序面試
思考題:假設有一個長度爲1000萬的int數組,求數組數據長度。apache
答:若是是應試考試,你說以爲太簡單了吧,一個for循環就搞定。但是,它是一個面試,你如何經過解決這一個問題就脫穎而出呢?凡是,大數據量計算必定要向多線程方向去靠。windows
思考題:設計一個解決方案,把分佈在四臺機器上的數據報表統計出來。數組
數據向計算靠近:把數據網絡傳輸所有彙總在一塊兒,而後用應用程序計算。緩存
計算向數據靠近:把應用程序放在存儲數據的機器節點上,而後把用網絡傳輸計算結果彙總。安全
mapreduce就是將存儲在分佈式文件系統hdfs的一個大規模數據集,會被切分許多個獨立的小數據塊,這些小數據塊能夠被多個Map任務並行處理。網絡
mapreduce特性:分佈式存儲、工做調度、負載均衡、容錯處理、網絡通訊。
mapreduce設計理念:計算向數據靠攏、「分而治之」。
Yarn被稱爲調度引擎,那怎麼個調度法?
答:假設你已經瞭解Hdfs文件系統,當客戶端提交一個計算任務給hadoop集羣,Master(NameNode)會先拆分計算任務,那麼怎麼把任務分配給空閒機器呢?那怎麼識別空閒機器呢?這些任務就交給Yarn這個調度引擎處理。
若是你對Hadoop的環境部署、分佈式文件系統還爲入門,可參照下述文章:
Hadoop化繁爲簡(一)-從安裝Linux到搭建集羣環境
Hadoop化繁爲簡(二)—層層遞進輕鬆入門hdfs
舉例:計算文件中單詞出現的次數,咱們能夠用抽象的思惟假設它是一個超級超級大的文件。
注:個人機器的物理架構是一個Master、三個Slave,如上圖所示。此處暫且不討論Block與InputSplit的關係。
建議:理論先知道輪廓,立刻進行實踐,最少總結再研究細節。
注:假設已經參考上述文章,配置好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執行狀況
一、添加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); } }
五、測試結果
六、可能出現的問題
(2)windows本地用戶訪問權限問題:配置執行時的虛擬機參數-DHADOOP_USER_NAME=root
(3)若是遇到其餘問題,歡迎留言。若是哪裏有寫的不當或者不夠完善的,歡迎提出建議,以便博主完善爲網友提供更加優質的文章。
做者:邱勇Aaron
出處:http://www.cnblogs.com/qiuyong/
您的支持是對博主深刻思考總結的最大鼓勵。
本文版權歸做者全部,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,尊重做者的勞動成果。