- 浏览: 600240 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
MapReduce应用广泛的原因之一在于它的易用性。它提供了一个因高度抽象化而变得异常简单的编程模型。MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,特点:任务可以分解成相互独立子问题。
上面灰色部分是整个编程模型,分为两层:所谓工具层就是增加点兼容性而已,而下面的接口层就是费神的地方了。
先来点官方的,InputFormat主要用于描述数据的格式,它提供一下两个功能:
1.数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split。
2.为Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对。
乍一看,挺简单的,不就是把数据打碎,变成k&v对提交给Mapper么,好吧,学了等于没学,这些貌似没什么用。
从数据划分、split调度和数据读取这三方面来分析InputFormat。
具体还是先从经典的MapReduce工作流程入手吧。
1、运行一个MapReduce程序;
2、运行时将生成一个Job,JobClient向JobTracker申请一个JobID以标识这个Job;
3、JobClient将Job所需要的资源提交到HDFS中一个以JobID命名的目录中。这些资源包括JAR包、配置文件、InputSplit等;
4、JobClient向JobTracker提交这个Job;
5、JobTracker接收并初始化这个Job;
6、JobTracker从HDFS获取这个Job的Split等信息;
7、JobTracker向TaskTracker分配任务;
8、TaskTracker从HDFS获取这个Job的相关资源;
9、TaskTracker开启一个新的JVM;
10、TaskTracker用新的JVM来执行Map或Reduce;
注意看第三步,这里提交的资源中包含了InputSplit(上文中已标记)就是数据划分的结果。数据划分是在JobClient上完成的,它适用InputFormat将输入数据做一次划分,形成若干split。
InputFormat是一个接口,它包含两种方法:
这里getSplits函数就是划分函数。job参数是任务的配置集合,从中可以取到用户在启动MapReduce时指定的输入文件路径。而numSplits参数是一个Split数目。
返回接口数组InputSplit,描述所有的Split信息,一对一。它也有两个函数:
即描述Split长度与Split的位置(在HDFS上存放的机器),属于逻辑分片。
序列化问题:对象序列化主要用于进程间通信和永久存储。InputSplit序列化主要是为了前者。
getRecordReader方法返回一个RecordReader对象,将输入的InputSplit解析成若干key/value对。
顺便插一句,有时候会遇到输入文件是不可划分的,比如一个tar.gz,划分会是其无法解压,可以考虑重载FileInoutFormat的isSplitable()函数来告知文件是否可分,或者干脆从头实现一个InputFormat。
Split调度
图片第6步JobTracker会从HDFS获取Job的Split信息,这将生成一系列待处理的Map和Reduce任务。
JobTracker并不会主动的为每一个TaskTracker划分一个任务子集,而是直接把所有任务都放在跟Job对应的待处理任务列表中。
在分配Map任务时,Split的Location信息就要发挥作用了。JobTracker会根据TaskTracker的地址来选择一个Location与之最接近的Split所对应的Map任务(注意一个Split可以有多个Location)。这样一来,输入文件中Block的Location信息经过一系列的整合(by InputFormat)和传递,最终就影响到了Map任务的分配。其结果是Map任务倾向于处理存放在本地的数据,以保证效率。
数据读取
图片第10步,TaskTracker启动一个JVM来执行Map程序。在Map执行的时候,会使用InputFormat.getRecordReader()所返回的RecordReader对象来读取Split中的每一条记录。
实际上,RecordReader并不关心Split的Location,只管Open它的Path。前面说RecordReader是由具体的InputFormat创建并返回的,它跟对应的InputFormat所使用的InputSplit必定是配对的。比如,对应于FileSplit,RecordReader要读取FileSplit.file文件中的相应区间、对于CombineFileSplit,RecordReader要读取CombineFileSplit.paths中的每个文件的相应区间。
系统自带的各种InputFormat实现
所有基于文件的InputFormat实现的基类是FileInputFormat,并派生出针对文本格式的TextInputFormat、KeyValueTextInputFormat和NLineInputFormat以及针对二进制文件格式的SequenceFileInputFormat等。
注意:当使用基于FileInputFormat实现InputFormat时,为了提高Map Task的数据本地性,应尽量是InputSplit与block大小相同。
转自:http://924389979.iteye.com/blog/2059267
上面灰色部分是整个编程模型,分为两层:所谓工具层就是增加点兼容性而已,而下面的接口层就是费神的地方了。
先来点官方的,InputFormat主要用于描述数据的格式,它提供一下两个功能:
1.数据切分:按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split。
2.为Mapper提供输入数据:给定某个split,能将其解析成一个个key/value对。
乍一看,挺简单的,不就是把数据打碎,变成k&v对提交给Mapper么,好吧,学了等于没学,这些貌似没什么用。
从数据划分、split调度和数据读取这三方面来分析InputFormat。
具体还是先从经典的MapReduce工作流程入手吧。
1、运行一个MapReduce程序;
2、运行时将生成一个Job,JobClient向JobTracker申请一个JobID以标识这个Job;
3、JobClient将Job所需要的资源提交到HDFS中一个以JobID命名的目录中。这些资源包括JAR包、配置文件、InputSplit等;
4、JobClient向JobTracker提交这个Job;
5、JobTracker接收并初始化这个Job;
6、JobTracker从HDFS获取这个Job的Split等信息;
7、JobTracker向TaskTracker分配任务;
8、TaskTracker从HDFS获取这个Job的相关资源;
9、TaskTracker开启一个新的JVM;
10、TaskTracker用新的JVM来执行Map或Reduce;
注意看第三步,这里提交的资源中包含了InputSplit(上文中已标记)就是数据划分的结果。数据划分是在JobClient上完成的,它适用InputFormat将输入数据做一次划分,形成若干split。
InputFormat是一个接口,它包含两种方法:
InputSplit[] getsSplits(JobConf job,int numSplits) throws IOException; RecordReader<K,V> getRecordReader(InpputSplit split,JobConf job,Reporter reporter) throws IOException;
这里getSplits函数就是划分函数。job参数是任务的配置集合,从中可以取到用户在启动MapReduce时指定的输入文件路径。而numSplits参数是一个Split数目。
返回接口数组InputSplit,描述所有的Split信息,一对一。它也有两个函数:
long getLength() throws IOException; String[] getLocation() throws IoException;
即描述Split长度与Split的位置(在HDFS上存放的机器),属于逻辑分片。
序列化问题:对象序列化主要用于进程间通信和永久存储。InputSplit序列化主要是为了前者。
getRecordReader方法返回一个RecordReader对象,将输入的InputSplit解析成若干key/value对。
顺便插一句,有时候会遇到输入文件是不可划分的,比如一个tar.gz,划分会是其无法解压,可以考虑重载FileInoutFormat的isSplitable()函数来告知文件是否可分,或者干脆从头实现一个InputFormat。
Split调度
图片第6步JobTracker会从HDFS获取Job的Split信息,这将生成一系列待处理的Map和Reduce任务。
JobTracker并不会主动的为每一个TaskTracker划分一个任务子集,而是直接把所有任务都放在跟Job对应的待处理任务列表中。
在分配Map任务时,Split的Location信息就要发挥作用了。JobTracker会根据TaskTracker的地址来选择一个Location与之最接近的Split所对应的Map任务(注意一个Split可以有多个Location)。这样一来,输入文件中Block的Location信息经过一系列的整合(by InputFormat)和传递,最终就影响到了Map任务的分配。其结果是Map任务倾向于处理存放在本地的数据,以保证效率。
数据读取
图片第10步,TaskTracker启动一个JVM来执行Map程序。在Map执行的时候,会使用InputFormat.getRecordReader()所返回的RecordReader对象来读取Split中的每一条记录。
实际上,RecordReader并不关心Split的Location,只管Open它的Path。前面说RecordReader是由具体的InputFormat创建并返回的,它跟对应的InputFormat所使用的InputSplit必定是配对的。比如,对应于FileSplit,RecordReader要读取FileSplit.file文件中的相应区间、对于CombineFileSplit,RecordReader要读取CombineFileSplit.paths中的每个文件的相应区间。
系统自带的各种InputFormat实现
所有基于文件的InputFormat实现的基类是FileInputFormat,并派生出针对文本格式的TextInputFormat、KeyValueTextInputFormat和NLineInputFormat以及针对二进制文件格式的SequenceFileInputFormat等。
注意:当使用基于FileInputFormat实现InputFormat时,为了提高Map Task的数据本地性,应尽量是InputSplit与block大小相同。
转自:http://924389979.iteye.com/blog/2059267
发表评论
文章已被作者锁定,不允许评论。
-
Hadoop namenode的fsimage与editlog详解
2017-05-19 10:04 1190Namenode主要维护两个文件,一个是fsimage,一个是 ... -
Hadoop HBase建表时预分区(region)的方法学习
2017-05-15 11:18 1195如果知道Hbase数据表的key的分布情况,就可以在建表的时候 ... -
Hadoop HBase行健(rowkey)设计原则学习
2017-05-15 10:34 1127Hbase是三维有序存储的,通过rowkey(行键),colu ... -
Hadoop HBase中split原理学习
2017-05-12 13:38 2281在Hbase中split是一个很重 ... -
Hadoop HBase中Compaction原理学习
2017-05-12 10:34 1000HBase Compaction策略 RegionServer ... -
Hadoop HBase性能优化学习
2017-05-12 09:15 689一、调整参数 入门级的调优可以从调整参数开始。投入小,回报快 ... -
Hadoop 分布式文件系统学习
2017-05-10 15:34 507一. 分布式文件系统 分布式文件系统,在整个分布式系统体系中处 ... -
Hadoop MapReduce处理wordcount代码分析
2017-04-28 14:25 595package org.apache.hadoop.exa ... -
Hadoop YARN完全分布式配置学习
2017-04-26 10:27 578版本及配置简介 Java: J ... -
Hadoop YARN各个组件和流程的学习
2017-04-24 19:04 651一、基本组成结构 * 集 ... -
Hadoop YARN(Yet Another Resource Negotiator)详细解析
2017-04-24 18:30 1162带有 MapReduce 的 Apache Had ... -
Hive 注意事项与扩展特性
2017-04-06 19:31 7531. 使用HIVE注意点 字符集 Hadoop和Hive都 ... -
Hive 元数据和QL基本操作学习整理
2017-04-06 14:36 1035Hive元数据库 Hive将元数据存储在RDBMS 中,一般常 ... -
Hive 文件压缩存储格式(STORED AS)
2017-04-06 09:35 2326Hive文件存储格式包括以下几类: 1.TEXTFILE ... -
Hive SQL自带函数总结
2017-04-05 19:25 1144字符串长度函数:length ... -
Hive 连接查询操作(不支持IN查询)
2017-04-05 19:16 730CREATE EXTERNAL TABLE IF NOT ... -
Hive优化学习(join ,group by,in)
2017-04-05 18:48 1819一、join优化 Join ... -
Hive 基础知识学习(语法)
2017-04-05 15:51 904一.Hive 简介 Hive是基于 Hadoop 分布式文件 ... -
Hive 架构与基本语法(OLAP)
2017-04-05 15:16 1254Hive 是什么 Hive是建立在Hadoop上的数据仓库基础 ... -
Hadoop MapReduce操作Hbase范例学习(TableMapReduceUtil)
2017-03-24 15:37 1217Hbase里的数据量一般都 ...
相关推荐
2. **MapReduce编程模型**:介绍Map和Reduce函数的编写,以及Combiner和Partitioner的使用,它们分别用于局部聚合和分区优化。 3. **数据输入与输出**:探讨InputFormat和OutputFormat接口,理解如何自定义输入输出...
在Hadoop MapReduce框架中,InputFormat是处理输入数据的核心组件。它负责将原始数据分割成逻辑上的键值对(key-value pairs),然后为每个分区分配一个或多个这些键值对给Mapper。默认情况下,Hadoop支持如...
MapReduce编程模型3.1 MapReduce编程模型概述3.1.1 MapReduce编程接口体系结构3.1.2 新旧MapReduce API比较3.2 MapReduce API基本概念3.2.1 序列化3.2.2 Reporter参数3.2.3 回调机制3.3 Java API解析3.3.1 ...
本文将深入探讨如何使用Java编程语言来操作Hadoop MapReduce进行基本实践,通过源码分析来理解其核心工作原理和编程模型。 MapReduce的核心思想是将大规模数据集分解成小块,然后在分布式集群上并行处理这些小块,...
在Hadoop的生态系统中,MapReduce是处理海量数据的一种编程模型,而InputFormat作为MapReduce编程模型的重要组成部分,是负责处理输入数据的关键接口。为了深入理解MapReduce工作原理,必须掌握InputFormat的设计和...
Hadoop 代码使用方式 ...hadoop jar hadoop-mapreduce-custom-inputformat-1.0-SNAPSHOT.jar org.apache.hadoop.mapreduce.sample.SmallFileWordCount -Dmapreduce.input.fileinputformat.split.maxsize=10
Hadoop MapReduce 是一种分布式编程模型,旨在处理大规模数据集(TB级别甚至PB级别)的计算任务。它通过将计算任务分解为多个子任务并在多台机器上并行执行这些任务来提高效率。Hadoop MapReduce 由两个主要组件构成...
此外,代码中可能还会涉及到Hadoop的相关API,如`InputFormat`、`OutputFormat`和`Partitioner`等接口,它们分别用于定义输入数据的格式、输出数据的格式以及数据分区策略。 MapReduce非常适合处理批处理任务,例如...
在IT行业中,Hadoop MapReduce是一种分布式计算框架,广泛用于处理海量数据。在这个"007_hadoop中MapReduce应用案例_1_数据去重"的主题中,我们将深入探讨如何利用MapReduce解决数据去重的问题。这个案例可能涉及到...
Hadoop MapReduce 的编程模型是基于Java的,但也有如Hadoop Streaming这样的接口,允许使用其他语言(如Python或Perl)编写Map和Reduce函数。在实际应用中,开发者通常需要编写Mapper类和Reducer类,定义map()和...
在大数据处理领域,Hadoop是不可或缺的核心技术之一。作为一个开源框架,Hadoop为海量数据的存储、处理和分析提供了高效且可扩展的解决方案。本文将深入探讨“Hadoop高级编程——构建与实现大数据解决方案”这一主题...
标题“hadoop mapreduce2”可能指的是在Hadoop 2.x版本下进行MapReduce编程,这个版本引入了YARN(Yet Another Resource Negotiator),作为资源管理和调度器,改进了原本单一JobTracker的架构,使得系统更加灵活和...
- **定义与功能**:Hadoop MapReduce是一种编程模型,用于处理和生成大数据集,它通过一个并行、分布式算法来实现这一目标。MapReduce将数据处理过程分为两个阶段:Map(映射)和Reduce(归约)。Map阶段负责对输入...
4. **hadoop-mapreduce-client-core**: 包含MapReduce编程模型的核心类和接口,如Mapper、Reducer、Partitioner、InputFormat和OutputFormat等。 5. **hadoop-mapreduce-client-app**: 提供了JobTracker的替代,即...
MapReduce是一种编程模型,用于大规模数据集的并行处理。它将大数据任务分解为两个主要阶段:映射(Map)和化简(Reduce)。Eclipse与Hadoop的集成使得开发者可以在本地环境中编写、测试和调试MapReduce作业,然后再...
这个项目是一个学习Hadoop MapReduce的实践项目,利用Maven构建,无需单独安装Hadoop环境,只需在IDE中打开即可运行,方便初学者进行快速上手和实践。 MapReduce的工作原理分为两个主要阶段:Map阶段和Reduce阶段。...
mapreduce编程模型软件的具体实现: hadoop中的mapreduce框架、spark。 hadoop中的mapreduce框架: 对编程模型阶段1实现就是:map task 对编程模型阶段2的实现就是reduce task。 map task: 读数据:...
MapReduce则是并行处理这些数据的编程模型,它将任务分解为映射(Map)和化简(Reduce)两步,使得大规模数据的计算变得可能。 在Hadoop高级编程中,我们需要掌握以下关键知识点: 1. **Hadoop安装与配置**:包括...
在MapReduce编程模型中,InputFormat是至关重要的组件,它负责将存储在HDFS(Hadoop Distributed File System)上的数据转化为可以被MapTask处理的键值对。本文将深入讲解MapReduce的InputFormat,特别是默认的...