Лучший функциональный язык для MapReduce? [закрытый]

Я делаю задание для курса, который требует от меня, чтобы реализовать параллельный движок MapReduce на функциональном языке, а затем использовать его решить некоторые простые проблемы.

какой функциональный язык, как вы думаете, я должен использовать?

вот мои требования:

  • должно быть относительно легко учиться, так как у меня есть только около 2 недель для этого задания.
  • имеет существующий MapReduce реализации, которые можно найти в интернете-мой курс делает не запретите мне использовать открытый код или интернет-ресурсы в целом.
  • должен соответствовать проблеме и быть в целом стоящим языком для изучения (относительно популярный язык).

в настоящее время я рассматриваю Haskell и Clojure, но оба эти языка являются новыми для меня - я понятия не имею, действительно ли какой-либо из этих языков подходит для ситуации.

5 ответов


оба Clojure и Haskell, безусловно, стоит учиться, по разным причинам. Если у тебя будет шанс, я попробую и то и другое. Я бы также предложил добавить Scala в ваш список.

Если вам нужно выбрать один, я бы выбрал Clojure по следующим причинам:

  • это Лисп - каждый должен научиться шепелявить. См.http://www.paulgraham.com/avg.html
  • он имеет уникальный подход к параллелизму - см. http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • это язык JVM, что делает его сразу полезным с практической точки зрения: экосистема библиотеки и инструмента на JVM чрезвычайно хороша, лучше, чем любая другая платформа IMHO. Если вы хотите заниматься серьезными технологиями. работа в пространстве предприятия или стартапа, очень полезно получить хорошее знание JVM. FWIW, Scala также попадает в эту категорию " интересных JVM языки."

кроме того, Clojure делает параллельную карту-уменьшить очень легко. Вот один, чтобы начать с:

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

используя pmap, а не map достаточно, чтобы дать вам параллельную работу сопоставления. Существуют также параллельные редукторы, если вы используете Clojure 1.5, см. редукторы framework для более подробной информации


Облако Хаскелл будет подходящим выбором для механизма распределенной системы, на котором будет реализована модель map/reduce. Однако для двухъядерной локальной системы достаточно просто реализовать ее непосредственно в GHC, используя существующую поддержку параллелизма во время выполнения GHC. Легкие потоки, рабочие очереди кражи и другие полезные примитивы предоставляются из коробки.

Если бы я реализовывал движок/ new / MapReduce, я бы использовал GHC. Типы, параллельная отладка такие инструменты, как ThreadScope и оптимизирующий компилятор гарантируют, что вы сможете получить требуемую производительность из кода, в то время как отличная многоядерная среда выполнения будет пусть Вам масштабе.


Cascalog и Clojure даст вам довольно повернуть ключ способ начать работу. Если вам нужно создать свой собственный кластер, я рекомендую использовать pallet-hadoop для развертывания кластера hadoop, хотя для образовательных целей cascalog хорошо работает локально.


Я бы лично рекомендую использовать ошпаривать, это абстракция 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, это не слишком далеко от обычных программ Map / Reduce Java, и даже если вы не знаете Scala, это не слишком сложно подобрать.


в качестве стартового места для вашего двигателя вас может заинтересовать бумага модель программирования Google MapReduce -- Revisited, который описывает MapReduce с функциональной точки зрения. Типы описываются с использованием нотации Haskell, но это должно быть легко перевести на любой язык, который вы выбираете.