Hadoop系列之初识MapReduce(1)

Hadoop系列之初识MapReduce(1)

 这是真正意义上第一篇博客,开篇前先说点废话。本着“更数学、更工程、更艺术”的宗旨,为了我最遥远的那个目标——开发出一款依托机器学习模型的改变人思维方式的产品,简而言之就是利用机器让人们认识到人类固有思维模式认知模式上的局限性。而在这个目标之下,目前有一些小目标。本人是某数学系本科毕业1个月的渣渣一枚。比起数学功底或者工程功底,可能艺术功底更厚(笑),但数学和工程思维的大框架还是有一些的。目前在某互金公司做反欺诈模型。

 言归正传,本篇是Hadoop系列第一篇——初识 MapReduce(1)。在这篇当中,将主要从比较宏观的角度,利用SQL语句作为表达数据处理过程的工具,解析MapReduce当中的Map过程和Reduce过程,这两者到底是什么,存在什么差别。

warning:本篇内容大部分出自自己的理解,肯定有不准确的地方,欢迎指出,见谅。

一、MapReduce和传统关系型数据库间的区别

 从发展过程上来讲,传统关系型数据库是为了适应生产过程而设计的,而MapReduce是为了适应数据处理(也就是某种对数据表的整体映射)而设计的。这就导致了使用B树来组织的传统关系型数据库擅长点查询(对某个用户进行查询)以及持续的更新操作;而对MapReduce而言擅长的是一次写入,多次读取的应用。一言以不是十分准确地蔽之,传统关系型数据库满足的是程序员们的需求,MapReduce满足的是后来兴起的数据矿工们的需求。这两类人群对数据不同的需求和处理方式也带来了传统关系型数据库与MapReduce之间的区别。
 而在关系型数据库发展成熟、数据体量变大而MapReduce还没出现之时,大规模数据处理以及高性能计算的需求早已出现。此时应运而生的是高性能计算和网格计算。而高性能运算和MapReduce的相同之处,在于两者都把大体量的数据分布式地存储于集群之中。而不同之处在于,高性能计算在执行一次计算的过程中需要先把数据从集群中取出,再统一进行运算;而在MapReduce中,数据先各自在存放自己的机器中进行Map处理,再汇总进行Reduce。

  • 相比高性能计算,MapReduce的优点有四个:
     1. 减少机器传输数据的次数,节约带宽。
     2. 在集群机器中进行Map运算之后(也就是对数据进行某种映射之后),数据体量往往会变小,也就是需要传输的数据量变小,节约带宽。
     3. 分布式的计算降低cpu的压力。
     4. 分布式的计算一旦出现机器故障,仅需要重做该机器负责的部分,而不需要全体重做。

 可以想象,而MapReduce出现之前,高性能计算曾经是当时处理大规模数据问题的主流解决方案,而其核心“分布式”在今天看来对比MapReduce来说分布得不太彻底和深入——仅仅在数据存储过程中进行分布,而没在计算上进行分布。这样的方式在当时对数据进行复杂映射需求量尚小时或许是个好的解决办法,更何况这种方法可以把在小规模数据集上的运算方法直接迁移过来,而不需要对运算方法本身进行重构。而为了适应分布式的计算,MapReduce则需要为具体的运算方法比如说矩阵乘法、并交差连接运算等基础方法的给出一套解决方案。

MapReduce的核心特征:数据本地化(data locality)
 用正常人的语言表达,是指在集群中存储数据的机器上对它所存储的数据先进行一次Map运算,最后再通过一次Reduce运算聚合得到所需要的结果。

二、MapReduce是什么

Hadoop=MapReduce+HDFS
HDSF:分布式文件系统(着重分布式存储)
MapReduce:一套在分布式集群上实现诸多常见数据处理运算,并且为计算过程中的硬件错误提供容错性的组件。(着重分布式运算)

三、Map、Reduce是什么

 一言以敝之,Map就相当于SQL里的group by,Reduce就相当于SQL里的select 后面跟着的聚合函数。完。
 展开来讲,熟悉SQL的人都知道。进行group by操作之后,通过每个group作用聚合函数来得到我们想要的结果。group 与 group之间是毫无影响毫无关联的,这不正是分布式计算的思想吗?
 因此Map操作如下三步:
