Hadoop化繁为简 探索Mapreduce简要原理与实践

编辑:光环大数据 来源: 互联网 时间: 2017-11-09 13:40 阅读:

目录-探索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的环境部署、分布式文件系统还为入门,可参照下述文章:

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, stdoutlog4j.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)如果遇到其他问题,欢迎留言。如果哪里有写的不当或者不够完善的,欢迎提出建议,以便博主完善为网友提供更加优质的文章。

 

  大数据时代Hadoop培训大数据培训培训班,就选光环大数据!

 


大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服

你可能也喜欢这些

在线客服咨询

领取资料

X
立即免费领取

请准确填写您的信息

点击领取
#第三方统计代码(模版变量) '); })();
'); })();