`
xuyuanshuaaa
  • 浏览: 396223 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Hadoop的实例测试

阅读更多
Hadoop--海量文件的分布式计算处理方案
   Hadoop 是Google MapReduce的 一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以 不考虑内存泄露一样, MapReduce的run-time系统会解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的失效,并且管理机器之间的通讯请求。这样的 模式允许程序员可以不需要有什么并发处理或者分布式系统的经验,就可以处理超大的分布式系统得资源。
       一、概论

    作为Hadoop程序员,他要做的事情就是:
    1、定义Mapper,处理输入的Key-Value对,输出中间结果。
    2、定义Reducer,可选,对中间结果进行规约,输出最终结果。
    3、定义InputFormat 和OutputFormat,可选,InputFormat将每行输入文件的内容转换为Java类供Mapper函数使用,不定义时默认为String。
    4、定义main函数,在里面定义一个Job并运行它。
  

    然后的事情就交给系统了。
    1.基本概念:Hadoop的HDFS实现了google的GFS文件系统,NameNode作为文件系统的负责调度运行在master, DataNode运行在每个机器上。同时Hadoop实现了Google的MapReduce,JobTracker作为MapReduce的总调度运行 在master,TaskTracker则运行在每个机器上执行Task。

    2.main()函数,创建JobConf,定义Mapper,Reducer,Input/OutputFormat 和输入输出文件目录,最后把Job提交給JobTracker,等待Job结束。

    3.JobTracker,创建一个InputFormat的实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作为Mapper task 的输入,生成Mapper task加入Queue。

    4.TaskTracker 向 JobTracker索求下一个Map/Reduce。
     
      Mapper Task先从InputFormat创建RecordReader,循环读入FileSplits的内容生成Key与Value,传给Mapper函数,处理完后中间结果写成SequenceFile.
      Reducer Task 从运行Mapper的TaskTracker的Jetty上使用http协议获取所需的中间内容(33%),Sort/Merge后(66%),执行Reducer函数,最后按照OutputFormat写入结果目录。

      TaskTracker 每10秒向JobTracker报告一次运行情况,每完成一个Task10秒后,就会向JobTracker索求下一个Task。

      Nutch项目的全部数据处理都构建在Hadoop之上,详见Scalable Computing with Hadoop。

       二、程序员编写的代码

    我们做一个简单的分布式的Grep,简单对输入文件进行逐行的正则匹配,如果符合就将该行打印到输出文件。因为是简单的全部输出,所以我们只要写Mapper函数,不用写Reducer函数,也不用定义Input/Output Format。
package demo.hadoop

public class HadoopGrep {

public static class RegMapper extends MapReduceBase implements Mapper {

   private Pattern pattern;

   public void configure(JobConf job) {
    pattern = Pattern.compile(job.get( " mapred.mapper.regex " ));
   }

   public void map(WritableComparable key, Writable value, OutputCollector output, Reporter reporter)
     throws IOException {
    String text = ((Text) value).toString();
    Matcher matcher = pattern.matcher(text);
    if (matcher.find()) {
     output.collect(key, value);
    }
   }
}

private HadoopGrep () {
} // singleton

public static void main(String[] args) throws Exception {
  
   JobConf grepJob = new JobConf(HadoopGrep. class );
   grepJob.setJobName( " grep-search " );
   grepJob.set( " mapred.mapper.regex " , args[ 2 ]);

   grepJob.setInputPath( new Path(args[ 0 ]));
   grepJob.setOutputPath( new Path(args[ 1 ]));
   grepJob.setMapperClass(RegMapper. class );
   grepJob.setReducerClass(IdentityReducer. class );
      
   JobClient.runJob(grepJob);
}
}


        RegMapper类的configure()函数接受由main函数传入的查找字符串,map() 函数进行正则匹配,key是行数,value是文件行的内容,符合的文件行放入中间结果。
        main()函数定义由命令行参数传入的输入输出目录和匹配字符串,Mapper函数为RegMapper类,Reduce函数是什么都不做,直接把中间结果输出到最终结果的的IdentityReducer类,运行Job。


        整个代码非常简单,丝毫没有分布式编程的任何细节。

          三.运行Hadoop程序

         Hadoop这方面的文档写得不全面,综合参考GettingStartedWithHadoop 与Nutch Hadoop Tutorial 两篇后,再碰了很多钉子才终于完整的跑起来了,记录如下:     

3.1 local运行模式

       完全不进行任何分布式计算,不动用任何namenode,datanode的做法,适合一开始做调试代码。
  3.2 单机集群运行模式,伪分布式模式
   将编译好的HadoopGrep与RegMapper.class 放入hadoop/build/classes/demo/hadoop/目录
   现在将待查找的log文件放入hdfs,。
     执行hadoop/bin/hadoop dfs 可以看到它所支持的文件操作指令。
     执行hadoop/bin/hadoop dfs put log文件所在目录 in ,则log文件目录已放入hdfs的/user/user-name/in 目录中
  现在来执行Grep操作hadoop/bin/hadoop demo.hadoop.HadoopGrep in out
     查看hadoop/logs/里的运行日志,重新执行前。运行hadoop/bin/hadoop dfs rmr out 删除out目录。
     运行hadoop/bin/stop-all.sh 结束
3.3 集群运行模式

  
    四、效率

   经测试,Hadoop并不是万用灵丹,很取决于文件的大小和数量,处理的复杂度以及群集机器的数量,相连的带宽,当以上四者并不大时,hadoop优势并不明显。
   比如,不用hadoop用java写的简单grep函数处理100M的log文件只要4秒,用了hadoop local的方式运行是14秒,用了hadoop单机集群的方式是30秒,用双机集群10M网口的话更慢,慢到不好意思说出来的地步。

另外一个程序例子:
package org;  
  
import java.io.IOException;  
import java.util.StringTokenizer;  
  
import org.apache.hadoop.io.IntWritable;  
import org.apache.hadoop.io.Text;  
import org.apache.hadoop.mapreduce.Mapper;  
  
public class MyMap extends Mapper<Object, Text, Text, IntWritable> {  
    private final static IntWritable one = new IntWritable(1);  
  
    private Text word;  
  
    public void map(Object key, Text value, Context context)  
            throws IOException, InterruptedException {  
  
        String line = value.toString();  
        StringTokenizer tokenizer = new StringTokenizer(line);  
        while (tokenizer.hasMoreTokens()) {  
            word = new Text();  
            word.set(tokenizer.nextToken());  
            context.write(word, one);  
        }  
    }  
} 

    package org;  
      
    import java.io.IOException;  
      
    import org.apache.hadoop.io.IntWritable;  
    import org.apache.hadoop.io.Text;  
    import org.apache.hadoop.mapreduce.Reducer;  
      
    public class MyReduce extends  
            Reducer<Text, IntWritable, Text, IntWritable> {  
        public void reduce(Text key, Iterable<IntWritable> values, Context context)  
                throws IOException, InterruptedException {  
            int sum = 0;  
            for (IntWritable val : values) {  
                sum += val.get();  
            }  
            context.write(key, new IntWritable(sum));  
        }  
    }  

    package org;  
      
    import org.apache.hadoop.conf.Configuration;  
    import org.apache.hadoop.fs.Path;  
    import org.apache.hadoop.io.IntWritable;  
    import org.apache.hadoop.io.Text;  
    import org.apache.hadoop.mapreduce.Job;  
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
      
    public class MyDriver {  
      
          
        public static void main(String[] args) throws Exception,InterruptedException {  
            Configuration conf=new Configuration();  
              
           Job job=new Job(conf,"Hello Hadoop");  
             
           job.setJarByClass(MyDriver.class);           
            
           job.setMapOutputKeyClass(Text.class);      
           job.setMapOutputValueClass(IntWritable.class);  
             
           job.setOutputKeyClass(Text.class);  
           job.setOutputValueClass(IntWritable.class);  
             
           job.setMapperClass(MyMap.class);  
            job.setCombinerClass(MyReduce.class);  
            job.setReducerClass(MyReduce.class);  
              
            job.setInputFormatClass(TextInputFormat.class);            
            job.setOutputFormatClass(TextOutputFormat.class);          
              
            FileInputFormat.setInputPaths(job, new Path(args[0]));  
              
            FileOutputFormat.setOutputPath(job, new Path(args[1]));  
          // JobClient.runJob(conf);  
           job.waitForCompletion(true);  
           }  
      
    }  
分享到:
评论

相关推荐

    luncen写入hadoop实例

    【标题】"luncen写入Hadoop实例"涉及到的是使用Luncen(可能是Lucene的拼写错误,指的是Apache Lucene,一个流行的全文搜索引擎库)与Hadoop结合的实践操作。Apache Lucene是一个高性能、全功能的文本搜索库,而...

    Windows下使用Hadoop实例

    ### Windows下使用Hadoop实例详解 #### 一、概述 在Windows环境下搭建并运行Hadoop实例,需要经过一系列步骤,包括但不限于安装Cygwin、配置Java环境、安装配置SSH服务等。本文旨在详细介绍如何在Windows操作系统...

    HADOOP案例及测试资料

    【HADOOP案例及测试资料】是一份涵盖了Hadoop平台搭建、实例运行、源代码分析、测试问题以及基准测试的综合资料集。这份压缩包包含了多个文档,它们分别提供了不同方面的深入理解和实践指导。 首先,"Hadoop平台...

    hadoop权威指南天气测试案例和执行脚本

    在这个压缩包文件中,包含的“天气测试案例”和“执行脚本”旨在帮助读者更好地理解和实践Hadoop在实际问题解决中的应用。 Hadoop是基于Google的MapReduce编程模型和GFS分布式文件系统理念开发的开源框架,主要用于...

    hadoop eclips 的插件 和实例程序

    本篇文章将详细介绍Hadoop Eclipse插件的安装与使用,以及通过Eclipse创建和运行Hadoop实例程序的方法。 一、Hadoop Eclipse插件安装 1. 下载Hadoop Eclipse插件:通常,你可以从Apache Hadoop官方网站或第三方...

    4、hadoop 多节点部署和测试(HA_HDFS)

    在这个主题“4、Hadoop多节点部署和测试(HA_HDFS)”中,我们将深入探讨如何在高可用性(HA)模式下配置和测试Hadoop的HDFS(Hadoop分布式文件系统)组件。这里我们将详细讨论涉及的知识点: 1. **HDFS高可用性**:...

    hadoop 安装实例

    【Hadoop安装实例详解】 Hadoop是一个开源的分布式计算框架,由Apache基金会开发,主要用于处理和存储海量数据。本文将详细介绍在Windows 7系统下,使用Cygwin环境进行Hadoop安装的过程,同时提供图文指南。 1. **...

    Hadoop之MapReduce编程实例完整源码

    包含完整实例源码,编译配置文件,测试数据,可执行jar文件,执行脚本及操作步骤。学习完此例子后,你能掌握MapReduce基础编程,及如何编译Java文件,打包jar文件,编写shell执行脚本等。后续学习还可以参看本人的...

    Hadoop MRUnit测试

    在测试类中,你需要设置Mapper、Reducer实例,并提供测试数据。例如,对于Mapper的测试: ```java MapDriver, Text, LongWritable, Text&gt; mapDriver = new MapDriver(); mapDriver.withMapper(new ...

    新版Hadoop视频教程 段海涛老师Hadoop八天完全攻克Hadoop视频教程 Hadoop开发

    07-hadoop中的RPC应用实例demo.avi 08-hdfs下载数据源码跟踪铺 垫.avi 09-hdfs下载数据源码分析-getFileSystem.avi 10-hdfs下载数据源码分析-getFileSystem2.avi 第三天 mapreduce的原理和编程 01-hdfs源码...

    hadoop2.6 centos6.5 伪分布式环境部署 实例

    本文将详细介绍如何在 CentOS 6.5 环境中部署 Hadoop 2.6 伪分布式环境,包括环境准备、Hadoop 安装、配置和测试等步骤。 环境准备 在开始部署 Hadoop 之前,需要准备好 Linux 环境。这里选择 CentOS 6.5 作为操作...

    Hadoop期中考试测试.pdf

    Hadoop期中考试测试.pdf 本资源摘要信息包含了Hadoop期中考试测试的重要知识点,涵盖了Hadoop的各个组件,包括HDFS、MapReduce、HBase、Hive、Presto、YARN、Flume、Zookeeper等。下面是根据给定的文件信息生成的...

    Hadoop Ndnc 气象测试数据

    在这个主题中,我们将关注的是"Hadoop Ndnc 气象测试数据",这是一个在Hadoop培训视频中使用的实例,尽管数据量较小,但足以帮助我们理解Hadoop在处理气象数据方面的潜力。 首先,让我们理解"Ndnc"的含义。在Hadoop...

    hadoop2.x编译实例

    ### Hadoop 2.x 编译实例详解 #### 一、环境准备与配置 本章节主要介绍如何在 CentOS 6.5 系统上搭建 Hadoop 2.2.0 的开发环境,并进行编译。 ##### 1.1 安装 JDK 在编译 Hadoop 前,首先需要安装 JDK 并配置其...

    hadoop-2.7.2.tar.gz

    3. Federation:NameNode Federation允许在一个Hadoop集群中部署多个NameNode实例,每个实例管理一部分命名空间,解决了单点瓶颈问题,提升了系统的扩展性。 4. Erasure Coding:2.7.2版本开始引入Erasure Coding,...

    Hadoop权威指南 第二版(中文版)

     利用基准测试程序测试Hadoop集群  Hadoop基准测试程序  用户的作业  云上的Hadoop  Amazon EC2上的Hadoop 第10章 管理Hadoop  HDFS  永久性数据结构  安全模式  日志审计  工具  监控  日志  度量  ...

    TestHadoop.rar

    总的来说,"TestHadoop.rar"是一个关于Hadoop单机测试的实例,包含了完整的程序源码、测试数据以及可能的配置文件,对于学习和实践Hadoop的初学者来说,这是一个非常有价值的参考资料。通过深入理解和实践这个案例,...

Global site tag (gtag.js) - Google Analytics