Hadoop-MR[会用]MR程序的运行模式

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)? 0:1;
    }

    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(1));

            }
        }
    }

    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 = 0;
            //遍历该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路径下的文件内容为:

[[email protected]1 temp]$ hadoop fs -cat /wordcountData/input/words.txt
16/07/28 18:09:19 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
[[email protected]-1 temp]$

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

  

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

2016-08-17 11:54:02,291 INFO  [Thread-12] mapred.LocalJobRunner (LocalJobRunner.java:runTasks(448)) - Waiting for map tasks

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

[[email protected]1 temp]$ hadoop fs -ls /wordcountData/output
16/07/28 18:22:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2016-07-28 17:58 /wordcountData/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup         42 2016-07-28 17:58 /wordcountData/output/part-r-00000
[[email protected]-1 temp]$ hadoop fs -cat /wordcountData/output/part-r-00000
16/07/28 18:22:52 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
aaa    3
bbb    1
ccc    2
ddd    2
eee    2
ggg    2
hhh    1
[[email protected]-1 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:534)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:747)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:524)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:409)

5. 命令行集群模式运行

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

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

        job.setJarByClass(WordCountDriver.class);

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

hadoop jar wordcount.jar WordCountDriver

  运行日志:

16/07/28 22:31:21 INFO mapreduce.Job:  map 0% reduce 0%
16/07/28 22:31:28 INFO mapreduce.Job:  map 100% reduce 0%
16/07/28 22:31:39 INFO mapreduce.Job:  map 100% reduce 100%
16/07/28 22:31:39 INFO mapreduce.Job: Job job_1469738198989_0014 completed successfully
16/07/28 22:31:39 INFO mapreduce.Job: Counters: 49
    File System Counters
        FILE: Number of bytes read=188
        FILE: Number of bytes written=221659
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=157

  查看yarn上的监控web:

集中模式的介绍完毕。

  

时间: 2024-08-14 07:44:41

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

C程序汇编运行模式简析

SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 在修习LINUX内核这门课的初始阶段,首先需要掌握的就是汇编以及汇编程序对于堆栈的操作. 下面我们就来分析一下一个简单地C程序是如何被汇编程序所表达的! 2. 得到汇编代码 首先,我们写一个简单地C程序,命名为exp1.c: 1 #include <stdio.h> 2 3 int g(int x

MR程序Debug调式或者运行模式

问题描述:在开发MR程序中会遇一些问题需要通过Debug调式,那么本文将介绍描述配置eclipse如何在Windows或者Linux下启动Debug调式. MR程序的Debug调式换言之就是MR程序的运行模式,MR程序有三种运行模式:本地模式(local).集群模式(cluster) Linux环境下: 1.本地模式:直接通过eclipse右键进行Debug即可 2.集群模式: 2.1.将hadoop的配置文件:core-site.xml/hdfs-site.xml/mapreduce-site

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

途径1: 途径2: 途径3: 成功! 由此,可以好好比较下,途径1和途径2 和途径3 的区别. 现在,来玩玩weekend110的joba提交的逻辑之源码跟踪 原来如此,weekend110的job提交的逻辑源码,停在这了 hello world hello tom helllo jim jim is a bad boy hello jack hello baby baby is my nvshen hello world hello tom helllo jim jim is a bad bo

解决hiveserver2报错:java.io.IOException: Job status not available - Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

用户使用的sql: select count( distinct patient_id ) from argus.table_aa000612_641cd8ce_ceff_4ea0_9b27_0a3a743f0fe3; 下面做不同的测试: 1.beeline -u jdbc:hive2://0.0.0.0:10000 -e "select count( distinct patient_id ) from argus.table_aa000612_641cd8ce_ceff_4ea0_9b27_

第六篇:Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)

需求 计算出文件中每个单词的频数.要求输出结果按照单词的字母顺序进行排序.每个单词和其频数占一行,单词和频数之间有间隔. 比如,输入两个文件,其一内容如下: hello world hello hadoop hello mapreduce 另一内容如下: bye world bye hadoop bye mapreduce 对应上面给出的输入样例,其输出样例为: bye   3 hadoop 2 hello 3 mapreduce 2 world 2 方案制定 对该案例,可设计出如下的MapRe

大数据技术之_03_Hadoop学习_02_入门_Hadoop运行模式+【本地运行模式+伪分布式运行模式+完全分布式运行模式(开发重点)】+Hadoop编译源码(面试重点)+常见错误及解决方案

第4章 Hadoop运行模式4.1 本地运行模式4.1.1 官方Grep案例4.1.2 官方WordCount案例4.2 伪分布式运行模式4.2.1 启动HDFS并运行MapReduce程序4.2.2 启动YARN并运行MapReduce程序4.2.3 配置历史服务器4.2.4 配置日志的聚集4.2.5 配置文件说明4.3 完全分布式运行模式(开发重点)4.3.1 虚拟机准备4.3.2 编写集群分发脚本xsync4.3.3 集群配置4.3.4 集群单点启动4.3.5 SSH无密登录配置4.3.6

Hadoop运行模式

Hadoop运行模式 (1)本地模式(默认模式): 不需要启用单独进程,直接可以运行,测试和开发时使用. 即在一台机器上进行操作,仅为单机版. 本地运行Hadoop官方MapReduce案例 操作命令: 执行案例: hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-2.7.2.jar wordcount xxx(文件位置) xxx(输出位置) (2)伪分布式模式: 等同于完全分布式,只有一个节点. 配置集群: 配置:core-s

MapReduce程序运行模式

本地运行模式: mapreduce程序是被提交给LocalJobRunner在本地以单进程的形式运行 而处理的数据及输出结果可以在本地文件系统,也可以在hdfs上 怎样实现本地运行?写一个程序,不要带集群的配置文件 本质是程序的conf中是否有mapreduce.framework.name=local以及yarn.resourcemanager.hostname参数 本地模式非常便于进行业务逻辑的debug,只要在eclipse中打断点即可 集群运行模式: 将mapreduce程序提交给yar

hadoop初学的第一个程序详细讲解-含排错过程

学hadoop,第一个程序当然就是WordCount,这个程序不用自己照着书上抄写,hadoop的安装包里已经带了很多学习示例,其中就包括WordCount,如下图中的最后一个文件就是了 先附上两个测试文件如下: echo "Hello World Bye World" > file01 echo "Hello Hadoop Goodbye Hadoop" > file02 hadoop dfs -mkdir input hadoop dfs -put