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(可能是Lucene的拼写错误,指的是Apache Lucene,一个流行的全文搜索引擎库)与Hadoop结合的实践操作。Apache Lucene是一个高性能、全功能的文本搜索库,而...
### Windows下使用Hadoop实例详解 #### 一、概述 在Windows环境下搭建并运行Hadoop实例,需要经过一系列步骤,包括但不限于安装Cygwin、配置Java环境、安装配置SSH服务等。本文旨在详细介绍如何在Windows操作系统...
【HADOOP案例及测试资料】是一份涵盖了Hadoop平台搭建、实例运行、源代码分析、测试问题以及基准测试的综合资料集。这份压缩包包含了多个文档,它们分别提供了不同方面的深入理解和实践指导。 首先,"Hadoop平台...
在这个压缩包文件中,包含的“天气测试案例”和“执行脚本”旨在帮助读者更好地理解和实践Hadoop在实际问题解决中的应用。 Hadoop是基于Google的MapReduce编程模型和GFS分布式文件系统理念开发的开源框架,主要用于...
本篇文章将详细介绍Hadoop Eclipse插件的安装与使用,以及通过Eclipse创建和运行Hadoop实例程序的方法。 一、Hadoop Eclipse插件安装 1. 下载Hadoop Eclipse插件:通常,你可以从Apache Hadoop官方网站或第三方...
在这个主题“4、Hadoop多节点部署和测试(HA_HDFS)”中,我们将深入探讨如何在高可用性(HA)模式下配置和测试Hadoop的HDFS(Hadoop分布式文件系统)组件。这里我们将详细讨论涉及的知识点: 1. **HDFS高可用性**:...
【Hadoop安装实例详解】 Hadoop是一个开源的分布式计算框架,由Apache基金会开发,主要用于处理和存储海量数据。本文将详细介绍在Windows 7系统下,使用Cygwin环境进行Hadoop安装的过程,同时提供图文指南。 1. **...
包含完整实例源码,编译配置文件,测试数据,可执行jar文件,执行脚本及操作步骤。学习完此例子后,你能掌握MapReduce基础编程,及如何编译Java文件,打包jar文件,编写shell执行脚本等。后续学习还可以参看本人的...
在测试类中,你需要设置Mapper、Reducer实例,并提供测试数据。例如,对于Mapper的测试: ```java MapDriver, Text, LongWritable, Text> mapDriver = new MapDriver(); mapDriver.withMapper(new ...
07-hadoop中的RPC应用实例demo.avi 08-hdfs下载数据源码跟踪铺 垫.avi 09-hdfs下载数据源码分析-getFileSystem.avi 10-hdfs下载数据源码分析-getFileSystem2.avi 第三天 mapreduce的原理和编程 01-hdfs源码...
本文将详细介绍如何在 CentOS 6.5 环境中部署 Hadoop 2.6 伪分布式环境,包括环境准备、Hadoop 安装、配置和测试等步骤。 环境准备 在开始部署 Hadoop 之前,需要准备好 Linux 环境。这里选择 CentOS 6.5 作为操作...
Hadoop期中考试测试.pdf 本资源摘要信息包含了Hadoop期中考试测试的重要知识点,涵盖了Hadoop的各个组件,包括HDFS、MapReduce、HBase、Hive、Presto、YARN、Flume、Zookeeper等。下面是根据给定的文件信息生成的...
在这个主题中,我们将关注的是"Hadoop Ndnc 气象测试数据",这是一个在Hadoop培训视频中使用的实例,尽管数据量较小,但足以帮助我们理解Hadoop在处理气象数据方面的潜力。 首先,让我们理解"Ndnc"的含义。在Hadoop...
### Hadoop 2.x 编译实例详解 #### 一、环境准备与配置 本章节主要介绍如何在 CentOS 6.5 系统上搭建 Hadoop 2.2.0 的开发环境,并进行编译。 ##### 1.1 安装 JDK 在编译 Hadoop 前,首先需要安装 JDK 并配置其...
3. Federation:NameNode Federation允许在一个Hadoop集群中部署多个NameNode实例,每个实例管理一部分命名空间,解决了单点瓶颈问题,提升了系统的扩展性。 4. Erasure Coding:2.7.2版本开始引入Erasure Coding,...
利用基准测试程序测试Hadoop集群 Hadoop基准测试程序 用户的作业 云上的Hadoop Amazon EC2上的Hadoop 第10章 管理Hadoop HDFS 永久性数据结构 安全模式 日志审计 工具 监控 日志 度量 ...
总的来说,"TestHadoop.rar"是一个关于Hadoop单机测试的实例,包含了完整的程序源码、测试数据以及可能的配置文件,对于学习和实践Hadoop的初学者来说,这是一个非常有价值的参考资料。通过深入理解和实践这个案例,...