zoukankan      html  css  js  c++  java
  • China (googlegroups) [CPyUG:78205] 基于Python的MapReduce算法的快速构建框架

    http://python.6.n6.nabble.com/CPyUG-78205-Python-MapReduce-td2790057.html

    China (googlegroups) - [CPyUG:78205] 基于Python的MapReduce算法的快速构建框架




        Feb 06, 2009; 1:31pm


        [CPyUG:78205] 基于Python的MapReduce算法的快速构建框架
        Albert Lee-7online

        675 posts
            

        做下广告:  MapReduce算法的快速构建   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 | python

        task2_reduce.py


        nc_uuid_count_nub_1 6

        nc_uuid_count_nub_4 1


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


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

        后续工作


        完善框架,自动生成程序等。

        收集整理 Mapper, Reducer 算子。

        基于web或者gui 的MR Chain 设计器。

  • 相关阅读:
    原生js片段
    IE 怪异模式(Quirks Mode)对 HTML 页面的影响
    CSS3 @font-face 的使用
    css面试题——九宫格
    一些前端冷知识
    利用 document.domain 在当前的域名或者基础域名 实现跨域
    JS 判断浏览器客户端类型(ipad,iphone,android)
    防止网站被iframe调用
    doctype 的各种声明
    JQUERY中的事件处理:RETURN FALSE、阻止默认行为、阻止冒泡以及兼容性问题
  • 原文地址:https://www.cnblogs.com/lexus/p/2409302.html
Copyright © 2011-2022 走看看