python的简单MapReduce实现:计算π

标签: python mapreduce 计算 | 发表时间:2011-09-10 15:00 | 作者:(author unknown) Roger
出处:http://blog.leezhong.com/

MapReduce是Google提出的一个软件架构,一般用于大规模数据集的并行运算。核心概念就是"Map(映射)"和"Reduce(化简)"。

简单说来就是把一个任务分割成多个独立的子任务,子任务的分发由map实现,子任务计算结果的合并由reduce实现。

mapreduce的应用场景多是那种互不依赖,上下文无关的任务。所以类似Fibonacci数列这种对输入有依赖的就不适合使用mapreduce。

回到正题,要计算圆周率,我们先构建这么个模型

# 外面的正方形面积
As = (2r)(2r) or 4r*r
# 里面的圆的面积
Ac = pi*r*r

pi = Ac / (r*r)
As = 4r*r
r*r = As / 4
pi = 4 * Ac / As

也就是说只要算出圆的面积与正方形面积的比,就可以求出圆周率。

可以通过以下步骤计算Ac / As:

1) 随机在正方形里生成许多点
2) 计算点在圆内与在正方形内的比例

测试的随机点越多,结果越精确

#coding=utf-8
import random
import multiprocessing
from multiprocessing import Process

class MapReduce(object):
    
    def __init__(self, map_func, reduce_func, workers_num=None):
        self.map_func = map_func
        self.reduce_func = reduce_func
        self.workers_num = workers_num
        if not workers_num:
            workers_num = multiprocessing.cpu_count()*2
        self.pool = multiprocessing.Pool(workers_num)

    def __call__(self, inputs):
        map_result = self.pool.map(self.map_func, inputs)
        reduce_result = self.reduce_func(map_result)
        return reduce_result

def calculator(*args):
    print multiprocessing.current_process().name,' processing'
    points, circle_round = args[0]
    points_in_circle = 0
    for i in range(points):
	    # 这里其实只取了1/4圆
        x = random.random()*circle_round
        y = random.random()*circle_round
        if (x**2 + y**2) < circle_round**2:
            points_in_circle += 1
    return points_in_circle

def count_circle_points(points_list):
    return sum(points_list)

if __name__ == '__main__':
    # 半径
    CIRCLE_ROUND = 10
    # 总点数
    POINTS = 10000000
    # 总进程数
    WORKERS_NUM = 10

    map_reduce = MapReduce(calculator, count_circle_points, WORKERS_NUM)
    inputs = [(POINTS/WORKERS_NUM, CIRCLE_ROUND)] * WORKERS_NUM
    all_points_in_circle = map_reduce(inputs)
    ac_as = float(all_points_in_circle)/POINTS
    print 'pi approach to:%7f'%(4*ac_as)

这是比较简单的单机mapreduce,用多进程就可以实现。如果是多机运算的话,就麻烦多了,类似这张图:

参考链接2有对这张图的解释

参考:

相关 [python mapreduce 计算] 推荐:

python的简单MapReduce实现:计算π

- Roger - 无网不剩
MapReduce是Google提出的一个软件架构,一般用于大规模数据集的并行运算. 核心概念就是"Map(映射)"和"Reduce(化简)". 简单说来就是把一个任务分割成多个独立的子任务,子任务的分发由map实现,子任务计算结果的合并由reduce实现. mapreduce的应用场景多是那种互不依赖,上下文无关的任务.

《Python科学计算》书稿完成

- richrat - python.cn(jobs, news)
《用Python做科学计算》已经改名为 《Python科学计算》. 经过几个月的修改,《Python科学计算》的书稿终于完成了. 历时23个月,622页,262千字,19章,266幅插图,360个实例程序,393份问卷调查. # 来源:HYRY Blog. [深圳] B2B电子商务网站架构师/程序员[linux] - 中亚电子商务有限公司.

Mapreduce小结

- MAGI-CASPER/Peter Pan - 博客园-唯有前进值得敬仰
读完mapreduce论文小结一下. 1.MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题. 输入是一个key-value对的集合,中间输出也是key-value对的集合,用户使用两个函数:Map和Reduce. Map函数接受一个输入的key-value对,然后产生一个中间key-value 对的集合.

Hadoop MapReduce技巧

- - 简单文本
我在使用Hadoop编写MapReduce程序时,遇到了一些问题,通过在Google上查询资料,并结合自己对Hadoop的理解,逐一解决了这些问题. Hadoop对MapReduce中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化. 为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型.

MapReduce原理

- - C++博客-牵着老婆满街逛
       MapReduce 是由Google公司的Jeffrey Dean 和 Sanjay Ghemawat 开发的一个针对大规模群组中的海量数据处理的分布式编程模型. MapReduce实现了两个功能. Map把一个函数应用于集合中的所有成员,然后返回一个基于这个处理的结果集. 而Reduce是把从两个或更多个Map中,通过多个线程,进程或者独立系统并行执行处理的结果集进行分类和归纳.

MapReduce优化

- - 行业应用 - ITeye博客
相信每个程序员在 编程时都会问自己两个问题“我如何完成这个任务”,以及“怎么能让程序运行得更快”. 同样,MapReduce计算模型的多次优化也是为了更好地解答这两个问题. MapReduce计算模型的优化涉及了方方面面的内容,但是主要集中在两个方面:一是计算性能方面的优化;二是I/O操作方面的优化.

Spark与Mapreduce?

- - 崔永键的博客
我本人是类似Hive平台的系统工程师,我对MapReduce的熟悉程度是一般,它是我的底层框架. 我隔壁组在实验Spark,想将一部分计算迁移到Spark上. 年初的时候,看Spark的评价,几乎一致表示,Spark是小数据集上处理复杂迭代的交互系统,并不擅长大数据集,也没有稳定性. 但是最近的风评已经变化,尤其是14年10月他们完成了Peta sort的实验,这标志着Spark越来越接近替代Hadoop MapReduce了.

Google Percolator替代MapReduce

- Hao - Solidot
Google在新一代内容索引系统中放弃了MapReduce,替代者是尚不为人知的分布式数据处理系统Percolator. The Register报道,Percolator是一种增量处理平台,它能持续更新索引系统,无需从头重新处理一遍整个系统. Google的工程师计划在下个月举行的年度USENIX Symposium 会议上公布Percolator相关论文.

下一代Hadoop MapReduce

- Jia - NoSQLFan
本文来自Hadoop Summit大会的一个演讲稿,主讲是Hadoop核心开发团队的Arun C Murthy (@acmurthy),同时他也是Yahoo!刚刚剥离的Hadoop独立公司Hortonworks的 Founder和架构师. 演讲中他讲述了现在的Hadoop存在的一些问题和集群上限,并展望了下一代Hadoop和其MapReduce将会得到的巨大提升.