Hadoop Combiner使用方法详解

Hadoop Combiner使用方法详解

Combiner函数是一个可选的中间函数,发生在Map阶段,Mapper执行完成后立即执行。使用Combiner有如下两个优势:

  1. Combiner可以用来减少发送到Reducer的数据量,从而提高网络效率。
  2. Combiner可以用于减少发送到Reducer的数据量,这将提高Reduce端的效率,因为每个reduce函数将处理相对较少记录,相比于未使用Combiner之前。

Combiner与Reducer结构相同,因为Combiner和Reducer都对Mapper的输出进行处理。这给了我们一个复用Reducer作为Combiner的好机会。但问题是,复用Reducer作为Combiner总是是一个好主意吗?

特点:

Combiners是MapReduce中的一个优化,允许在shuffle和排序阶段之前在本地进行聚合。Combiners的首要目标是通过最小化键值对的数量来节省尽可能多的带宽

Reducer作为Combiner的适用场景

假设我们正在编写一个MapReduce程序来计算股票数据集中每个股票代码的最大收盘价。Mapper将数据集中每个股票记录的股票代码作为key和收盘价作为value。Reducer然后将循环遍历股票代码对应的所有收盘价,并从收盘价列表中计算最高收盘价。假设Mapper 1 处理 股票代码为ABC 的3个记录,收盘价分别为50,60和111。让我们假设Mapper 2 处理股票代码为ABC的2个记录,收盘价分别为100和31。那么Reducer将收到股票代码ABC五个收盘价---50,60,111,100和31。Reducer的工作非常简单,它将简单地循环遍历所有收盘价,并将计算最高收盘价为111。

我们可以在每个Mapper之后使用相同的Reducer作为Combiner。Mapper 1 上的Combiner将处理3个收盘价格--50,60和111,并且仅输出111,因为它是3个收盘价的最大值。Mapper 2 上的Combiner将处理2个收盘价格--100和31,并且仅输出100,因为它是2个收盘价的最大值。现在使用Combiner之后,Reducer仅处理股票代码ABC的2个收盘价(原先需要处理5个收盘价),即来自Mapper 1 的111和来自Mapper 2 的100,并且将从这两个值中计算出最大收盘价格为111。

正如我们看到的,使用Combiner情况下Reducer输出与没有使用Combiner的输出结果是相同的,因此在这种情况下复用Reducer作为

Combiner是没有问题。

Reducer作为Combiner的不适用场景

假设我们正在编写一个MapReduce程序来计算股票数据集中每个股票代码的平均交易量(average volume for each symbol)。Mapper将数据集中每个股票记录的股票代码作为key和交易量(volume)作为value。Reducer然后将循环遍历股票代码对应的所有交易量,并从交易量列表中计算出平均交易量(average volume from the list of volumes for that symbol)。假设Mapper 1 处理 股票代码为ABC 的3个记录,收盘价分别为50,60和111。让我们假设Mapper 2 处理股票代码为ABC的2个记录,收盘价分别为100和31。那么Reducer将收到股票代码ABC五个收盘价---50,60,111,100和31。Reducer的工作非常简单,它将简单地循环遍历所有交易量,并将计算出平均交易量为70.4。

50 + 60 + 111 + 100 + 31 / 5 = 352 / 5 = 70.4

让我们看看如果我们在每个Mapper之后复用Reducer作为Combiner会发生什么。Mapper 1 上的Combiner将处理3个交易量--50,60和111,并计算出三个交易量的平均交易量为73.66。

Mapper 2 上的Combiner将处理2个交易量--100和31,并计算出两个交易量的平均交易量为65.5。那么在复用Reducer作为Combiner的情况下,Reducer仅处理股票代码ABC的2个平均交易量,来自Mapper1的73.66 和 来自Mapper2的65.5,并计算股票代码ABC最终的平均交易量为69.58。

73.66 + 65.5 /2 = 69.58

这与我们不复用Reducer作为Combiner得出的结果不一样,因此复用Reducer作为Combiner得出平均交易量是不正确的。

