第一部分:重要的组件
•什么是Combiner
•combine函数把一个map函数产生的<key,value>对(多个key, value)合并成一个新的<key2,value2>. 将新的<key2,value2>作为输入到reduce函数中,其格式与reduce函数相同。
•这样可以有效的较少中间结果,减少网络传输负荷。
•什么情况下可以使用Combiner
•可以对记录进行汇总统计的场景,如求和。
•求平均数的场景就不可以使用了
Combiner执行时机
•运行combiner函数的时机有可能会是merge完成之前,或者之后,这个时机可以由一个参数控制,即min.num.spill.for.combine(default 3)
•当job中设定了combiner,并且spill数最少有3个的时候,那么combiner函数就会在merge产生结果文件之前运行
•通过这样的方式,就可以在spill非常多需要merge,并且很多数据需要做conbine的时候,减少写入到磁盘文件的数据数量,同样是为了减少对磁盘的读写频率,有可能达到优化作业的目的。
•Combiner也有可能不执行, Combiner会考虑当时集群的负载情况。
Combiner如何使用
•代码示例
•继承Reducer类
public static class Combiner extends MapReduceBase implements
Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
}
}
•配置作业时加入conf.setCombinerClass(Combiner.class)
Partitioner
•什么是Partitioner
•Mapreduce 通过Partitioner 对Key 进行分区,进而把数据按我们自己的需求来分发。
•什么情况下使用Partitioner
•如果你需要key按照自己意愿分发,那么你需要这样的组件。
•例如:数据文件内包含省份,而输出要求每个省份输出一个文件。
•框架默认的HashPartitioner
•public class HashPartitioner<K, V> extends Partitioner<K, V> {
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
Partitioner如何使用
•实现Partitioner接口覆盖getPartition()方法
•配置作业时加入conf.setPartitionerClass(MyPartitioner.class);
•Partitioner示例
public static class MyPartitioner implements Partitioner<Text, Text> {
@Override
public int getPartition(Text key, Text value, int numPartitions) {
}
}
Partitioner需求示例
•需求描述
•数据文件中含有省份
•需要相同的省份送到相同的Reduce里
•从而产生不同的文件
•数据样例
•1 liaoning
•1 代表该省份有多少个直辖市
•步骤
•实现Partitioner,覆盖getPartition
•根据省份字段进行切分
•什么是RecordReader
•用于在分块中读取<Key,Value>对,也就是说每一次我们读取一条记录都会调用该类。
•主要是处理经过InputFormat分片完的数据
•什么时候使用RecordReader
•需要对输入的数据按自己的需求处理
•如:要求输入的key不是文件的偏移量而是文件的路径或者名字
•系统默认为LineRecordReader
•按照每行的偏移量做为map输出时的key值,每行的内容作为map的value值,默认的分隔符是回车和换行。
•需求
•更改map对应的输入的<key,value>值,key对应的文件的路径(或者是文件名),value对应的是文件的内容(content)。
•步骤
•重写InputFormat不对文件切分
•重写RecordReader
•在配置作业时使用自定义的组件进行数据处理
第二部分:Join
案例分析
•输入为2个文件,文件一内容如下
•空格分割:用户名 手机号 年龄
•内容样例
•Tom 1314567890 14
•文件二内容
•空格分割:手机号 地市
•内容样例
•13124567890 hubei
•需要统计出的汇总信息为 用户名 手机号 年龄 地市
Map端Join
•设计思路
•使用DistributedCache.addCacheFile()将地市的文件加入到所有Map的缓存里
•在Map函数里读取该文件,进行Join
•将结果输出到reduce
•需要注意的是
•DistributedCache需要在生成Job作业前使用
Reduce端Join
•设计思路
•Map端读取所有文件,并在输出的内容里加上标识代表数据时从哪个文件里来的
•在reduce对按照标识对数据进行保存
•然后根据Key的Join来求出结果直接输出
普通排序
•Mapreduce本身自带排序功能
•Text对象是不适合排序的,如果内容为整型不会安照编码顺序去排序
•一般情况下我们可以考虑以IntWritable做为Key,同时将Reduce设置成0 ,进行排序
部分排序
•即输出的每个文件都是排过序的
•如果我们不需要全局排序,那么这是个不错的选择。
全局排序
•产生背景
•Hadoop平台没有提供全局数据排序,而在大规模数据处理中进行数据的全局排序是非常普遍的需求。
•使用hadoop进行大量的数据排序排序最直观的方法是把文件所有内容给map之后,map不做任何处理,直接输出给一个reduce,利用hadoop的自己的shuffle机制,对所有数据进行排序,而后由reduce直接输出。
•快速排序基本步骤就是需要现在所有数据中选取一个作为支点。然后将大于这个支点的放在一边,小于这个支点的放在另一边。
设想如果我们有N个支点(这里可以称为标尺),就可以把所有的数据分成N+1个part,将这N+1个part丢给reduce,由hadoop自动排序,最后输出N+1个内部有序的文件,再把这N+1个文件首尾相连合并成一个文件,收工。
由此我们可以归纳出这样一个用hadoop对大量数据排序的步骤:
1)对待排序数据进行抽样;
2)对抽样数据进行排序,产生标尺;
3)Map对输入的每条数据计算其处于哪两个标尺之间;将数据发给对应区间ID的reduce
4)Reduce将获得数据直接输出。
•Hadoop 提供了Sampler接口可以返回一组样本,该接口为Hadoop的采样器。
public interface Sampler<K, V> {
K[] getSample(InputFormat<K, V> inf, Job job)
throws IOException, InterruptedException;
}
•Hadoop提供了一个TotalOrderPartitioner,可以使我们来实现全局排序。
二次排序
•产生背景
•MapReduce默认会对key进行排序
•将输出到Reduce的values也进行预先的排序
•实现方式
•重写Partitioner,完成key分区,进行第一次排序
•实现WritableComparator,完成自己的排序逻辑,完成key的第2次排序
•原理
•Map之前的数据
key1 1
key2 2
key2 3
key3 4
key1 2
•Mapduce只能排序key,所以为了二次排序我们要重新定义自己的key 简单说来就是<key value> value ,组合完后
<key1 1 > 1
<key2 2 > 2
<key2 3 > 3
<key3 4> 4
<key1 2 > 2
•原理
•接下来实现自定义的排序类,分组类,数据变成
<key1 1 > 1
<key1 2 > 2
<key2 2 > 2
<key2 3 > 3
<key3 4> 4
•最后 reduce处理后输出结果
key1 1
key1 2
key2 2
key2 3
key3 4
第四部分:计数器
•什么是计数器
计数器主要用来收集系统信息和作业运行信息,用于知道作业成功、失败等情况,比日志更便利进行分析。
•内置计数器
•Hadoop内置的计数器,记录作业执行情况和记录情况。包括MapReduce框架、文件系统、作业计数三大类。
•计数器由关联任务维护,定期传递给tasktracker,再由tasktracker传给jobtracker。
•计数器可以被全局聚集。内置的作业计数器实际上由jobtracker维护,不必在整个网络中传递。
•当一个作业执行成功后,计数器的值才是完整可靠的。
用户自定义Java计数器
•MapReduce框架允许用户自定义计数器
•计数器是全局使用的
•计数器有组的概念,可以由一个Java枚举类型来定义
•如何配置
•0.20.2以下的版本使用Reporter,
•0.20.2以上的版本使用context.getCounter(groupName, counterName) 来获取计数器配置并设置。
•动态计数器
•所谓动态计数器即不采用Java枚举的方式来定义
•Reporter中的获取动态计数器的方法
•public void incrCounter(String group,String counter,long amount)
组名称,计数器名称,计数值
•一些原则
•创建计数器时,尽量让名称易读
•获取计数器
•Web UI
•命令行 hadoop job-counter
•Java API
•Java API
•在作业运行完成后,计数器稳定后获取。 使用job.getCounters()得到Counters
第五部分:合并小文件示例
•产生背景
•Hadoop不适合处理小文件
•会占用大量的内存空间
•解决方案
•文件内容读取到SequenceFile内
分享到:
相关推荐
MapReduce是Hadoop的核心组件之一,主要用于分布式数据处理。它采用Map(映射)和Reduce(归约)的编程模型来处理大规模数据集。MapReduce高级特性包括计数器、排序和数据集连接等,这些特性能够进一步提升数据处理...
映射器和规约器是MapReduce中的两个核心组件。 - **映射器**:负责读取输入数据,并将其转换为键值对的形式。在这个过程中,每个输入记录都会被独立地处理,这使得MapReduce能够很好地支持并行处理。 - **规约器**:...
这些运算符包括数据源(DataSource)、应用(Apply)、窗口(Window)、选择(Select)、连接(Join)、并集(Union)和排序(Sort)等操作。在LOT之上,还有一个名为伏羲的调度系统,负责调度LOT的任务执行。 为了...
#### 二、MapReduce的基本原理 ##### 2.1 功能性编程根基 MapReduce的设计受到了功能性编程的影响。在这个模型中,“映射(Map)”和“规约(Reduce)”是两个核心概念。映射函数将输入数据转换为键值对的形式,而...
4. **数据处理策略**:MapReduce支持多种数据处理策略,如排序、分组、Join操作等。这些策略在处理大规模数据时非常关键,能够优化计算效率和结果准确性。 5. **优化技巧**:书中会探讨如何优化MapReduce作业,包括...
例如,Sort-Merge Join要求输入数据已经按照Join键排序,这可以通过Hadoop的Partitioner和Comparator组件来实现。此外,为了减少网络传输和提高效率,可以采用数据本地化策略,确保参与Join的文件在同一台机器上处理...
这个示例中,第一个作业(`unSortjob`)负责生成未排序的数据,而第二个作业(`sortJob`)则基于前一个作业的输出进行排序,实现了JOIN操作。通过这种方式,MapReduce工作流能够处理复杂的数据处理任务,其中多个...
#### 一、MapReduce原理篇 **1.1 为什么需要MapReduce** 随着互联网技术的发展,每天产生的数据量呈爆炸式增长,面对如此庞大的数据集,传统的单机处理方式由于硬件资源的限制,已无法满足高效处理的需求。为了...
本书不仅深入探讨了MapReduce的基本原理和技术细节,还提供了丰富的实例和算法设计方法,适用于那些需要处理海量数据的应用场景。 #### 二、MapReduce基础知识 ##### 2.1 功能性编程根源 MapReduce的设计理念受到...
本文将探讨Reduce Join的工作原理,以及如何利用MRV2(MapReduce v2)API对它进行重写。 首先,我们来理解什么是Reduce Join。在关系数据库中,JOIN操作用于合并两个或多个表的数据,根据它们之间的关联字段。在...
这通常需要使用MapReduce的自定义分区策略和排序规则来优化JOIN的性能。例如,可以使用Bucket JOIN或者Map-Side JOIN技术,通过预处理数据,减少跨节点的数据传输。 此外,为了优化查询效率,还需要考虑数据分区和...
8. **MapReduce与其他Hadoop组件集成**:如HDFS(Hadoop Distributed File System)、HBase、Pig或Hive等,这些示例展示了如何在一个完整的Hadoop生态系统中协同工作。 通过这个代码库,读者可以深入理解MapReduce...
技术点56 通过MapReduce 对Bloom filter 进行semi-join 7.3 本章小结 8 结合R 和Hadoop 进行数据统计 8.1 比较R 和MapReduce 集成的几种方法 8.2 R 基础知识 8.3 R 和Streaming 8.3.1 Streaming 和...
6. **合并 MapReduce 操作**:通过 Combine 或 Reduce-Side Join 减少中间步骤。 7. **Partition**:利用分区减少数据扫描,提高查询效率。 通过以上优化策略,可以显著提升 Hive 在大数据处理中的性能,使得数据...
MapReduce的join算法可以处理大数据集的关联操作。DistributedCache用于优化MapReduce作业的性能。 YARN(Yet Another Resource Negotiator)是Hadoop的一个子项目,它是一个资源管理平台,负责集群资源管理和任务...
Hive的执行原理与优化部分主要讲述了Hive的技术架构,包括Hive的核心组件、Hive的底层存储、Hive程序的执行过程以及元数据存储。同时涉及了MapReduce的执行过程、Shuffle原理和性能优化策略。 Hive的执行过程主要...
在本实验中,我们主要探讨的是大数据处理的一个关键组件——MapReduce,以及如何结合Hive进行数据查询。这个实验被称为“实验31”,是南京大学计算机科学与技术系的大数据处理综合实验的一部分,名为"MyJoin"。实验...
本篇文章将深入探讨Hive的组件、MapReduce的工作原理以及Hive QL的使用,包括JOIN操作、GROUP BY聚合以及COUNT DISTINCT等高级特性。 首先,我们来看Hive的主要组件。Facebook开发的Hive包含了多个关键部分,如HDFS...