Hadoop的性能问题

3 篇文章 0 订阅

数据科学家在面对大规模数据分析时,经常需要面对两类问题


(1)数据缓存:在应用数据挖掘算法时前,数据往往需要进行预处理操作,对数据中一部分不符合要求的数据进行不断的清洗过滤。而这些清洗工作又不是可以用简单的线性操作完成的。同时,算法计算过程中的中间结果也需要保留,以便后续操作使用。

(2)算法迭代:数据科学家需要应用复杂的数据挖掘算法对数据进行分析,而这些算法往往需要复杂的运算逻辑和反复的迭代过程,以达到求解最优解的目的。例如K-means算法,梯度下降算法等。


由于hadoop天生的设计缺陷,在处理以上两个问题时显得有点力不从心。为了理解其原因,我们先从Hadoop的核心计算模式MapReduce说起。MapReduce计算模式将数据的处理过程分成两个阶段:map和reduce。在map阶段,原始数据被输入mapper进行过滤和转换,获得中间数据在reduce阶段作为reducer的输入。经过reducer的聚合处理,获得最终处理结果。


为了适应多样化的数据环境,MapReduce中采用关键字/值数据对(Key-Value Pair)作为基础数据单元。关键字和值可以使简单的基本数据类型,例如整数,浮点数,字符串,二进制字节,也可以是复杂的数据结构,例如列表、数组、自定义结构。map阶段和reduce阶段豆浆关键字/值作为输入输出,其公式表达式如下(<...>代表关键字/值数据对,[…]代表列表)

map: <k1,v1>--> [<k2,v2>]

reduce:<k2,[v2]>-->[<k3,v3>]

MapReduce的基本处理过程表达如下:

(1)MapReduce应用讲一个[<k1,v1>]列表作为参数传递给MapReduce处理模块,例如[<String fileName, String fileContent>]。MapReduce处理模块将这个列表拆分为单独的<k1,v1>数据对,分发给对应的mapper进行处理。

(2)mapper根据函数定义的处理过程,对<k1,v1>进行处理,生成<k2,v2>列表。由于数据处理过程是无序的,因此,每个<k2,v2>数值对的生成过程必须是自包含的,即不与其他数值对的生产过程相关。所有mapper的处理结果合在一起构成了一个大的<k2,[v2]>,即k2和一系列的v2。reduce按照函数定义的处理过程,对这些新的数据进行处理,获得最终的处理结果,并以[(k3,v3)]列表的形式输出。

通过如上对MapReduce的介绍可以看出,MapReduce工作模型非常简单,他只有两种基本操作:map和reduce。这种简化是为了降低编写分布式并行计算程序的复杂度。但是这种简化也带来新的问题,就是在进行复杂算法设计和非线性的数据处理的时候,只能通过map+reduce的叠加来实现。一个算法通常需要多个map+reduce的过程才能实现,而每个M+R的过程,hadoop都要单独启动一个job来实现。每一个job的启动都增加了整个算法的开销。同时,MapReduce计算模式在进行多个job时,必须依赖hadoop的另一项核心技术HDFS交换数据。HDFS最初的设计思想是数据“一次写入,多次读写”。HDFS中一个数据块会被复制分发到不同的存储节点中,使用磁盘作为中间过程交互数据的媒介。多个MapReduce job在衔接时,都需要将数据写入磁盘,再读出,因此在进行反复迭代的计算时会增加大量的网络开销和磁盘IO开销。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值