化繁为简(三)—探索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的关系。
- Master负责协调调度作业,Slave负责执行Map、Reduce任务。
- 在分布式文件系统下存在/input/words.txt大文件,Master将大文件按行分成5个分片,并且把任务分配给Slave分配给空闲机器。把任务分配给靠近数据节点(在文件系统中,文件可能只在Slave1、Slave2这两台机器上,所以把拆分任务尽量分配给存储文件的机器上)。
- 执行Map任务:把每个分片上的任务,按行拆分单词,并且把单词作为key、出现次数作为value。并且把中件结果,也就是shuffle的<k,v>结果存储在本地缓冲区中,当缓存满了,清空缓存,把缓存数据写入到本地文件系统中,被称为“溢写”。当一个Map任务完成以后,它会马上通知Master机器,需要Master安排机器来领取数据执行Reduce任务。
- 在shuffle过程中,可能有一个疑问,是怎样把相同key值的value放在一块去的呢?在数据结构中,有一个hash查找的概念,在这里就是采用hashMap函数。
- 执行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--><span style="color: #008000;"><!--</span><span style="color: #008000;">hadoop分布式文件系统 Begin</span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.apache.hadoop<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>hadoop-hdfs<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>${hadoop.version}<span style="color: #0000ff;"></</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
<span style="color: #008000;"><!--</span><span style="color: #008000;">hadoop分布式文件系统 End</span><span style="color: #008000;">--></span> <span style="color: #008000;"><!--</span><span style="color: #008000;">hadoop mapreduce Begin</span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.apache.hadoop<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>hadoop-client<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>${hadoop.version}<span style="color: #0000ff;"></</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
<span style="color: #008000;"><!--</span><span style="color: #008000;">hadoop mapreduce End</span><span style="color: #008000;">--></span>
<span style="color: #0000ff;"></</span><span style="color: #800000;">dependencies</span><span style="color: #0000ff;">></span>
</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 </span>=<span style="color: #000000;"> Job.getInstance(conf);
job.setMapperClass(WordCountMapper.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
job.setReducerClass(WordCountReducer.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
job.setMapOutputKeyClass(Text.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
job.setMapOutputValueClass(LongWritable.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
job.setOutputKeyClass(Text.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);
job.setOutputValueClass(LongWritable.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">); FileInputFormat.setInputPaths(job,</span>"hdfs://master:9000/input/"<span style="color: #000000;">);
FileOutputFormat.setOutputPath(job,</span><span style="color: #0000ff;">new</span> Path("hdfs://master:9000/output/"<span style="color: #000000;">)); job.waitForCompletion(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);
}
}
5、测试结果
6、可能出现的问题
(2)windows本地用户访问权限问题:配置执行时的虚拟机参数-DHADOOP_USER_NAME=root
(3)如果遇到其他问题,欢迎留言。如果哪里有写的不当或者不够完善的,欢迎提出建议,以便博主完善为网友提供更加优质的文章。
版权声明
作者:邱勇Aaron
出处:http://www.cnblogs.com/qiuyong/
您的支持是对博主深入思考总结的最大鼓励。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,尊重作者的劳动成果。
化繁为简(三)—探索Mapreduce简要原理与实践的更多相关文章
- Hadoop化繁为简(三)—探索Mapreduce简要原理与实践
目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapreduce.演示Mapreduce例子程序 ...
- Mapreduce简要原理与实践
探索Mapreduce简要原理与实践 目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapred ...
- 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践
2017-2018-2 20155228 <网络对抗技术> 实验三:MAL_免杀原理与实践 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasi ...
- kafka原理和实践(三)spring-kafka生产者源码
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- WebSocket原理与实践(三)--解析数据帧
WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义: 在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...
- 【原创 Hadoop&Spark 动手实践 3】Hadoop2.7.3 MapReduce理论与动手实践
开始聊MapReduce,MapReduce是Hadoop的计算框架,我学Hadoop是从Hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...
- 20145215《网络对抗》Exp3 免杀原理与实践
20145215<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征来检测:恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有 ...
- Spark 以及 spark streaming 核心原理及实践
收录待用,修改转载已取得腾讯云授权 作者 | 蒋专 蒋专,现CDG事业群社交与效果广告部微信广告中心业务逻辑组员工,负责广告系统后台开发,2012年上海同济大学软件学院本科毕业,曾在百度凤巢工作三年, ...
随机推荐
- sphinx全文检索引擎
今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...
- Python数据处理——numpy_1
python中数据处理最基础的一个包--numpy.它能很好的进行数据准备,类似与R语言中的数据框(DataFrame)一样.今天,就来从最基础的开始学习. import numpy as npdat ...
- 工资不高也要给自己放假 这几款APP估计你用得上
我是这样的一个人,我宁愿工资不高,只要给我足够的假期,那我就满足了.都说上班就是为了赚钱,但如果身体不好,赚再多的钱也是无福享受,所以建议各位,有机会的话,一定要抽出时间去旅游,去放松. 现在我们外出 ...
- [Day03] 循环语句、list相关练习题
用户输入两个数,求平均值. 让用户一直输入数字,如果输入的是'0',终止程序打印所有数字之和. 让用户一直输入数字(只输入数字),如果没输入任何值,终止程序打印所有输入数字的平均值. 求出这个list ...
- Quartz (二) 和Spring整合
先给个场景:每五分钟扫描并关闭7天未付款的订单 1.quartz pom.xml依赖 <dependencies> <dependency> <groupId>or ...
- oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)
1. 相同字段上的多重索引 在Oracle 12c R1之前,一个字段是无法以任何形式拥有多个索引的.或许有人会想知道为什么通常一个字段需要有多重索引,事实上需要多重索引的字段或字段集合是很多的. ...
- Spring框架入门
技术分析之什么是Spring框架 1. Spring框架的概述 * Spring是一个开源框架 * Spring是于2003 年兴起的一个轻量级的Java开发 ...
- LINQ基础(一)
LINQ(Language Integrated Query,语言集成查询),在C#语言中集成了查询语法,可以用相同的语法访问不同的数据源. LINQ提供了不同数据源的抽象层,所以可以使用相同的语法. ...
- PLSQL 保存布局
PLSQL 设置好布局,退出重新登录后,页面布局又恢复原样,所以需要我们保存下我们布局 打开window-->Save layout,保存布局,下次登录布局就是你原来的布局了
- StringTokenizer使用笔记
StringTokenizer 基本使用 笔者最近在做算数表达式的逆波兰式转换和解析,原始表达式为String类型,在使用StringTokenizer 之前笔者的解决思路是 将原始表达式->转 ...