2013-02-21 37 views
6

Tôi đang thực hiện bài tập cho khóa học yêu cầu tôi triển khai động cơ MapReduce song song bằng ngôn ngữ chức năng và sau đó sử dụng nó giải quyết một số vấn đề đơn giản.Ngôn ngữ chức năng tốt nhất để làm MapReduce?

Bạn nghĩ tôi nên sử dụng ngôn ngữ chức năng nào?

Dưới đây là yêu cầu của tôi:

  • nên được tương đối dễ dàng để tìm hiểu, kể từ khi tôi chỉ có khoảng 2 tuần để nhiệm vụ này.
  • Có các bản triển khai MapReduce hiện có có thể tìm thấy trên web - khóa học của tôi làm không phải là cấm tôi sử dụng mã nguồn mở hoặc tài nguyên internet nói chung.
  • Phải phù hợp với vấn đề và là một ngôn ngữ đáng giá để học (ngôn ngữ tương đối phổ biến).

Tôi hiện đang xem xét Haskell và Clojure, nhưng cả hai ngôn ngữ này đều mới đối với tôi - Tôi không biết có bất kỳ ngôn ngữ nào trong số này thực sự phù hợp với tình huống không.

+1

Bạn sẽ sử dụng bao nhiêu nút tính toán? Đa lõi? Hoặc một cụm? –

+3

Nền của bạn là gì? Việc học ngôn ngữ dễ dàng như thế nào phụ thuộc * rất nhiều * vào trải nghiệm của bạn. – luqui

+0

Tôi chưa bao giờ viết một chương trình không tầm thường bằng một ngôn ngữ chức năng. Tôi đã viết các chương trình TRIVIAL trong Prolog và Haskell. Tuy nhiên, tôi đã được lập trình bằng ngôn ngữ mệnh lệnh (C, C++, Python) trong hơn 10 năm. Tôi tự coi mình là một lập trình viên chuyên gia C. @ DonStewart: Đây không phải là một chương trình thực tế, nhưng chỉ là một nhiệm vụ cho một lớp học. 2 lõi là tốt. –

Trả lời

7

Cả Clojure và Haskell chắc chắn đáng học tập, vì nhiều lý do khác nhau. Nếu bạn có cơ hội, tôi sẽ thử cả hai. Tôi cũng khuyên bạn nên thêm Scala vào danh sách của bạn.

Nếu bạn phải chọn một, tôi sẽ chọn Clojure, vì những lý do sau đây:

  • Đó là một Lisp - tất cả mọi người nên tìm hiểu một Lisp. Xem http://www.paulgraham.com/avg.html
  • Nó có một cách tiếp cận độc đáo để đồng thời - xem http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • Đó là một ngôn ngữ JVM, mà làm cho nó ngay lập tức hữu ích từ góc độ thực tế: các công cụ thư viện & hệ sinh thái trên JVM là rất tốt, tốt hơn hơn bất kỳ IMHO nền tảng nào khác. Nếu bạn muốn làm công nghệ nghiêm túc. làm việc trong doanh nghiệp hoặc không gian khởi động, rất hữu ích để có được một kiến ​​thức tốt về JVM. FWIW, Scala cũng rơi vào thể loại "ngôn ngữ JVM thú vị" này.

Ngoài ra, Clojure giúp giảm bản đồ song song rất dễ dàng.Dưới đây là một bắt đầu với:

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

Sử dụng pmap hơn map là đủ để cung cấp cho bạn một hoạt động lập bản đồ song song. Cũng có các bộ giảm tốc song song nếu bạn sử dụng Clojure 1.5, xem reducers framework để biết thêm chi tiết

1

Cascalog and Clojure sẽ cung cấp cho bạn một cách khá chính xác để bắt đầu. Nếu bạn phải xây dựng cụm của riêng mình thì tôi khuyên bạn nên sử dụng pallet-hadoop để triển khai một cụm hadoop, mặc dù cho các mục đích giáo dục cascalog hoạt động tốt tại địa phương.

1

Cá nhân tôi khuyên bạn nên sử dụng Scalding, đó là một trừu tượng Scala trên đầu trang của Cascading để trừu tượng chi tiết Hadoop cấp thấp. Nó được phát triển tại Twitter, và dường như đã đủ chín chắn ngày hôm nay để bạn có thể bắt đầu sử dụng nó mà không gặp quá nhiều rắc rối.

Dưới đây là một ví dụ làm thế nào bạn sẽ làm một Số từ trong bỏng:

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+") 
    } 
} 

Tôi nghĩ rằng đó là một ứng cử viên tốt kể từ vì nó sử dụng Scala nó không quá xa từ Map thường xuyên/Giảm các chương trình Java, và thậm chí nếu bạn không biết Scala nó không quá khó để nhặt.

+0

Bạn có tính đến việc tôi cần viết một động cơ MapReduce thực tế không? Trong ví dụ của bạn, bạn dường như đang sử dụng một công cụ tích hợp sẵn có. Việc mở rộng có phải là một ngôn ngữ tốt để viết một Engine MapReduce không? –

0

Là nơi khởi đầu cho động cơ của bạn, bạn có thể quan tâm đến giấy Google's MapReduce Programming Model -- Revisited, mô tả MapReduce từ điểm chức năng. Các loại được mô tả bằng cách sử dụng ký hiệu Haskell, nhưng sẽ dễ dàng dịch sang bất kỳ ngôn ngữ nào bạn chọn.

7

Cloud Haskell sẽ là lựa chọn phù hợp cho công cụ hệ thống phân tán để triển khai mô hình bản đồ/giảm. Tuy nhiên, đối với một hệ thống địa phương lõi kép, nó là đủ để chỉ thực hiện nó trực tiếp trong GHC bằng cách sử dụng hỗ trợ song song hiện có trong thời gian chạy GHC. Chủ đề nhẹ, hàng đợi trộm cắp công việc và các nguyên thủy hữu ích khác được cung cấp ngoài hộp.

Nếu tôi đang triển khai công cụ/mới/MapReduce, tôi sẽ sử dụng GHC. Các loại, công cụ gỡ lỗi song song như ThreadScope và trình biên dịch tối ưu hóa đảm bảo bạn sẽ có thể nhận được hiệu suất bạn muốn từ mã, trong khi thời gian chạy đa lõi tuyệt vời sẽ let you scale well.

Các vấn đề liên quan