做MapReduce的最佳功能语言?

时间:2013-02-21 21:55:11

标签: haskell clojure functional-programming mapreduce

我正在为一门课程做作业,这需要我用函数式语言实现并行MapReduce引擎,然后用它来解决某些简单的问题。< / p>

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

以下是我的要求:

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

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

5 个答案:

答案 0 :(得分:7)

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

如果你必须选择一个,我会选择Clojure,原因如下:

  • 这是一个 Lisp - 每个人都应该学习一个Lisp。请参阅http://www.paulgraham.com/avg.html
  • 它具有独特的并发方法 - 请参阅http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • 这是一种 JVM语言,从实用的角度来看,它立即变得有用:图书馆&amp; JVM上的工具生态系统非常好,比任何其他平台都好。如果你想做严肃的技术。在企业或创业空间工作,获得对JVM的良好了解非常有帮助。 FWIW,Scala也属于这类“有趣的JVM语言”。

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

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

使用pmap而非map足以为您提供并行映射操作。如果您使用Clojure 1.5,也有并行缩减器,有关详细信息,请参阅reducers framework

答案 1 :(得分:7)

对于要在其上实现map / reduce模型的分布式系统引擎,

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表示法描述类型,但应该很容易翻译成您选择的任何语言。