我正在为一门课程做作业,这需要我用函数式语言实现并行MapReduce引擎,然后用它来解决某些简单的问题。< / p>
您认为我应该使用哪种功能语言?
以下是我的要求:
我目前正在考虑使用Haskell和Clojure,但这两种语言对我来说都是新手 - 我不知道这些语言是否真的适合这种情况。
答案 0 :(得分:7)
Clojure和Haskell绝对值得学习,原因各不相同。如果你有机会,我会尝试两者。我还建议将Scala添加到您的列表中。
如果你必须选择一个,我会选择Clojure,原因如下:
另外,Clojure使并行map-reduce非常容易。这是一个开始:
(reduce + (pmap inc (range 1000)))
=> 500500
使用pmap
而非map
足以为您提供并行映射操作。如果您使用Clojure 1.5,也有并行缩减器,有关详细信息,请参阅reducers framework
答案 1 :(得分:7)
Cloud Haskell将是合适的选择。但是,对于双核本地系统,使用GHC运行时中的现有并行支持直接在GHC中实现它就足够了。开箱即用提供轻量级线程,工作窃取队列和其他有用的原语。
如果我正在实现/ new / MapReduce引擎,我会使用GHC。类型,并行调试工具(如ThreadScope)和优化编译器确保您能够从代码中获得所需的性能,而优秀的多核运行时将let you scale well.
答案 2 :(得分:1)
Cascalog and Clojure会给你一个相当转变的关键方式来开始。如果你必须建立自己的集群,那么我建议使用pallet-hadoop来部署一个hadoop集群,但出于教育目的,cascalog在本地运行良好。
答案 3 :(得分:1)
我个人建议使用Scalding,它是在Cascading之上的Scala抽象,以抽象低级Hadoop细节。它是在Twitter上开发的,今天看起来足够成熟,所以你可以毫不费力地开始实际使用它。
以下是如何在Scalding中执行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,它与常规的Map / Reduce Java程序相差不远,即使你不了解Scala也不太难以接受。
答案 4 :(得分:0)
作为引擎的起始位置,您可能对文章Google's MapReduce Programming Model -- Revisited感兴趣,该文章从功能的角度描述了MapReduce。使用Haskell表示法描述类型,但应该很容易翻译成您选择的任何语言。