2012-06-29 13 views
7

mapreduceジョブが実行されるたびに(たとえば、ユーザーの要求に応じて)、パラメータをマップに渡す必要があるという意味で動的なmapreduceジョブを実行する必要があります。GAE mapreduceで関数をマップするためにパラメータを動的に渡す方法はありますか?

どうすればよいですか?ドキュメントのどこにでも、実行時に動的な処理をマップや縮小のために行う方法がわかりませんでした。

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)) 

助けてください。

+0

FYI ...ここにJavaでジョブにデータを送信する方法である - にhttp:// WWW。 thecloudavenue.com/2011/11/passing-parameters-to-mappers-and.html –

+0

Hmmm。あなたが与えるリンクは、Hadoopのものを指しています。これはGAE MapReduceのためのものです... –

答えて

5

mapper_parametersでパラメータを指定し、コンテキストモジュールからパラメータを読み取ることができます。詳細はhttp://code.google.com/p/appengine-mapreduce/wiki/UserGuidePython#Mapper_parametersを参照してください。

+0

リンクでは、それらのパラメータを参照するのではなく、静的なmapreduce.yamlから動的に読み込まれます(つまり、実行時にプログラムで渡されません)。つまり、これがどういうふうに誤解していない限り、 –

+0

上記のコードでは、MapreducePipelineコンストラクタのmapper_paramsパラメータがあります。 mapreduce_parametersパラメータもあります。これらは、yamlファイルから来たparamsに相当します。ここのコードをご覧ください:http://code.google.com/p/appengine-mapreduce/source/browse/trunk/python/src/mapreduce/control.py –

4

これは、コンテキストモジュールを使用して、マッパー関数からマッパーのパラメータにアクセスする方法である:

from mapreduce import context 

def riderbee_map(riderbeeRequest): 
    ctx = context.get() 
    params = ctx.mapreduce_spec.mapper.params 
    requestKeyID = params["requestKeyID"] 
関連する問題