所以我们可以看到Reducer不能总是被用于Combiner。所以,当你决定复用Reducer作为Combiner的时候,你需要问自己这样一个问题 - 使用Combiner与不使用Combiner的输出结果是否一样?

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Hadoop MultipleOutputs输出到多个文件中的实现方法

    Hadoop MultipleOutputs输出到多个文件中的实现方法 1.输出到多个文件或多个文件夹: 驱动中不需要额外改变,只需要在MapClass或Reduce类中加入如下代码 private MultipleOutputs<Text,IntWritable> mos; public void setup(Context context) throws IOException,InterruptedException { mos = new MultipleOutputs(context

  • Hadoop编程基于MR程序实现倒排索引示例

    相信接触过搜索引擎开发的同学对倒排索引并不陌生,谷歌.百度等搜索引擎都是用的倒排索引,关于倒排索引的有关知识,这里就不再深入讲解,有兴趣的同学到网上了解一下.这篇博文就带着大家一起学习下如何利用Hadoop的MR程序来实现倒排索引的功能. 一.数据准备 1.输入文件数据 这里我们准备三个输入文件,分别如下所示 a.txt hello tom hello jerry hello tom b.txt hello jerry hello jerry tom jerry c.txt hello jerr

  • hadoop上传文件功能实例代码

    hdfs上的文件是手动执行命令从本地linux上传至hdfs的.在真实的运行环境中,我们不可能每次手动执行命令上传的,这样太过繁琐.那么,我们可以使用hdfs提供的Java api实现文件上传至hdfs,或者直接从ftp上传至hdfs. 然而,需要说明一点,之前笔者是要运行MR,都需要每次手动执行yarn jar,在实际的环境中也不可能每次手动执行.像我们公司是使用了索答的调度平台/任务监控平台,可以定时的以工作流执行我们的程序,包括普通java程序和MR.其实,这个调度平台就是使用了quart

  • VMware虚拟机下hadoop1.x的安装方法

    这是Hadoop学习全程记录第1篇,在这篇里我将介绍一下如何在Linux下安装Hadoop1.x. 先说明一下我的开发环境: 虚拟机:VMware8.0: 操作系统:CentOS6.4: 版本:jdk1.8:hadoop1.2.1 ①下载hadoop1.2.1,网盘:链接: https://pan.baidu.com/s/1sl5DMIp 密码: 5p67 下载jdk1.8,网盘:链接: https://pan.baidu.com/s/1boN1gh5 密码: t36h 将 jdk-8u144-

  • hadoop重新格式化HDFS步骤解析

    了解Hadoop的同学都知道,Hadoop有两个核心的组成部分,一个是HDFS,另一个则是MapReduce,HDFS作为Hadoop的数据存储方案,MapReduce则提供计算服务:同时,HDFS作为一种分布式文件系统,它的安装也是需要相应的格式化操作的,如果安装失败或者我们需要重新安装的时候,那我们就需要对HDFS重新进行格式化,这篇文章就和大家一起讨论下如何进行HDFS的重新格式化. 重新格式化hdfs系统的方法: 1.打开hdfs-site.xml 我们打开Hadoop的hdfs-sit

  • 浅谈七种常见的Hadoop和Spark项目案例

    有一句古老的格言是这样说的,如果你向某人提供你的全部支持和金融支持去做一些不同的和创新的事情,他们最终却会做别人正在做的事情.如比较火爆的Hadoop.Spark和Storm,每个人都认为他们正在做一些与这些新的大数据技术相关的事情,但它不需要很长的时间遇到相同的模式.具体的实施可能有所不同,但根据我的经验,它们是最常见的七种项目. 项目一:数据整合 称之为"企业级数据中心"或"数据湖",这个想法是你有不同的数据源,你想对它们进行数据分析.这类项目包括从所有来源获得

  • ASP.NET实现Hadoop增删改查的示例代码

    本文介绍了ASP.NET实现Hadoop增删改查的示例代码,分享给大家,具体如下: packages.config <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20505.0" targetFramework="net

  • hadoop动态增加和删除节点方法介绍

    上一篇文章中我们介绍了Hadoop编程基于MR程序实现倒排索引示例的有关内容,这里我们看看如何在Hadoop中动态地增加和删除节点(DataNode). 假设集群操作系统均为:CentOS 6.7 x64 Hadoop版本为:2.6.3 一.动态增加DataNode 1.准备新的DataNode节点机器,配置SSH互信,可以直接复制已有DataNode中.ssh目录中的authorized_keys和id_rsa 2.复制Hadoop运行目录.hdfs目录及tmp目录至新的DataNode 3.

  • Hadoop Combiner使用方法详解

    Hadoop Combiner使用方法详解 Combiner函数是一个可选的中间函数,发生在Map阶段,Mapper执行完成后立即执行.使用Combiner有如下两个优势: Combiner可以用来减少发送到Reducer的数据量,从而提高网络效率. Combiner可以用于减少发送到Reducer的数据量,这将提高Reduce端的效率,因为每个reduce函数将处理相对较少记录,相比于未使用Combiner之前. Combiner与Reducer结构相同,因为Combiner和Reducer都

  • SparkSQL读取hive数据本地idea运行的方法详解

    环境准备: hadoop版本:2.6.5 spark版本:2.3.0 hive版本:1.2.2 master主机:192.168.100.201 slave1主机:192.168.100.201 pom.xml依赖如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

  • Asp.net MVC scheduler的实现方法详解

    Asp.net MVC scheduler的实现方法详解 本例使用了fullcalendar js : https://fullcalendar.io/ 1. view : @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @section PageContent{ <style> .modal-backdrop { z-index: 9; } </sty

  • shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从网上查到使用expect可以,简单研究了一下,效果不错. 因为我的操作系统没有安装expect,所以直接"yum -y install expect",你可以根据你的操作系统安装expect,或者源码编译. 安装好之后就可以使用了,这里有几种方法: 一.单独写一个脚本 如 auto_scp

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • AngularJS的$location使用方法详解

    AngularJS的$location使用方法详解 一.配置config app.config([ '$locationProvider', function($locationProvider) { $locationProvider.html5Mode({ //设置为html5Mode(模式),当为false时为Hashbang模式 enabled : true, //是否需要加入base标签,这里设置为false,设置为true时,需在html的head配置<base href="&

  • 优化Tomcat配置(内存、并发、缓存等方面)方法详解

    Tomcat有很多方面,我从内存.并发.缓存等方面介绍优化方法. 一.Tomcat内存优化 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_OPTS参数说明 server 启用jdk 的 server 版: -Xms java虚拟机初始化时的最小内存: -Xmx java虚拟机可使用的最大内存: -XX: PermSize 内存永久保留区域 -XX:MaxPermSize 内存最

  • C++中new和delete的使用方法详解

    C++中new和delete的使用方法详解 new和delete运算符用于动态分配和撤销内存的运算符 new用法:           1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将整数赋值为5           2.     开辟数组空间 一维: int *a = new in

  • C++ set的使用方法详解

    C++ set的使用方法详解 set也是STL中比较常见的容器.set集合容器实现了红黑树的平衡二叉检索树的数据结构,它会自动调整二叉树的排列,把元素放到适当的位置.set容器所包含的元素的值是唯一的,集合中的元素按一定的顺序排列. 我们构造set集合的目的是为了快速的检索,不可直接去修改键值. set的一些常见操作: begin() 返回指向第一个元素的迭代器 clear() 清除所有元素 count() 返回某个值元素的个数 empty() 如果集合为空,返回true(真) end() 返回

  • 获取Django项目的全部url方法详解

    在为一个项目添加权限时,遇到一个问题,就是为项目所有的url设置权限,但是一个一个手动输入太麻烦了,所以考虑用代码获取到一个项目所有的url 首先,考虑到项目最外层的urlpartterns,因为所有的url都要通过这里 urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^arya/', site.urls), url(r'^index/', index), ] 先循环打印一下这个列表,看一下拿到的结果: <RegexURLRes

随机推荐