MapReduce实例&YARN框架

一个wordcount程序

统计一个相当大的数据文件中,每个单词出现的个数。

一、分析map和reduce的工作

map:

  1. 切分单词
  2. 遍历单词数据输出

reduce:

对从map中得到的数据的valuelist遍历累加,得到一个单词的总次数

二、代码

WordCountMapper(继承Mapper)

重写Mapper类的map方法。

mapreduce框架每读一行数据就调用一次该方法,map的具体业务逻辑就写在这个方法体中。

  1. map和reduce的数据输入输出都是以key-value对的形式封装的
  2. 4个泛型中,前两个(KEYIN, VALUEIN)指定mapper输入数据的类型, 后两个(KEYOUT, VALUEOUT)指定输出数据的类型
  3. 默认情况下,框架传递给mapper的输入数据中,key是要处理的文本中一行的起始偏移量,value是这行的内容
  4. 由于输入输出在结点中通过网络传递,数据需要序列化,但JDK自带的序列化机制会有附加信息冗余,对于大量数据传输不合适,因此 <Long, String, String, Long> -> <LongWritable, Text, Text, LongWritable>
  5. 业务中要处理的数据已经作为参数key-value被传递进来了,处理后的输出是调用context.write()写入到context
package cn.thousfeet.hadoop.mapreduce.wordcount;

import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable>{ @Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
throws IOException, InterruptedException { String line = value.toString(); String[] words = StringUtils.split(line," "); //切分单词 for(String word : words) //遍历 输出为key-value( <word,1> )
{
context.write(new Text(word), new LongWritable(1));
} } }

WordCountReducer(继承Reducer)

重写Reducer类的reduce方法。

框架在map处理完成后,将所有的key-value对缓存起来进行分组,然后传递到一个组 <key,values{}> (对于wordcount程序,拿到的就是类似 <hello,{1,1,1,1...}>),然后调用一次reduce方法。

package cn.thousfeet.hadoop.mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{ @Override
protected void reduce(Text key, Iterable<LongWritable> valueList,
Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException { long count = 0; for(LongWritable value : valueList) //遍历value list累加求和
{
count += value.get();
} context.write(key, new LongWritable(count)); //输出这一个单词的统计结果
}
}

WordCountRunner

用于描述job。

比如,该作业使用哪个类作为逻辑处理中的map,哪个作为reduce。还可以指定该作业要处理的数据所在的路径,和输出的结果放到哪个路径。

package cn.thousfeet.hadoop.mapreduce.wordcount;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text; public class WordCountRunner { public static void main(String[] args) throws Exception { Configuration conf = new Configuration();
Job job = Job.getInstance(conf); //设置整个job所用的那些类在哪个jar包
job.setJarByClass(WordCountRunner.class); //指定job使用的mapper和reducer类
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class); //指定reduce和mapper的输出数据key-value类型
job.setOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class); //指定mapper的输出数据key-value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class); //指定原始输入数据的存放路径
FileInputFormat.setInputPaths(job, new Path("/wordcount/srcdata/")); //指定处理结果数据的存放路径
FileOutputFormat.setOutputPath(job, new Path("/wordcount/output/")); //将job提交给集群运行 参数为true时会打印运行进度
job.waitForCompletion(true);
}
}

上传到集群中运行

export成一个jar包,上传到虚拟机上。

分发到集群运行:hadoop jar wordcount.jar cn.thousfeet.hadoop.mapreduce.wordcount.WordCountRunner

查看输出结果:

(可以看到按key的字典序升序排序)

MapReduce程序几种不同的提交运行模式

方式一:本机的JVM运行

首先,因为要在windows下直接调试,需要在eclipse的设置 Run Configurations->arguments->vm arguments ,添加-DHADOOP_USER_NAME=对应用户

如需在本地直接run main方法(MapReduce程序在本机的JVM运行),要把输入输出路径改为hdfs全路径或把site.xml配置文件拖进来(或用在windows本地目录下的数据也行,MapReduce程序的运行和数据来源在哪无关)。

方式二:本地debug实际运行在集群

如需实现在本地run main方法而MapReduce实际运行在集群(这种方式必须在linux下),应:

  1. 将mapred-site.xml和yarn-site.xml拖到工程的src目录下(或给conf配置mapreduce.framework.nameyarn.resourcemanager.hostname等参数)
  2. 给工程导出一个jar包(比如放在工程目录下),配置该job的jar包的路径conf.set("mapreduce.job.jar","wordcount.jar");

(在windows下要用这种方法需要修改hadoop的YarnRunner这个类的源码,或者安装插件什么的..)

提交到yarn集群的job可以在yarn的管理页面(8088端口)看到。

yarn框架的运行机制

yarn只负责资源的分配,然后启动运算框架的主管进程AppMaster(如运算框架是MapReduce时主管进程就是它的MRAppMaster),剩下的工作就不由yarn去做了。

MapReduce只适合做数据的批量离线处理,而不适用于实时性的需求,要实现实时性要使用的运算框架是spark、storm那些,但都可以放在yarn框架下。yarn和运算框架分离的策略使得hadoop具有广泛的实用性和生命力。

yarn提交job的流程(关键源码)

坑点

org.apache.hadoop.security.AccessControlException

运行程序后查看output文件夹能看到运行成功了,但是cat查看part-r-00000的时候报错

error creating legacy BlockReaderLocal. Disabling legacy local reads.

