1.简介
  现在很少用到使用MR计算框架来实现功能,通常的做法是使用hive等工具辅助完成。
但是对于其底层MR的原理还是有必要做一些了解。

2.MR客户端程序实现套路

  这一小节总结归纳编写mr客户端程序的一般流程和套路。将以wordcount为例子进行理解。

  运行一个mr程序有三种模式,分别为:本地模式,本地集群模式,命令行集群模式

3.代码实现

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; /**
* 新API中对job提交类的建议写法
*
*/
public class WordCountDriver extends Configured implements Tool{ /**
* 在run方法中对job进行封装
*/
@Override
public int run(String[] args) throws Exception {
Configuration conf = new Configuration(); //先构造一个用来提交我们的业务程序的一个信息封装对象
Job job = Job.getInstance(conf); //指定本job所采用的mapper类
job.setMapperClass(WordCountMapper.class);
//指定本job所采用的reducer类
job.setReducerClass(WordCountReducer.class); //指定我们的mapper类输出的kv数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class); //指定我们的reducer类输出的kv数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); //指定我们要处理的文件所在的路径
FileInputFormat.setInputPaths(job, new Path("/Users/apple/Desktop/temp/data/input/")); //指定我们的输出结果文件所存放的路径
FileOutputFormat.setOutputPath(job, new Path("/Users/apple/Desktop/temp/data/output")); return job.waitForCompletion(true)? :;
} public static void main(String[] args) throws Exception { int res = ToolRunner.run(new Configuration(), new WordCountDriver(), args);
System.exit(res); } //在hadoop中,普通的java类不适合做网络序列化传输,hadoop对java的类型进行了封装,以便于利用hadoop的序列化框架进行序列化传输
public static class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> { /**
* map方法是每读一行调用一次
*/
@Override
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException { //拿到一行的内容
String line = value.toString();
//切分出一行中所有的单词
String[] words = line.split(" ");
//输出<word,1>这种KV对
for(String word:words){
//遍历单词数组,一对一对地输出<hello,1> <tom,1> .......
context.write(new Text(word), new LongWritable()); }
}
} public static class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
/**
* reduce方法是每获得一个<key,valueList>,执行一次
*/
//key : 某一个单词 ,比如 hello
//values: 这个单词的所有v, 封装在一个迭代器中,可以理解为一个list{1,1,1,1.....}
@Override
protected void reduce(Text key, Iterable<LongWritable> values,Context context)
throws IOException, InterruptedException { long count = ;
//遍历该key的valuelist,将所有value累加到计数器中去
for(LongWritable value:values){
count += value.get(); } context.write(key, new LongWritable(count));
} }
}

    

3. 本地模式运行

    使用eclipse编完代码后直接即可运行,但是此种运行只发生在本地,并不会被提交到集群环境运行,换句话说在yarn的web上是无法查询到这个任务的。

  这种模式的好处在于可以方便的debug。

    在此种模式下输入和输出的路径可以指定为本地路径,也可以指定为hdfs路径。如果使用本地路径则上述代码即可执行。当指定为hdfs路且hdfs集群的配置为hadoop2.x的主备

  模式的话则需要引入hdfs-site.xml文件(因为主备模式下hdfs的url是一个service,需要通过配置文件才能解析这个url):

  下述例子为指定hdfs路径为输入输出源头,需要引入xml文件到classpath

        //指定我们要处理的文件所在的路径
FileInputFormat.setInputPaths(job, new Path("hdfs://ns1/wordcountData/input")); //指定我们的输出结果文件所存放的路径
FileOutputFormat.setOutputPath(job, new Path("hdfs://ns1/wordcountData/output"));

  input路径下的文件内容为:

[hadoop@xufeng- temp]$ hadoop fs -cat /wordcountData/input/words.txt
// :: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
aaa bbb
ccc ddd
aaa ccc
ddd eee
eee
ggg ggg hhh
aaa
[hadoop@xufeng- temp]$

  通过eclipse启动的时候会有权限问题,可以在vm中指定用户名:

  

  启动程序,在日志中我们可以看到当前mr是通过本地模式执行的,在查看yarn的监控web,并没有这个任务的记录。

-- ::, INFO  [Thread-] mapred.LocalJobRunner (LocalJobRunner.java:runTasks()) - Waiting for map tasks

  在输出文件夹中查看结果:

[hadoop@xufeng- temp]$ hadoop fs -ls /wordcountData/output
// :: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found items
-rw-r--r-- hadoop supergroup -- : /wordcountData/output/_SUCCESS
-rw-r--r-- hadoop supergroup -- : /wordcountData/output/part-r-
[hadoop@xufeng- temp]$ hadoop fs -cat /wordcountData/output/part-r-
// :: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
aaa
bbb
ccc
ddd
eee
ggg
hhh
[hadoop@xufeng- temp]$

4. 本地集群模式运行

  在eclipse中我们可以直接让程序在集群中运行(如yarn集群)上运行,免去打包等繁琐工作,要想让本地运行的关键需要引入mapred-site.xml 和yarn-site.xml文件

  目的是让本地程序知道当前mr是在什么框架下执行的,并且要知道集群的信息。

  由于如下原因暂未解决:

