http://tech.rufy.com/2006/08/mapreduce-for-ruby-ridiculously-easy.html
MapReduce라는 구글의 논문을 루비로 구현한 것입니다. 사실은 완전한 복제판이라 보기는 힘들고 network에 대한 transparency만 확보했다고 보면 될 듯 합니다. 예제를 보면,
class Item < ActiveRecord::Base; end server do |map_reduce| map_reduce.type = Item end client do |item| logger.info item.some_processor_intensive_task end [/code] 와 같이 코딩합니다. 여기서 서버는 Item 이라는 테이블의 모든 행을 가져와서 일단 갖고 있습니다. 그리고 client는 그 자료를 받아와서 작업을 하는 것입니다. 실행은 그냥 콘솔에서 [code] starfish foo.rb [/code] 와 같이 하면 됩니다. 그러면 서버하나와 클라이언트 하나가 실행되고, 로그는 자동으로 /tmp 밑에 남겨지게 됩니다. 만약 남는 서버가 있어서 클라이언트를 추가하고 싶다면 한번 더 starfish foo.rb 만 하면되고, 그러면 그 새로운 서버측에서는 알아서 로컬 네트웍에서 서버를 찾아서 클라이언트 부분만 실행한다는 것이죠. 또다른 예를 보죠. [code lang="ruby"] # foo.rb class Foo attr_reader :i def initialize @i = 0 end def inc logger.info "YAY it incremented by 1 up to #{@i}" @i += 1 end end server do |object| object = Foo.new end client do |object| object.inc puts "incremented" sleep 1 end [/code] 이경우는 서버에서 로그를 /tmp/foo.rb.log로 남기고 클라이언트는 같은 객체에 대해서 object.inc를 호출합니다. 다시 말해 하나의 Foo.new 인스턴스를 가지고 다수의 클라이언트가 concurrent하게 inc를 호출한다는 것이죠. 그러면 이 부분은 확실하게 synchronization issue가 발생하는데 이것을 starfish가 해결하고 있는지 아닌지는 잘 모르겠습니다. 뭐 소스를 보던가 아니면 작성자를 컨택해봐야겠죠. 소스를 잘 보면 알 수 있듯이, 그리고 제일 위 링크의 블로그에도 써 있듯이 starfish는 'reduce'부분이 빠져있습니다. 사실은 개별처리한 뒤 값을 모으는 부분도 분명 어려운 부분이죠. 예를들어 구글에서는 mapreduce에서, 1) 서버는 2천대 있다, 2) 입력 파일은 a,b,c,... 이다, 3) 출력은 xyz로 해야한다고 명시합니다. 그러면 뭐 연산이야 나눠서 하면 되는 것이지만, 모으는 것은 역시 머리를 잘 써야만 하겠죠. 2000개를 별도로 처리하고 두개씩 짝지어서 reduce할것인지 아니면 몽창 센터로 갖고 올것인지를요. non functional 한 특징으로 또 중간에 하나가 crash나면 어떻게 할 것인지 등도 생각해야겠죠. 이런 것들이 다~ 구현되어있을리는 없지만, 그래도 매우매우 매력적인 drb대체 툴인 듯 합니다. 아무튼 간만에 눈길을 끄는 작품이라 끄적여봤습니다.