- 浏览: 561546 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
假设我们需要处理一批有关天气的数据,其格式如下: 0067011990999991950051507+0000+ 0043011990999991950051512+0022+ 0043011990999991950051518-0011+ 0043012650999991949032412+0111+ 0043012650999991949032418+0078+ 0067011990999991937051507+0001+ 0043011990999991937051512-0002+ 0043011990999991945051518+0001+ 0043012650999991945032412+0002+ 0043012650999991945032418+0078+ 现在需要统计出每年的最高温度。 Map-Reduce主要包括两个步骤:Map和Reduce 每一步都有key-value对作为输入和输出: 对于上面的例子,在map过程,输入的key-value对如下: (0, 0067011990999991950051507+0000+) (33, 0043011990999991950051512+0022+) (66, 0043011990999991950051518-0011+) (99, 0043012650999991949032412+0111+) (132, 0043012650999991949032418+0078+) (165, 0067011990999991937051507+0001+) (198, 0043011990999991937051512-0002+) (231, 0043011990999991945051518+0001+) (264, 0043012650999991945032412+0002+) (297, 0043012650999991945032418+0078+) 在map过程中,通过对每一行字符串的解析,得到年-温度的key-value对作为输出: (1950, 0) (1950, 22) (1950, -11) (1949, 111) (1949, 78) (1937, 1) (1937, -2) (1945, 1) (1945, 2) (1945, 78) 在reduce过程,将map过程中的输出,按照相同的key将value放到同一个列表中作为reduce的输入 (1950, [0, 22, –11]) (1949, [111, 78]) (1937, [1, -2]) (1945, [1, 2, 78]) 在reduce过程中,在列表中选择出最大的温度,将年-最大温度的key-value作为输出: (1950, 22) (1949, 111) (1937, 1) (1945, 78) 其逻辑过程可用如下图表示: 编写Map-Reduce程序,一般需要实现两个函数:mapper中的map函数和reducer中的reduce函数。 一般遵循以下格式: public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable { void map(K1 key, V1 value, OutputCollector<K2, V2> output, Reporter reporter) throws IOException; } public interface Reducer<K2, V2, K3, V3> extends JobConfigurable, Closeable { void reduce(K2 key, Iterator<V2> values, OutputCollector<K3, V3> output, Reporter reporter) throws IOException; } 对于上面的例子,则实现的mapper如下: public class MaxTemperatureMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { @Override public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.toString(); String year = line.substring(15, 19); int airTemperature; if (line.charAt(25) == '+') { airTemperature = Integer.parseInt(line.substring(26, 30)); } else { airTemperature = Integer.parseInt(line.substring(25, 30)); } output.collect(new Text(year), new IntWritable(airTemperature)); } } 实现的reducer如下: public class MaxTemperatureReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int maxValue = Integer.MIN_VALUE; while (values.hasNext()) { maxValue = Math.max(maxValue, values.next().get()); } output.collect(key, new IntWritable(maxValue)); } } 欲运行上面实现的Mapper和Reduce,则需要生成一个Map-Reduce得任务(Job),其基本包括以下三部分: 欲配置JobConf,需要大致了解Hadoop运行job的基本原理: public interface Partitioner<K2, V2> extends JobConfigurable { int getPartition(K2 key, V2 value, int numPartitions); } 下图大概描述了Map-Reduce的Job运行的基本原理: 下面我们讨论JobConf,其有很多的项可以进行配置: 当然不用所有的都设置,由上面的例子,可以编写Map-Reduce程序如下: public class MaxTemperature { public static void main(String[] args) throws IOException { if (args.length != 2) { System.err.println("Usage: MaxTemperature <input path> <output path>"); System.exit(-1); } JobConf conf = new JobConf(MaxTemperature.class); conf.setJobName("Max temperature"); FileInputFormat.addInputPath(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); conf.setMapperClass(MaxTemperatureMapper.class); conf.setReducerClass(MaxTemperatureReducer.class); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); JobClient.runJob(conf); } } Map-Reduce的处理过程主要涉及以下四个部分: JobClient.runJob()创建一个新的JobClient实例,调用其submitJob()函数。 提交任务后,runJob每隔一秒钟轮询一次job的进度,将进度返回到命令行,直到任务运行完毕。 当JobTracker收到submitJob调用的时候,将此任务放到一个队列中,job调度器将从队列中获取任务并初始化任务。 初始化首先创建一个对象来封装job运行的tasks, status以及progress。 在创建task之前,job调度器首先从共享文件系统中获得JobClient计算出的input splits。 其为每个input split创建一个map task。 每个task被分配一个ID。 TaskTracker周期性的向JobTracker发送heartbeat。 在heartbeat中,TaskTracker告知JobTracker其已经准备运行一个新的task,JobTracker将分配给其一个task。 在JobTracker为TaskTracker选择一个task之前,JobTracker必须首先按照优先级选择一个Job,在最高优先级的Job中选择一个task。 TaskTracker有固定数量的位置来运行map task或者reduce task。 默认的调度器对待map task优先于reduce task 当选择reduce task的时候,JobTracker并不在多个task之间进行选择,而是直接取下一个,因为reduce task没有数据本地化的概念。 TaskTracker被分配了一个task,下面便要运行此task。 首先,TaskTracker将此job的jar从共享文件系统中拷贝到TaskTracker的文件系统中。 TaskTracker从distributed cache中将job运行所需要的文件拷贝到本地磁盘。 其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。 其三,其创建一个TaskRunner来运行task。 TaskRunner创建一个新的JVM来运行task。 被创建的child JVM和TaskTracker通信来报告运行进度。 MapRunnable从input split中读取一个个的record,然后依次调用Mapper的map函数,将结果输出。 map的输出并不是直接写入硬盘,而是将其写入缓存memory buffer。 当buffer中数据的到达一定的大小,一个背景线程将数据开始写入硬盘。 在写入硬盘之前,内存中的数据通过partitioner分成多个partition。 在同一个partition中,背景线程会将数据按照key在内存中排序。 每次从内存向硬盘flush数据,都生成一个新的spill文件。 当此task结束之前,所有的spill文件被合并为一个整的被partition的而且排好序的文件。 reducer可以通过http协议请求map的输出文件,tracker.http.threads可以设置http服务线程数。 当map task结束后,其通知TaskTracker,TaskTracker通知JobTracker。 对于一个job,JobTracker知道TaskTracer和map输出的对应关系。 reducer中一个线程周期性的向JobTracker请求map输出的位置,直到其取得了所有的map输出。 reduce task需要其对应的partition的所有的map输出。 reduce task中的copy过程即当每个map task结束的时候就开始拷贝输出,因为不同的map task完成时间不同。 reduce task中有多个copy线程,可以并行拷贝map输出。 当很多map输出拷贝到reduce task后,一个背景线程将其合并为一个大的排好序的文件。 当所有的map输出都拷贝到reduce task后,进入sort过程,将所有的map输出合并为大的排好序的文件。 最后进入reduce过程,调用reducer的reduce函数,处理排好序的输出的每个key,最后的结果写入HDFS。 当JobTracker获得最后一个task的运行成功的报告后,将job得状态改为成功。 当JobClient从JobTracker轮询的时候,发现此job已经成功结束,则向用户打印消息,从runJob函数中返回。1、Map-Reduce的逻辑过程
2、编写Map-Reduce程序
3、Map-Reduce数据流(data flow)
3.1、任务提交
3.2、任务初始化
3.3、任务分配
3.4、任务执行
3.4.1、Map的过程
3.4.2、Reduce的过程
3.5、任务结束
发表评论
-
Hadoop源代码分析 针对包和类(收藏)
2010-12-28 09:02 1285Hadoop的升级和回滚 搞定Shind ... -
Hadoop源代码分析 共41篇(收藏)
2010-12-28 08:50 1628Hadoop源代码分析(一) Hadoop源代 ... -
Hadoop资源(收藏)
2010-12-28 08:37 1008初见Hadoop,源于InfoQ的介绍,文初的三篇介绍,由浅入 ... -
Linux下安装Hadoop教程(转)
2010-12-22 16:24 1763Linux下安装Hadoop教程作者:阿KingE-mai ... -
Hadoop学习笔记之五:使用Eclipse插件
2010-12-22 15:47 2579转载务必注明出处Taobao QA Team,原文地址:h ... -
Hadoop学习笔记之四:运行MapReduce作业做集成测试
2010-12-22 15:46 1522转载务必注明出处Tao ... -
Hadoop学习笔记之三:用MRUnit做单元测试
2010-12-22 15:42 2810转载务必注明出处Taobao QA Team,原文地址: ... -
hadoop学习笔记之二:MapReduce基本编程
2010-12-22 15:38 1348转载务必注明出处Taobao QA Team,原文地址: ... -
hadoop学习笔记之一:初识hadoop
2010-12-22 15:34 1144转载务必注明出处Taobao ... -
HBase的领导人探讨Hadoop、BigTable和分布式数据库
2010-12-17 22:15 1321转自:http://duanple.blog.163.com/ ... -
分布式计算开源框架Hadoop入门实践
2010-12-03 20:47 765转:http://blog.redfox66.com/ ... -
Hadoop中文文档
2010-11-28 17:32 1080http://hadoop.apache.org/common ... -
Hadoop 学习总结之一:HDFS简介(转)
2010-11-15 20:29 962一、HDFS的基本概念 1.1、数据块(block) ... -
Hadoop学习总结之二:HDFS读写过程解析(转)
2010-11-15 20:23 1285一、文件的打开 1.1、客户端 HDFS打开一个文件 ... -
使用 Linux 和 Hadoop 进行分布式计算(转)
2010-11-15 18:06 968Hadoop 由 Apache Software Fo ...
相关推荐
**源代码解析**:单词计数是Hadoop Map-Reduce中最经典的示例之一,用于演示如何读取文本文件,统计其中每个单词出现的次数。Map函数将文本文件中的每一行分解为单词,为每个单词创建键值对(<单词,1>),Reduce...
“Hadoop学习总结之三:Map-Reduce入门.doc”介绍了MapReduce编程模型,它是Hadoop处理数据的主要计算框架。Map阶段将输入数据分割成键值对,通过映射函数进行初步处理;Reduce阶段则将Map的输出聚合,通过化简函数...
1. **Hadoop学习总结之三:Map-Reduce入门.doc**:这是一份关于MapReduce的入门文档,MapReduce是Hadoop的核心计算模型,它将大型数据集划分为小块,并在分布式集群上并行处理。 2. **Hadoop学习总结之一:HDFS简介...
**Map-Reduce入门** Map-Reduce是Hadoop的另一核心组件,用于大规模数据集的并行计算。它分为两个主要阶段:Map阶段和Reduce阶段。 1. **Map阶段**:在这个阶段,输入数据被分割成多个小片(split),然后分配给...
### Hadoop 学习总结 #### 一、HDFS简介 **1.1 数据块(Block)** HDFS(Hadoop Distributed File System)是Hadoop的核心组件之一,它主要用于存储大规模的数据集。HDFS默认的基本存储单位是64MB的数据块。与...
### Hadoop入门学习文档知识点梳理 #### 一、大数据概论 ##### 1.1 大数据概念 - **定义**:大数据是指无法在可承受的时间范围内用常规软件工具进行捕捉、管理和处理的数据集合。 - **特点**: - **Volume(大量)...
### 配置MapReduce开发环境详解 #### 一、引言 MapReduce是Apache Hadoop框架的核心组件之一,主要用于处理大规模数据集的...希望本文能够帮助您快速入门MapReduce开发,并为进一步学习大数据处理技术打下坚实的基础。
每个案例都详细列出了实践步骤,包括如何编写 Map 和 Reduce 函数、如何配置 Hadoop 环境、如何运行 MapReduce 任务等。 #### 六、总结 Hadoop MapReduce 是一种非常强大的分布式数据处理工具,它通过简单的编程...
- MapReduce 模型:理解Map和Reduce两个主要阶段,以及Shuffle和Sort的过程。 - JobTracker与TaskTracker(旧版)/ResourceManager与NodeManager(YARN):了解任务调度和执行的逻辑。 - 自定义Mapper和Reducer:...
可以说 Google 是 Hadoop 的思想之源(Google 在大数据方面的三篇论文):GFS ---> HDFS,Map-Reduce ---> MR,BigTable ---> HBase。 2003-2004 年,Google 公开了部分 GFS 和 MapReduce 思想的细节,以此为基础 ...
通过以上步骤,初学者可以逐步熟悉Windows环境下Hadoop的安装、配置和开发流程,从而顺利入门Map/Reduce编程。随着经验的增长,可以进一步探索更复杂的数据处理任务和优化策略,如Combiner的使用、Shuffle和Sort过程...
### Hadoop入门知识点详解 #### 一、Hadoop概述与目标 **Hadoop**是一种能够处理海量数据的大规模分布式计算框架。本课程旨在使学员掌握Hadoop的基本安装配置与管理,能够熟练地在Hadoop环境中处理数据,并具备...
《Hadoop从入门到精通》课程的PDF课件是一份全面了解和掌握Hadoop技术体系的宝贵资源。这个课程涵盖了从Hadoop的基础概念到高级应用的方方面面,旨在帮助学习者逐步提升对Hadoop的理解和实战能力。以下是根据提供的...
### Hadoop入门指南知识点概述 #### 一、Hadoop简介 - **定义**: Hadoop是一个开源软件框架,用于分布式存储和处理大型数据集。 - **核心组件**: - **HDFS (Hadoop Distributed File System)**: 分布式文件系统,...
### Hadoop 入门学习资料大全 #### Hadoop 概述 Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构。它允许用户无需深入了解分布式计算的底层复杂性,即可轻松地开发和运行处理大规模数据的应用程序。通过...
- 通过`Window -> Preferences -> Hadoop Map/Reduce`配置Hadoop路径。 - 选择`Hadoop installation directory`,点击`Browse`,选中Hadoop安装目录。 - 在Eclipse中显示MapReduce工具栏。 - **创建Map/Reduce...
### 高级软件人才培训专家-Hadoop课程资料-3-第三章 - MapReduce & YARN入门 #### 知识点一:分布式计算概述 - **定义**:分布式计算是一种计算模型,它通过网络将任务分配到多台计算机上并行处理,以提高计算效率...
### Hadoop 入门学习知识点概览 #### Hadoop 是什么? Hadoop 是 Apache 基金会下的一款开源软件框架,旨在通过集群的方式高效地处理大规模数据集。Hadoop 提供了分布式文件系统(HDFS)、运算资源调度系统(YARN...