`
isiqi
  • 浏览: 16484410 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Hadoop in aciton

阅读更多

背景:hadoop应该是一个mapreduce框架,它封装了程序分布的细节,使开发者只关注最重要的应用,即

Map reduce.本文以单机为基础,略去了一些细节, 剖析了其主要流程。

废话少说,开始实战:

首先写个测试类:

publicclassWordCount...{



publicstaticclassRegexMapperextendsMapReduceBaseimplementsMapper...{

privatePatternpattern;



privateintgroup;



publicvoidconfigure(JobConfjob)...{

pattern
=Pattern.compile(job.get("mapred.mapper.regex"));

group
=job.getInt("mapred.mapper.regex.group",0);

}




publicvoidmap(WritableComparablekey,Writablevalue,

OutputCollectoroutput,Reporterreporter)
throwsIOException...{

Stringtext
=((UTF8)value).toString();

Matchermatcher
=pattern.matcher(text);

while(matcher.find())...{

output.collect(
newUTF8(matcher.group(group)),newLongWritable(1));

}


}




}




publicstaticclassLongSumReducerextendsMapReduceBaseimplementsReducer...{

publicvoidconfigure(JobConfjob)...{

}




publicvoidreduce(WritableComparablekey,Iteratorvalues,

OutputCollectoroutput,Reporterreporter)
throwsIOException...{

longsum=0;

while(values.hasNext())...{

sum
+=((LongWritable)values.next()).get();

}


output.collect(key,
newLongWritable(sum));

}




publicvoidclose()throwsIOException...{

//TODOAuto-generatedmethodstub



}


}




publicstaticvoidmain(String[]args)throwsIOException...{

//NutchConfdefaults=NutchConf.get();

JobConfjob
=newJobConf(WordCount.class);

job.setInputPath(
newPath("E:/hadoop_input"));



job.setMapperClass(RegexMapper.
class);

job.set(
"mapred.mapper.regex","a");

//job.set("mapred.mapper.regex.group",args[3]);

job.setReducerClass(LongSumReducer.
class);

job.setOutputPath(
newPath("E:/hadoop_output"));

job.setOutputKeyClass(UTF8.
class);

job.setOutputValueClass(LongWritable.
class);

JobClient.runJob(job);

}




}


我们在这个测试类中定义了自己的map类和reduce类,并实例化一个job,交给JobClent.到此开发者的任务就完成了,下面看看其主要流程:

1)整体概览

1.1)JobClient的静态方法runJob创建一个JobClient实例,实例化的过程中会主

创建一个本地或分布式的runner,在本案中是本地,即一个LocalJobRunner实例

1.2 JobClient的静态方法runJob接着调用JobClient实例的submitJob方法

1.3)JobClient实例的submitJob会调用LocalJobRunner实例的submitJob

1.4) LocalJobRunner实例的submitJob方法会实例化其内部类Job

1.5)上面的Job实例实际上是个线程,在其构造函数中会启动本身这个线程,来完成mapreduce 工作

1.6) JobClient的静态方法runJob会不断地轮循这个线程是否完工,并且打出工作进程报告。

由此可见核心的工作在上面的1.5,其实分为两步,map--->reduce

2map过程

根据map目录中的文件数逐个实例化MapTask对象,下面的代码一目了然

for(inti=0;i<splits.length;i++)...{

mapIds.add(
"map_"+newId());

MapTaskmap
=newMapTask(file,(String)mapIds.get(i),splits[i]);

map.setConf(job);

map_tasks
+=1;

map.run(job,
this);

map_tasks
-=1;

}


核心的两步实例化MapTask和调用其run方法

2.1)在调用run的过程中,首先实例化Sequence类的静态内部类Writer.

在此过程中会产生临时目录/tmp/hadoop/mapred/local/map-xxxxx,xxxxxx6位小写字母和数字的随机数

目录下是两个文件part-0.out.crcpart-0.out

2.2)实例化一个匿名内部类,该类实现了OutPutCollector接口,用于你写的Map类回调并将结果写入到上面的文件当中

2.3)接着实例化你定义Map

2.4)实例化MapRunnable的实现类(可配置,默认MapRunner类)Map Runner对你写的Map进行了简单的封

2.5)调用MapRunnable实例的run

2.6)MapRunnable实例的run方法调用你定义的Map类的map方法,传给map方法的是一个个的文档内容

2.7 )自定义的map方法会将文档内容转化成n (key value),并调用上面所说的OutPutCollector写入临时文件

map实际上做了一个转换即你输入的一个个文档,转化成一个个(key ,value) key是文本中匹配的词,value1

3)reduce过程

3.1)将上面map输出的临时文件重命名为reduce输入文件

3.2)实例化ReduceTask

3.3)调用ReduceTask实例的run

3.4)实例化自定义的reduce

3.5)实例化SequenceFile类的内部静态类Sorter开始对输入排序,并启动一个线程监视其排序进程,排序过程将输入文件转化排序文件

3.6)排完序,实例化一个匿名内部类,该类也实现了OutPutCollector接口,

3.7)实例化SequenceFile类的内部静态类Reader来读取排序文件

3.8)实例化ValuesIterator用于遍历排序文件

3.9)调用自定义的reduce类的实例reduce方法,并将结果写到最终的输出文件

reduce过程首先对map 输出的结果进行排序,然后通过ValuesIterator作了个变化使得自定义的reduce的输入是(key ,values),这样有利于reduce.

综合起来看mapreduce是这样一个过程

原始输入的文档,你可以认为是(文档id,文档)-------〉(匹配的词,值(本案为1))这个集合会有重复-------〉排序-------〉转换为(匹配的词,值集合),这个集合没有重复------〉输出

分享到:
评论

相关推荐

    Hadoop In Action2

    Hadoop In Action 中文第二版 卷二 rar

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

    《Hadoop权威指南中文版(第二版)》与《Hadoop in Action》及《Pro Hadoop》这三本书是深入理解和掌握Hadoop生态系统的关键资源。Hadoop作为一个分布式计算框架,其核心是解决大规模数据处理的问题,它允许在廉价...

    Sams Teach Yourself Hadoop in 24 Hours epub

    Sams Teach Yourself Hadoop in 24 Hours 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    Hadoop in Action

    HIGHLIGHT Hadoop in Action is an example-rich tutorial that shows developers how to implement data-intensive distributed computing using Hadoop and the Map- Reduce framework. DESCRIPTION Hadoop is an ...

    Hadoop硬实战:Hadoop in Practice

    Hadoop硬实战:Hadoop in Practice

    Hadoop in Action(英文版)

    《Hadoop in Action》是一本深入探讨Hadoop及其生态系统核心组件的权威书籍,主要涵盖了分布式存储系统HDFS(Hadoop Distributed File System)和并行计算框架MapReduce。这本书旨在帮助读者理解Hadoop的工作原理,...

    Hadoop In Practice (英文)

    《Hadoop In Practice》是一本深入探讨Hadoop及其生态系统实践应用的专业书籍,旨在帮助读者掌握在实际工作中使用Hadoop的技巧和策略。本书涵盖了Hadoop的核心组件,包括HDFS(Hadoop分布式文件系统)和MapReduce,...

    Hadoop In Action (Hadoop实战)中文版

    ### Hadoop In Action (Hadoop实战)中文版 #### Hadoop概述 Hadoop是一个能够对大量数据进行分布式处理的软件框架。它通过提供一个高可靠性、高性能、可扩展的平台来处理海量数据集,使组织能够高效地存储、处理和...

    hadoop in practice 第二版英文版几源代码

    《Hadoop in Practice》是大数据领域的一本经典著作,由Alex Woodie撰写,主要面向有一定编程基础和技术热情的读者。这本书的第二版提供了更全面、更深入的Hadoop实践知识,帮助读者理解并掌握分布式计算的核心概念...

    Hadoop_in_Action

    PART 2 - Hadoop in Action CHAPTER 4 Writing basic MapReduce programs CHAPTER 5 Advanced MapReduce CHAPTER 6 Programming practices CHAPTER 7 Cookbook CHAPTER 8 Managing Hadoop PART 3 - Hadoop Gone Wild...

    Hadoop In Action 中文版

    《Hadoop In Action》中文版是一本专门为对大数据处理感兴趣的读者设计的专业书籍,它深入浅出地介绍了Hadoop生态系统的核心概念和技术。Hadoop是Apache软件基金会的一个开源项目,旨在提供分布式存储和计算的能力,...

    hadoop in action中文电子版

    《Hadoop in Action》中文电子版是一本深入探讨Hadoop技术的专业书籍,旨在帮助读者全面理解和掌握这个分布式计算框架的核心概念、工作原理及其在实际应用中的使用方法。Hadoop是大数据处理领域的重要工具,它的出现...

    Hadoop in action中文版.pdf

    从个人经历看,学习这些技术...幸好我发现了Manning出版社的In Action系列 丛书,它们正与此目标相吻合,而且出版社有一群优秀的编辑帮助我达成目标。 我非常享受写作这本书的时光,希望它能为你开启畅游Hadoop的旅途。

    Hadoop in Practice

    Hadoop in Practice collects 85 Hadoop examples and presents them in a problem/solution format. Each technique addresses a specific task you'll face,

Global site tag (gtag.js) - Google Analytics