org.apache.hadoop.security.AccessControlException: Can't continue with getBlockLocalPathInfo() authorization. The user thousfeet is not configured in dfs.block.local-path-access.user

解决方法是hdfs-site.xml中的配置项dfs.client.read.shortcircuit=false

woc,这个参数其实原本默认就是false...突然想起这不是上次配置出错的时候病急乱投医加上的吗,果然乱跟教程害死人orzz

(参考:http://www.51testing.com/html/59/445759-821244.html)

MapReduce实例&YARN框架的更多相关文章

  1. MapReduce和YARN框架

    MapReduce组件如图

  2. Hadoop HDFS, YARN ,MAPREDUCE,MAPREDUCE ON YARN

    HDFS 系统架构图 NameNode 是主节点,存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DataNode等.NameNode将 ...

  3. 大数据基础总结---MapReduce和YARN技术原理

    Map Reduce和YARN技术原理 学习目标 熟悉MapReduce和YARN是什么 掌握MapReduce使用的场景及其原理 掌握MapReduce和YARN功能与架构 熟悉YARN的新特性 M ...

  4. Hadoop MapReduceV2(Yarn) 框架简介[转]

    对于业界的大数据存储及分布式处理系统来说,Hadoop 是耳熟能详的卓越开源分布式文件存储及处理框架,对于 Hadoop 框架的介绍在此不再累述,读者可参考 Hadoop 官方简介.使用和学习过老 H ...

  5. Hadoop MapReduceV2(Yarn) 框架简介

    http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ 对于业界的大数据存储及分布式处理系统来说,Hadoop 是耳熟能详 ...

  6. 3 weekend110的job提交的逻辑及YARN框架的技术机制 + MR程序的几种提交运行模式

    途径1: 途径2: 途径3: 成功! 由此,可以好好比较下,途径1和途径2 和途径3 的区别. 现在,来玩玩weekend110的joba提交的逻辑之源码跟踪 原来如此,weekend110的job提 ...

  7. YARN应用程序开发流程(类似于MapReduce On Yarn)本内容版权归(小象学院所有)

    MapReduce On Yarn和MapReduce程序区别 MapReduce On Yarn(由专业人员开发)1 为MapReduce作业运行在YARN上提供一个通用的运行时环境2 需要与Yar ...

  8. Hadoop学习之YARN框架

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/,非常感谢分享! 对于业界的大数据存储及分布式处理系统来说,H ...

  9. YARN框架详解

    YARN框架详解 YARN官方解释 YARN是什么 The fundamental(定义) idea of YARN is to split(分开) up the functionalities(功能 ...

随机推荐

  1. [转]验证发生前无法调用 Page.IsValid。应在 CausesValidation=True 且已启动回发的控件

    在ASP.Net中,为了方便表单的验证,提供了验证控件来完成表单输入数据的验证.这些验证控件确实是功能强大,为写表单程序提供了极大的便利.但是,在不熟悉的情况下,经常碰到问题.其中,最常见的是遇到错误 ...

  2. webapi找到了与该请求匹配的多个操作

    关于这个问题是路由在找方法的时候层没有指定对,同一个链接,同样的参数导致路由找不到方法导致的报错,可以在WebApiConfig中多配置一层,比如"api/{controller}/{act ...

  3. Dev中自带添加、编辑、删除等按钮的文字颜色等修改

    下面是ASPxGridView的自带按钮的文字等修改 <SettingsCommandButton> <NewButton Text=" " Image-Tool ...

  4. SQL 修改表字段失败 解决方法

    OK  大功告成 !!!

  5. C# UML类图及类之间的几种关系

    今天晚上看了大话设计模式中的UML类图这一节感觉受益匪浅,好多年不能理解的类之间的关系理解了. 一.UML类图的表示方法 1.类的表示方法 A类用一个矩形框分三层表示,第一层是类名,斜体类名表示抽象类 ...

  6. Java多线程学习之线程的取消与中断机制

    任务和线程的启动很容易.在大多数情况下我们都会让他们运行直到结束,或是让他们自行停止.但是,有时我们希望提前结束任务或是线程,可能是因为用户请求取消,或是线程在规定时间内没有结束,或是出现了一些问题迫 ...

  7. 【Java】字符拼接成字符串的注意点

    这两天敲代码的时候,偶然间发现一个好玩的事情,分享一下,记录一下. 该段代码主要是:先产生的几个整数,把整数转换成对应的字符,最后的字符拼接成字符串,在把字符拼接成字符串的时候,个人因为偷懒使用+号进 ...

  8. Vue 基本指令和html常用标签结合使用综合案例(含代码)

    最近项目中要开发一个OA审批:里边涉及到流程跳转(流程较多),具体方案有:直接下一步,选择参与人或者选择某一个流程之后再选择参与人: 我们前端是APiCloud开发,这里我主要使用Vue来实现,把实现 ...

  9. 使用Hexo和Github Pages快速搭建个人博客

    在编程路上,每天都在网上查看别人的博客,大牛的文章写得通俗易懂,同时博客网站也非常华丽.作为出入编程的一枚小白也想拥有这样一个自己的网站.那就立马去买一个域名了,在网上找教程来搭建. 搭建的过程还算比 ...

  10. [h5+api]移动app开发用到的微信好友,朋友圈,qq好友,新浪微博分享合集

    适用H5+环境,能够使用plus方法的移动app中 /** * Created by HBuilder. * User: tyx * Date: 2018-11-21 * Time: 17:28:51 ...