一、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/
您的支持是对博主深刻思考总结的最大鼓励。
本文版权归做者全部,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,尊重做者的劳动成果。