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. 一张图看懂Sprint Planning Meeting

    本文主要参考<Scrum精髓>这本书的内容 每个Sprint都是从Sprint Planning Meeting开始,Scrum团队成员聚集在一起商定下个Sprint目标,并且确定在Spr ...

  2. js new Date() 获取时间

    转载:https://www.cnblogs.com/xiaoshujiang/p/5518462.html 一,Date付给初始值,并构造new Date() Date 对象用于处理日期和时间.创建 ...

  3. VS2015编译OpenSSL

    概述 OpenSSL 是一个开源的第三方库,它实现了 SSL(Secure SocketLayer)和 TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的 ...

  4. Hive 编程指南—笔记

    1. 基础 1.1 Hive 解决问题的背景? 用户如何从一个现有的数据基础架构转移到 Hadoop 上,而这个基础架构是基于传统的关系数据库和 SQL 的? Hive 提供了一个被称为 HQL 的 ...

  5. windows主机网络信息获取程序设计

    掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换.掌握这些API函数调用的错误处理方法. 利用本地 ...

  6. vue 如何将输入框的输入自动小写转大写(使用 v-model 时采取另一种方式)

    前言:小写转大写,可以用过滤器实现,但当使用 v-model 时就不行了,这里有解决方案.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9289205.html ...

  7. 第二十四天- 模块导入 import from xxx import xxx

    # 模块:# 模块就是⼀个包含了python定义和声明的⽂件,⽂件名就是模块的名字加上.py后缀# 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀个模块# 为何用模块:写大项目时,把相关的功能进⾏分 ...

  8. HTML 5 <input> placeholder 属性 实现搜索框提示文字点击输入后消失

    H5之前要实现这个功能还要用到JS,H5出来之后新增加了placeholder属性,有了这个属性就就能轻松实现这个功能. 定义和用法 placeholder 属性提供可描述输入字段预期值的提示信息(h ...

  9. CSS 画一个心

    效果图: 实现原理: 可以把这个心分为两部分,两个长方形,分别设置 border-radius,transform: rotate() . 设置属性之后 再次添加一个,设置相反的 rotate 设置其 ...

  10. ubuntu将python3设为默认后再安装支持python3.x的包

    简介: ubuntu默认python2.7版本,如果想要装python3.x版本,请记住python2.7版本一定不能卸载!!!但是即使我 python3.x版本安装成功,当运行python脚本时,系 ...