1. 根据具体运算,决定group by对象(假设为属性key)
2. 把数据改写为(key,Value)键值对
3. 常常同一个键有多种键值对,比如有(key,Value_1)、(key,Value_2),合并成键值表(真正的分组操作)(key,[Value_1,Value_2,…,Value_n])。
 而对于Reduce,则是对每个键值表使用某个特定的函数(类似于聚合函数),生成我们要的结果。正如上述所言,在这一部分里每个键值表被函数作用的过程各自独立,互不相关。

四、部分主要算法MapReduce过程的SQL表示

矩阵向量乘法

  • 定义:

1. n×n 矩阵M,第i行j列的元素记为 mij
表名M,基础表结构:

i j m
1 1 0

2. n×1 向量V,第k行元素记为 vk
表名N,基础表结构:

k v
1 0

  • 语言表示(之后的例子不再用语言表示):
    Map:Map函数应用于M的一个元素。一般情况下v可以被直接读入内存。对每个矩阵元素 mij 产生一个键值对 (i,mijvj)
    Reduce:Reduce函数简单地将所有与给定键值i关联的值相加即可得到结果 (i,xi)

  • SQL表示:

select
i
,sum(value)as x                         ##3
from(
    select 
    i
    ,if(j=k,v*m,0) as value             ##1
    from M left join V
)t
group by i;                             ##2
说明: Map过程类似于执行语句1、2,Reduce过程类似于执行了语句3。

选择运算(select)

  • 定义:
    表名t,需要选出x1、x2属性。
x1 x2 x3
1 2 0

  • SQL表示:
select 
x1 as x1
,x2 as x2
from(
    select 
    x1
    ,x2
    from t
)t
group by x1,x2
说明:由于select操作本身便符合交换律和结合律,直接可以分布式操作,所以Reduce操作相当于对Map结果作用一个恒等函数,也就是Map的结果其实就是我们想要的结果。

投影运算(select distinct)

  • 定义:
    表名t,需要选出x1、x2属性并对其去重。
x1 x2 x3
1 2 0

  • SQL表示:
select 
x1 as x1
,x2 as x2
from(
    select 
    x1
    ,x2
    ,count(*) as cnt ##这个语句只是凑数的,不需要计数这个功能
    from(
        select  
        x1
        ,x2
        from t
    )t
    group by x1,x2 ##Map操作完成的内容,除此之外都是Reduce完成
)t

自然连接运算(join)

  • 定义:

1.表R,属性a,b

a b
1 2

2.表S,属性b,c

b c d
2 3 1

  • SQL表示:
##恕我技拙这个暂时还真的想不到适合的SQL表示
##因为主要是在group by之后每个group内部的两部分进行full join
##我猜肯定有类似的用法的,知道的人请告诉我=。 = 
  • 语言表示:
    Map:对于R中的每个元组(a,b),整容为(b,(R,a)),对S中的每个元组,整容为(b,(S,c))。并整理成键值表。也就是
    (bi,[(R,ai1),,(R,ain1),(S,ci1),,(R,ain1)])

    Reduce:对每个 bi 的列表中不是来自同一个矩阵的a属性和c属性进行full join。

矩阵乘法

  • 定义:

1. I×J 矩阵M,i属性代表行号,j属性代表列号,m代表值。

i j m
1 1 2

2. J×K 矩阵N,i属性代表行号,j属性代表列号,n代表值。

j k n
1 1 3
  • SQL表示:
select 
i as i
,k as k
,sum(x) as x                        ##4
from(
    select 
    i
    ,k
    ,n*m as x                       ##2
    from M 
    inner join N on M.j=N.j         ##1
)t
group by i,k                        ##3

说明:这是分两步的MapReduce方法,还有一步成型的方法,这里不作赘述。语句1属于第一个Map,2属于第一个Reduce,3属于第二个Map,4属于第二个Reduce。


finish.
by 2017-08-13

发布了8 篇原创文章 · 获赞 1 · 访问量 3261

猜你喜欢

转载自blog.csdn.net/sinat_30165411/article/details/77132286