2013-02-21 131 views
6

我正在做一个课程的任务,这需要我在功能语言中实现一个并行MapReduce引擎,然后使用它来解决某些简单问题做MapReduce的最佳功能语言?

你认为我应该使用哪种功能语言?

这里是我的要求:

  • 应该是比较容易学习,因为我只有大约2周为这项任务。
  • 现有的MapReduce实现可以在网上找到 - 我的课程确实是而不是禁止我使用一般的开源代码或互联网资源。
  • 应该适合这个问题,并且要成为一种总体上有价值的语言来学习(一种相对流行的语言)。

我目前正在考虑Haskell和Clojure,但这两种语言对我来说都是新手 - 我不知道这些语言是否真的适合这种情况。

+1

您将使用多少个计算节点?多核心?还是集群? – 2013-02-21 22:37:15

+3

你的背景是什么?一门语言学习多么容易取决于你的经验。 – luqui 2013-02-21 22:37:26

+0

我从来没有用功能语言编写过非平凡的程序。我在Prolog和Haskell中编写了TRIVIAL程序。但是,我已经使用命令式语言(C,C++,Python)进行编程超过10年。我认为自己是一名C程序员。 @DonStewart:这不是一个真实世界的程序,而只是一个班级的作业。 2核心是好的。 – 2013-02-21 22:43:34

回答

7

由于不同的原因,Clojure和Haskell绝对值得学习。如果你有机会,我会尝试两种。我也建议将Scala添加到你的列表中。

如果一定要选一个,我会选择Clojure的,有以下原因:

  • 这是一个Lisp的 - 每个人都应该学习的Lisp。见http://www.paulgraham.com/avg.html
  • 它并发一个独特的方法 - 看http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • 这是一个JVM语言,这使得它立即从实践的角度有用:JVM上库&工具生态系统是非常好的,更好的比任何其他平台恕我直言。如果你想做严肃的技术。在企业或启动领域工作,对JVM有很好的了解是非常有帮助的。 FWIW,Scala也属于这类“有趣的JVM语言”。

另外,Clojure使平行map-reduce非常容易。下面是一个开始:

(reduce + (pmap inc (range 1000))) 
=> 500500 

使用pmap而非map就足以给你一个并行映射操作。也有平行的减速,如果你使用的Clojure 1.5,看到reducers framework更多细节

1

Cascalog and Clojure会给你一个相当转向关键的入门方式。如果你必须建立自己的群集,那么我建议使用pallet-hadoop来部署hadoop群集,但出于教育目的,cascalog在本地运行良好。

1

我个人推荐使用Scalding,这是一个在Cascading之上的Scala抽象,用于抽象低级Hadoop细节。它是在Twitter上开发的,今天看来已经够成熟了,所以你可以开始真正使用它,而不会有太多的麻烦。

下面是一个例子,你会怎么做一个WORDCOUNT在滚烫:

package com.twitter.scalding.examples 

import com.twitter.scalding._ 

class WordCountJob(args : Args) extends Job(args) { 
    TextLine(args("input")) 
    .flatMap('line -> 'word) { line : String => tokenize(line) } 
    .groupBy('word) { _.size } 
    .write(Tsv(args("output"))) 

    // Split a piece of text into individual words. 
    def tokenize(text : String) : Array[String] = { 
    // Lowercase each word and remove punctuation. 
    text.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+") 
    } 
} 

我认为这是一个很好的选择,因为,因为它使用Scala的它不是从正规地图太远/ Reduce的Java程序,即使你不知道斯卡拉,拿起它并不难。

+0

您是否考虑到需要编写实际的MapReduce ENGINE?在你的例子中,你似乎正在使用现有的内置引擎。烫伤是编写MapReduce ENGINE的好语言吗? – 2013-02-22 03:03:22

0

至于你的发动机起步的地方,你可能会感兴趣的文件Google's MapReduce Programming Model -- Revisited,它描述了从功能上看MapReduce的。类型使用Haskell符号来描述,但应该很容易翻译成您选择的任何语言。

7

Cloud Haskell对于在其上实现map/reduce模型的分布式系统引擎将是一个合适的选择。但是,对于双核本地系统,只需使用GHC运行时中的现有并行支持,直接在GHC中实现就足够了。提供轻量级线程,工作窃取队列和其他有用的基元。

如果我正在实现一个/ new/MapReduce引擎,我会使用GHC。类型,并行调试工具(如ThreadScope)和优化编译器确保您能够从代码中获得所需性能,而优异的多核运行时将会使用let you scale well.