探索Mapreduce简要原理与实践

目录-探索mapreduce

  1、Mapreduce的模型简介与特性?Yarn的作用?

  2、mapreduce的工作原理是怎样的?

  3、配置Yarn与Mapreduce、演示Mapreduce例子程序

  4、javaApi开发Mapreduce程序

发散思考-入门mapreduce

  思考题:假设有一个长度为1000万的int数组,求数组数据长度。

  答:如果是应试考试,你说觉得太简单了吧,一个for循环就搞定。可是,它是一个面试,你如何通过解决这一个问题就脱颖而出呢?凡是,大数据量计算一定要向多线程方向去靠。

  

  思考题:设计一个解决方案,把分布在四台机器上的数据报表统计出来。

  

  数据向计算靠近:把数据网络传输全部汇总在一起,然后用应用程序计算。

  计算向数据靠近:把应用程序放在存储数据的机器节点上,然后把用网络传输计算结果汇总。

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分配给空闲机器。把任务分配给靠近数据节点(在文件系统中,文件可能只在Slave1、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值可能在Slave1、Slave2当中都有,那么就需要先把Slave1、Slave2的java派发在同一台机器上执行Reduce任务。最后,Reduce任务就是把List<K,V>遍历,按照key把value相加。

  建议:理论先知道轮廓,马上进行实践,最少总结再研究细节。

配置yarn与执行mapreduce  

注:假设已经参考上述文章,配置好hadoop环境、hdfs。

1、配置计算引擎mapreduce和调度引擎yarn。

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

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

3、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>

4、start-yarn.sh启动集群,如果没有配置环境变量,需要在/hadoop/sbin/目录下执行。

5、利用jps查看集群启动情况或者利用网页http://master:8088/观察。

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

7、执行 hadoop jar **.jar wordcount /input /output2

8、可利用网页(http://master:8088/cluster)查看job执行情况

利用JavaAPI执行mapreduce程序

1、添加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>

2、配置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

3、编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);
}
}
}

4、编写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));
}
}

5、测试程序

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);
}
}

5、测试结果

6、可能出现的问题

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

(2)windows本地用户访问权限问题:配置执行时的虚拟机参数-DHADOOP_USER_NAME=root

(3)如果遇到其他问题,欢迎留言。如果哪里有写的不当或者不够完善的,欢迎提出建议,以便博主完善为网友提供更加优质的文章。

版权声明

  作者:xiaoyongAaron(邱勇)

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

最新文章

  1. Spring,Mybatis 整合Memcache
  2. centos6.4下安装php7+nginx+mariadb环境
  3. windbg 基础命令实战 - 简单程序破解
  4. Javascript获取随机数
  5. Ext4,Ext3的特点和区别(转)
  6. SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)
  7. 锋利的jQuery-4--阻止事件冒泡和阻止默认行为
  8. JSP Scripting Element
  9. AD7190学习笔记
  10. hdu 1563 Find your present!
  11. UITextField知多少
  12. of_alias_get_id 函数与设备树中aliases节点的关系【转】
  13. Django项目导入Eclipse运行调试
  14. [转]RPA流程自动化-Blueprism认证考试介绍
  15. springboot 学习之路 4(日志输出)
  16. 《ERP系统》客户信用及风控代码
  17. ScrollView不能包含多个子项,ScrollView can host only one direct child
  18. TZOJ 3295 括号序列(区间DP)
  19. UVa 122 Trees on the level(二叉树层序遍历)
  20. 解决iPhone滑动时滑到另一个层级导致卡顿问题

热门文章

  1. Eclipse工具查看依赖的JDK、Maven源码方法
  2. h5移动端页面meta标签
  3. 基于pyecharts的IT各行业薪资展示
  4. flask迁移
  5. 【Hadoop】配置环境-伪分布式
  6. 华为机试 求int型数据在内存中存储时1的个数
  7. Go语言中的UDP应用
  8. delphi 数据库中Connection与Query连接数量问题思考
  9. 关于 SSH Server 的整体设定
  10. mac 下 安装php扩展 - mcrypt