2012-06-29 11 views
7

Tôi cần chạy công việc Mapreduce năng động theo nghĩa là các thông số cần được chuyển đến các chức năng bản đồ và giảm mỗi khi công việc Mapreduce được chạy (ví dụ, để đáp ứng yêu cầu của người dùng).Làm cách nào để truyền các tham số động tới chức năng ánh xạ trên bản đồ GAE?

Làm cách nào để thực hiện việc này? Tôi không thể thấy bất cứ nơi nào trong tài liệu hướng dẫn cách xử lý động trong thời gian chạy để lập bản đồ và giảm.

class MatchProcessing(webapp2.RequestHandler): 

    def get(self): 
     requestKeyID=int(self.request.get('riderbeeRequestID')) 
     userKey=self.request.get('userKey') 
     pipeline = MatchingPipeline(requestKeyID, userKey) 
     pipeline.start() 
     self.redirect(pipeline.base_path + "/status?root=" + pipeline.pipeline_id) 


class MatchingPipeline(base_handler.PipelineBase): 
    def run(self, requestKeyID, userKey): 
     yield mapreduce_pipeline.MapreducePipeline(
      "riderbee_matching", 
      "tasks.matchingMR.riderbee_map", 
      "tasks.matchingMR.riderbee_reduce", 
      "mapreduce.input_readers.DatastoreInputReader", 
      "mapreduce.output_writers.BlobstoreOutputWriter", 
      mapper_params={ 
       "entity_kind": "models.rides.RiderbeeRequest", 
       "requestKeyID": requestKeyID, 
       "userKey": userKey, 
      }, 
      reducer_params={ 
       "mime_type": "text/plain", 
      }, 
      shards=16) 


def riderbee_map(riderbeeRequest): 
    # would like to access the requestKeyID and userKey parameters that were passed in mapper_params 
    # so that we can do some processing based on that 

    yield (riderbeeRequest.user.email, riderbeeRequest.key().id()) 


def riderbee_reduce(key, values): 
    # would like to access the requestKeyID and userKey parameters that were passed earlier, perhaps through reducer_params 
    # so that we can do some processing based on that 

    yield "%s: %s\n" % (key, len(values)) 

Trợ giúp xin vui lòng?

+0

FYI ... ở đây là làm thế nào để gửi dữ liệu đến một công việc trong Java - http: // www. thecloudavenue.com/2011/11/passing-parameters-to-mappers-and.html –

+0

Hmmm. Liên kết mà bạn cung cấp cho các điểm đến nội dung của Hadoop. Điều này là dành cho GAE MapReduce ... –

Trả lời

5

Tôi chắc rằng bạn chỉ có thể chỉ định tham số trong mapper_parameters và đọc chúng từ mô-đun ngữ cảnh. Xem http://code.google.com/p/appengine-mapreduce/wiki/UserGuidePython#Mapper_parameters để biết thêm chi tiết.

+0

Ngoại trừ trong liên kết bạn tham chiếu đến các tham số đó không phải là động (nghĩa là, không được truyền theo chương trình tại thời gian chạy) thay vì chúng được đọc từ mapreduce.yaml là tĩnh. Tức là, trừ khi tôi hiểu sai về cách thức này sẽ làm việc –

+0

Trong mã bạn sử dụng ở trên, có một tham số mapper_params cho hàm tạo MapreducePipeline; cũng có tham số mapreduce_parameters. Đây là tương đương với các tham số đến từ tệp yaml. Xem mã tại đây: http://code.google.com/p/appengine-mapreduce/source/browse/trunk/python/src/mapreduce/control.py –

4

Đây là cách để truy cập vào các thông số ánh xạ từ các chức năng lập bản đồ, sử dụng các mô-đun bối cảnh:

from mapreduce import context 

def riderbee_map(riderbeeRequest): 
    ctx = context.get() 
    params = ctx.mapreduce_spec.mapper.params 
    requestKeyID = params["requestKeyID"]