MapReduce

2009年10月6日

MapReduce是一种编程习惯用法,它为将类似项组合成等价类的程序提供了一种方便的表达式。这个习惯用法是由谷歌开发的,它是一种利用大型计算机集群并行处理大量数据的方法,但也可以作为构建某些类型程序的一种方法。Jeffrey Dean和Sanjay Ghemawat纸张 MapReduce:大型集群上的简化数据处理,描述这个成语:

用户指定一个map函数,该函数处理一个键/值对以生成一组中间键/值对时,以及一个reduce函数,它合并与同一中间键关联的所有中间值。

谷歌使用MapReduce在其数据中心的大型机器上自动并行计算,优雅地“划分输入数据,跨机器调度程序的执行,处理机器故障,并管理所需的机器间通信。”我们的愿望(和预算)更适度:构建一个框架,在日常程序中利用mapreduce习惯用法。考虑以下示例:

  • 计算字符串中字母或文本中单词的频率。映射器将值1与作为关键字的每个字符或单词相关联,而减数器只是一个加法运算符,将所有的1相加以计算单词数。
  • 生成程序源文本的交叉引用列表。映射器将每个标识符与出现的行号相关联,而缩减器收集每个标识符的行号,丢弃重复的行号。
  • 识别单词列表中的变形词。映射器通过将每个单词的字符按字母顺序排序来“标记”每个单词,而缩减器将具有常见签名的单词组合在一起。

这个地图还原函数有四个参数:映射函数、约简函数、操作键的小于谓词和输入列表。映射函数从输入列表中获取一个项并返回一个键/值对,而缩减函数获取一个键、一个新值和一个现有值,并将新值合并到现有值中。一个有用的变体地图还原函数从文件而不是列表读取输入;它用文件名替换输入列表参数,并添加第五个参数,这是一个读取函数,用于从文件中获取下一个输入项。

您的任务是编写地图还原地图缩小输入功能。完成后,欢迎您阅读运行建议的解决方案,或者在下面的评论中发布你的解决方案或讨论这个练习。

页:1 2

2对“MapReduce”的回应

  1. […]Praxis–MapReduce作者Remco Niemeijer在今天的编程Praxis练习中,我们必须实现著名的MapReduce算法。让我们得到[…]

  2. 雷姆科·尼梅耶

    My Haskell解决方案(请参阅http://bonsaicode.wordpress.com/2009/10/06/programming-praxis-mapreduce/对于带有注释的版本):

    mapReduce::Ord k=>(a->(k,v))->(v->v->v)->(k->k->Bool)->[a]->[(k,v)]mapReduce m r lt=sortBy(\(a,_)(b,_)->如果lt a b,则lt else GT)。M.协会。M.map(文件夹1 r)。M.fromListWith(++)。地图(第二个返回.m)mapReduceInput::Ord k=>(a->(k,v))->(v->v->v)->(k->k->Bool)->(字符串->[a])->文件路径->IO[(k,v)]mapReduceInput m r ltg=fmap(mapReduce m r lt.g)。readFile(读取文件)

留下评论