MapReduce算法模式

来源:互联网 发布:mac如何安装软件知乎 编辑:程序博客网 时间:2024/05/21 08:40

原文:http://www.kamang.net/node/223

读者是没有耐心的,我也没有,所以先说结论:你可以不用编程序,只要鼠标点几下拖动些图标,改改参数,就能完成过亿数据的分布处理程序。

当然,这么理想的目标现在还没有达到,但路已经明明白白的展现在面前了,至少我们已经走了接近一半了。

首先说明, MapReduce算法本身就来自于函数式编程,因此用FP的思路来进行算法构建是再合理不过的事情。之前的程序是用Haskell开发的,现在用Python重新写了一个版本。

在做了一些MR的实际应用后,发现很多问题都有基本的算法模式,而且几个模式都很简单。后续会总结出来,这里说个该要:(自己总结的,比较山寨)
MapReduce算法模式

1. 元模式: MR Chain
多个MapReduce过程可以串接起来,实现任意复杂的统计算法。
也可以称为 Data Flow 模式
2. Map模式
包括 Field count , Field Join 两个
3. Reduce 模式
KeyCount, Value Sum, NubCount, Value Join
核心思想

(借用Java界的说法)
1. 数据流编程:源数据从MR网一端流入,在一个处理链中依次处理,获得最终结果,链可以有多个分支
2. 组合子编程:使用通用的 Mapper, Reducer 算子,组合起来实现复杂的功能,
这是一个相乘的过程,结合MR Chain,可以倍增处理的复杂度。
尽量保持每个算子的简单性和原子性,功能正交。
3. 函数柯里化:组合子可以通过参数定制,生成用户定义的函数
应用实例
输入数据

时间                                  ip                    省份           用户uuid
"03-09-2008 17:11:10"1987636648"四川""0CE12C9121CA8E2484440B4459781BDB"
"03-09-2008 17:11:15"1018955844"浙江""19173BB499F4B0A62F19AFEB5BA5017A"
"03-09-2008 17:11:18"2030878566"广东""B596B9655D2ACD4D449D5262C1B9D3BE"
"03-09-2008 17:11:19"1947385333"广东""9CF2210902BBF421E9DF1CB384B65CC7"
"03-09-2008 17:11:24"1964392548"陕西""7EBE2805FBDFAB3C7B11395CB76364F4"
"03-09-2008 17:11:35"3722701596"江苏""CDA23CC1EBAC208168C8AF1C88D03E55"
"03-09-2008 17:11:09"1034301425"云南""5573F458F859E35D7DDCA346FD1A35A8"
"03-09-2008 17:11:09"1987636648"四川""0CE12C9121CA8E2484440B4459781BDB"
"03-09-2008 17:11:09"1987636648"四川""0CE12C9121CA8E2484440B4459781BDB"
"03-09-2008 17:11:10"1987636648"四川""0CE12C9121CA8E2484440B4459781BDB"

统计需求

各个省上报的uuid 的不重复数目,
每个uuid上报的次数
不同上报次数分别有多少人
处理过程

串接的两个MR,第一个产生前两个需求的结果,获得的中间结果给第二个MR,得到第三个需求结果。

任务描述

test_tasks = {
    'task1' : {'name' : 'task1',
               'input' : 'userinfo.test',
               'mrs' : [('province', ('', 'm_field_count(2)'), ['KeyCount', 'NubCount']),
                        ('uuid', ('', 'm_field_count(3)'), ['KeyCount']),
                        ],
               'output' : 'task1.out',
               'next' : ['task2']
               },

    'task2' : {'name' : 'task2',
               'input' : 'task1.out',
               'mrs' : [('uuid_count_nub', ('c_uuid', 'm_field_join(1, 0)'), ['NubCount'])
                        ],
               'output' : 'task2.out',
               'next' : []
    }
}

通过框架读取任务描述,自动生成测试运行脚本,及4个程序:

run.sh

#!/bin/sh
cat userinfo.test | python task1_map.py | sort | python task1_reduce.py > task1.out
cat task1.out | python task2_map.py | sort | python task2_reduce.py > task2.out

task1_map.py, task1_reduce.py, task2_map.py, task2_reduce.py 是自动生成的。

执行测试:

Task1:

$ head -n 10 userinfo.test | ./task1_map.py | sort | python ./task1_reduce.py

c_province_"云南"1
nc_province_"云南"1
c_province_"四川"4
nc_province_"四川"1
c_province_"广东"2
nc_province_"广东"1
c_province_"江苏"1
nc_province_"江苏"1
c_province_"浙江"1
nc_province_"浙江"1
c_province_"陕西"1
nc_province_"陕西"1
c_uuid_"0CE12C9121CA8E2484440B4459781BDB"4
c_uuid_"19173BB499F4B0A62F19AFEB5BA5017A"1
c_uuid_"5573F458F859E35D7DDCA346FD1A35A8"1
c_uuid_"7EBE2805FBDFAB3C7B11395CB76364F4"1
c_uuid_"9CF2210902BBF421E9DF1CB384B65CC7"1
c_uuid_"B596B9655D2ACD4D449D5262C1B9D3BE"1
c_uuid_"CDA23CC1EBAC208168C8AF1C88D03E55"1

Task2:

$ head -n 10 userinfo.test | ./task1_map.py | sort | python./task1_reduce.py | python task2_map.py  | sort | pythontask2_reduce.py

nc_uuid_count_nub_16
nc_uuid_count_nub_41

实际运行,扔到Hadoop上跑,前面的文章中说过了。

整个过程中,只需要写一个配置文件,描述出各个任务,每个任务中的Map 和 Reduce 是什么即可。
后续工作

完善框架,自动生成程序等。
收集整理 Mapper, Reducer 算子。
基于web或者gui 的MR Chain 设计器。