map_reduce 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/map_reduce.rb +1 -1
- data/lib/map_reduce/map_log.rb +1 -3
- data/lib/map_reduce/mapper.rb +21 -2
- data/lib/map_reduce/reduce_log.rb +1 -1
- data/lib/map_reduce/reducer.rb +2 -0
- data/lib/map_reduce/socket/req_fiber.rb +9 -1
- data/lib/map_reduce/version.rb +1 -1
- data/spec/map_reduce/map_reduce_spec.rb +22 -0
- metadata +4 -4
    
        data/lib/map_reduce.rb
    CHANGED
    
    | @@ -24,4 +24,4 @@ require File.expand_path("../map_reduce/reduce_log", __FILE__) | |
| 24 24 | 
             
            require File.expand_path("../map_reduce/socket/master", __FILE__)
         | 
| 25 25 | 
             
            require File.expand_path("../map_reduce/master", __FILE__)
         | 
| 26 26 | 
             
            require File.expand_path("../map_reduce/mapper", __FILE__)
         | 
| 27 | 
            -
            require File.expand_path("../map_reduce/reducer", __FILE__)
         | 
| 27 | 
            +
            require File.expand_path("../map_reduce/reducer", __FILE__)
         | 
    
        data/lib/map_reduce/map_log.rb
    CHANGED
    
    
    
        data/lib/map_reduce/mapper.rb
    CHANGED
    
    | @@ -4,13 +4,26 @@ module MapReduce | |
| 4 4 | 
             
                  @masters         = opts[:masters] || [::MapReduce::DEFAULT_SOCKET]
         | 
| 5 5 | 
             
                  @connection_type = opts[:type]    || :em
         | 
| 6 6 | 
             
                  @task_name       = opts[:task]
         | 
| 7 | 
            +
                  @disconnected    = {}
         | 
| 7 8 | 
             
                end
         | 
| 8 9 |  | 
| 9 10 | 
             
                def emit(key, value, &blk)
         | 
| 10 11 | 
             
                  raise MapReduce::Exceptions::BlankKey, "Key can't be nil"  if key.nil?
         | 
| 11 12 |  | 
| 12 13 | 
             
                  sock = pick_master(key)
         | 