Diagnostics: File file:/tmp/hadoop-yarn/staging/apple/.staging/job_1469738198989_0009/job.splitmetainfo does not exist
java.io.FileNotFoundException: File file:/tmp/hadoop-yarn/staging/apple/.staging/job_1469738198989_0009/job.splitmetainfo does not exist
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:)

5. 命令行集群模式运行

  这种模式的运行既是将程序打成jar文件后,放到集群环境上去,通过hadoop jar命令来运行,这模式下运行的任务将运行在集群上。

  这种模式非常简单,但是需要在run()方法中指定:

        job.setJarByClass(WordCountDriver.class);

  否则会出现mapper类无法找到的错误。通过这个模式我们无需使用任何配置文件,在eclipse中将程序打包后传上集群主机。使用如下命令即可执行:

hadoop jar wordcount.jar WordCountDriver

  运行日志:

// :: INFO mapreduce.Job:  map % reduce %
// :: INFO mapreduce.Job: map % reduce %
// :: INFO mapreduce.Job: map % reduce %
// :: INFO mapreduce.Job: Job job_1469738198989_0014 completed successfully
// :: INFO mapreduce.Job: Counters:
File System Counters
FILE: Number of bytes read=
FILE: Number of bytes written=
FILE: Number of read operations=
FILE: Number of large read operations=
FILE: Number of write operations=
HDFS: Number of bytes read=

  查看yarn上的监控web:

集中模式的介绍完毕。

  

Hadoop-MR[会用]MR程序的运行模式的更多相关文章

  1. Hadoop_20_MapReduce程序的运行模式

    1.MapReduce程序的运行模式 1. Windows中运行MapReduce程序 (1)mapreduce程序是被提交给LocalJobRunner在本地以单进程的形式运行 (2)而处理的数据及 ...

  2. Qt- 图形界面应用程序的运行模式

    main() 定义主窗口 ————>fd = DefineMainWindow() 创建主窗口————>win = CreateMainWindow() 创建主窗口中的元素-----> ...

  3. Hadoop集群搭建(七)~完全分布运行模式

    我使用的是完全分布运行模式.上一篇安装了JDK,本篇记录Hadoop的安装,版本2.7.2 (一)配置文件 1,先将hadoop安装包解压到module目录下 2,配置hadoop-env.sh.vi ...

  4. C程序汇编运行模式简析

    SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ...

  5. Hadoop之运行模式

    Hadoop运行模式包括:本地模式.伪分布式以及完全分布式模式. 一.本地运行模式 1.官方Grep案例 1)在hadoop-2.7.2目录下创建一个 input 文件夹 [hadoop@hadoop ...

  6. iOS7程序后台运行

    介绍 这次 iOS7 对程序后台运行进行了加强,但是仅仅是加强而已,要想像 Android 程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用. 在介 ...

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

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

  8. 2 weekend110的mapreduce介绍及wordcount + wordcount的编写和提交集群运行 + mr程序的本地运行模式

    把我们的简单运算逻辑,很方便地扩展到海量数据的场景下,分布式运算. Map作一些,数据的局部处理和打散工作. Reduce作一些,数据的汇总工作. 这是之前的,weekend110的hdfs输入流之源 ...

  9. java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    执行Hive查询: Console是这样报错的 java.sql.SQLException: Error from org.apache.hadoop.hive.ql.exec.mr.MapRedTa ...

随机推荐

  1. 楼房 洛谷1382 && codevs2995

    P1382 楼房 题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平 ...

  2. Python程序性能分析模块----------cProfile

    cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...

  3. 透彻掌握Promise的使用,读这篇就够了

    透彻掌握Promise的使用,读这篇就够了 Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. ...

  4. [BZOJ4589]Hard Nim

    description BZOJ 题意:\(n\)堆式子,每堆石子数量为\(\le m\)的质数,对于每一个局面玩\(Nim\)游戏,求后手必胜的方案数. data range \[n\le 10^9 ...

  5. BZOJ1926:[SDOI2010]粟粟的书架——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...

  6. Navcat中Oracle连接的坑-Instant Client

    报错信息: 官方下载Instant Client下载: http://www.oracle.com/technetwork/cn/topics/intel-macsoft-102027-zhs.htm ...

  7. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)

    深夜肝题...有害身心健康QAQ 设f[i]为到达i的概率,d[i]为i的度数. 因为无限久之后炸弹爆炸的概率是1,所以最后在i点爆炸的概率实际上就是f[i]/sigma(f[]) 列出方程组 f[i ...

  8. GCJ2008 APAC local onsites C Millionaire

    自己Blog的第一篇文章,嗯... 接触这道题,是从<挑战程序设计竞赛>这本书看来的,其实头一遍读题解,并没有懂.当然现在已经理解了,想想当初可能是因为考虑两轮的那张概率图的问题.于是决定 ...

  9. Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo

    1.Web Audio API 介绍 Web Audio API 提供了在Web上控制音频的一个非常有效通用的系统 ,这些通用系统通俗的讲就是我们可以利用Web Audio API提供的各种方法操作各 ...

  10. redis 查看所有键值

    zb@zb-computer:/home/wwwroot/default/lion/Admin$ /usr/local/redis/bin/redis-cli 127.0.0.1:6379> k ...