| 13 | 
            -
                  sock.send_request(["map", key, value, @task_name] | 
| 14 | 
            +
                  sock.send_request(["map", key, value, @task_name]) do |res|
         | 
| 15 | 
            +
                    if res
         | 
| 16 | 
            +
                      @disconnected.delete(sock)  if @disconnected[sock]
         | 
| 17 | 
            +
                      if blk
         | 
| 18 | 
            +
                        blk.call(res)
         | 
| 19 | 
            +
                      else 
         | 
| 20 | 
            +
                        return res
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      @disconnected[sock] = true
         | 
| 24 | 
            +
                      emit(key, value, &blk)
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 14 27 | 
             
                end
         | 
| 15 28 | 
             
                alias :map :emit
         | 
| 16 29 |  | 
| @@ -50,7 +63,13 @@ module MapReduce | |
| 50 63 |  | 
| 51 64 | 
             
                def pick_master(key)
         | 
| 52 65 | 
             
                  num = Digest::MD5.hexdigest(key.to_s).to_i(16) % sockets.size
         | 
| 53 | 
            -
                  sockets[num]
         | 
| 66 | 
            +
                  sock = sockets[num]
         | 
| 67 | 
            +
                  # LOL :)
         | 
| 68 | 
            +
                  if @disconnected[sock] && rand(10) != 0
         | 
| 69 | 
            +
                    pick_master(key.chars.to_a.shuffle.join)
         | 
| 70 | 
            +
                  else
         | 
| 71 | 
            +
                    sock
         | 
| 72 | 
            +
                  end
         | 
| 54 73 | 
             
                end
         | 
| 55 74 |  | 
| 56 75 | 
             
                def sockets
         | 
    
        data/lib/map_reduce/reducer.rb
    CHANGED
    
    
| @@ -2,9 +2,17 @@ module EM::Protocols::Zmq2 | |
| 2 2 | 
             
              class ReqFiber < EM::Protocols::Zmq2::ReqCb
         | 
| 3 3 | 
             
                def send_request(data, &blk)
         | 
| 4 4 | 
             
                  fib = Fiber.current
         | 
| 5 | 
            -
                   | 
| 5 | 
            +
                  timer = nil
         | 
| 6 | 
            +
                  request_id = super(data) do |message|
         | 
| 7 | 
            +
                    EM.cancel_timer(timer)
         | 
| 6 8 | 
             
                    fib.resume(message)
         | 
| 7 9 | 
             
                  end
         | 
| 10 | 
            +
                  if request_id
         | 
| 11 | 
            +
                    timer = EM.add_timer(1) {
         | 
| 12 | 
            +
                      MapReduce.logger.info("TIMEOUT")
         | 
| 13 | 
            +
                      cancel_request(request_id)
         | 
| 14 | 
            +
                    }
         | 
| 15 | 
            +
                  end
         | 
| 8 16 | 
             
                  if block_given?
         | 
| 9 17 | 
             
                    blk.call Fiber.yield
         | 
| 10 18 | 
             
                  else
         | 
    
        data/lib/map_reduce/version.rb
    CHANGED
    
    
| @@ -137,6 +137,28 @@ describe "MapReduce stack" do | |
| 137 137 | 
             
                      EM.stop
         | 
| 138 138 | 
             
                    end
         | 
| 139 139 | 
             
                  end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                  it "should use one master" do
         | 
| 142 | 
            +
                    EM.synchrony do
         | 
| 143 | 
            +
                      # MapReduce::Reducer.const_set :TIMEOUT, 0.1
         | 
| 144 | 
            +
                      Process.kill "INT", @pid2
         | 
| 145 | 
            +
                      @mapper = MapReduce::Mapper.new type: :sync, task: "Fruits", masters: ["tcp://127.0.0.1:15555", "tcp://127.0.0.1:15556"]
         | 
| 146 | 
            +
                      @reducer = MapReduce::Reducer.new type: :sync, task: "Fruits", masters: ["tcp://127.0.0.1:15555", "tcp://127.0.0.1:15556"]
         | 
| 147 | 
            +
                      [["Peter", "Apple"], ["Andrew", "Peach"], ["Mary", "Plum"], ["Peter", "Lemon"], ["Andrew", "Orange"]].each do |a|
         | 
| 148 | 
            +
                        res = @mapper.map(*a)
         | 
| 149 | 
            +
                        res.must_equal ["ok"]
         | 
| 150 | 
            +
                      end
         | 
| 151 | 
            +
                      data = {}
         | 
| 152 | 
            +
                      @reducer.reduce do |k, values|
         | 
| 153 | 
            +
                        data[k] = values
         | 
| 154 | 
            +
                      end
         | 
| 155 | 
            +
                      data.size.must_equal 3
         | 
| 156 | 
            +
                      data["Peter"].sort.must_equal ["Apple", "Lemon"].sort
         | 
| 157 | 
            +
                      data["Andrew"].sort.must_equal ["Peach", "Orange"].sort
         | 
| 158 | 
            +
                      data["Mary"].must_equal ["Plum"]
         | 
| 159 | 
            +
                      EM.stop
         | 
| 160 | 
            +
                    end
         | 
| 161 | 
            +
                  end
         | 
| 140 162 | 
             
                end
         | 
| 141 163 | 
             
              end
         | 
| 142 164 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: map_reduce
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.5
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-07- | 
| 12 | 
            +
            date: 2013-07-15 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: bundler
         | 
| @@ -117,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 117 117 | 
             
                  version: '0'
         | 
| 118 118 | 
             
                  segments:
         | 
| 119 119 | 
             
                  - 0
         | 
| 120 | 
            -
                  hash:  | 
| 120 | 
            +
                  hash: -2358155464795184173
         | 
| 121 121 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 122 122 | 
             
              none: false
         | 
| 123 123 | 
             
              requirements:
         | 
| @@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 126 126 | 
             
                  version: '0'
         | 
| 127 127 | 
             
                  segments:
         | 
| 128 128 | 
             
                  - 0
         | 
| 129 | 
            -
                  hash:  | 
| 129 | 
            +
                  hash: -2358155464795184173
         | 
| 130 130 | 
             
            requirements: []
         | 
| 131 131 | 
             
            rubyforge_project: 
         | 
| 132 132 | 
             
            rubygems_version: 1.8.25
         |