簡體   English   中英

將參數傳遞給MRjob中的reducer

[英]Passing parameters to reducer in MRjob

我正在使用MRjob在HBase實例上運行Hadoop Streaming作業。 對於我的生活,我無法弄清楚如何將參數傳遞給我的reducer。 我有兩個參數,我想從運行作業時傳遞給我的reducer:startDate和endDate。 這是我目前的減速機的樣子:

def reducer(self, groupId, meterList):
    """
    Print bucket.
    """
    sys.stderr.write("Working on group = " + str(groupId) + "\n")
    #print "Opening connection..."
    conn = open_connection(hostname)
    #print "Getting table..."
    table = get_table(conn, tableName)

    compositeDf = DataFrame()

    for meterId in meterList:
        sys.stderr.write("Querying: " + str(meterId) + "\n")
        df = extract_meter_data(table, meterId, startDate, endDate)

我似乎無法將startDate和endDate作為參數傳遞給我的reducer。 我能夠獲得參數的唯一方法是通過類頂部的全局變量。

startDate = datetime.datetime(2012, 6, 10)
endDate = datetime.datetime(2012, 6, 11)

class MRDataQuality(MRJob):
    """
    MapReduce job that does a data quality check on the meter data in HBase.
    """

但那很臟。 我想通過調用這份工作來傳遞它。 我嘗試了很多方法。 將其設置為實例變量,將其設置為靜態類變量,為MRDataQualityJob創建重載的構造函數......似乎沒有任何效果。 我通過編程方式從我的頂級腳本調用它,如下所示:

if args.hadoop:
    mrdq_job = MRDataQuality(args=['-r', 'hadoop', '--conf-path', 'mrjob.conf', '--jobconf', 'mapred.reduce.tasks=42', meterFile])
else:
    mrdq_job = MRDataQuality(args=[meterFile])

with mrdq_job.make_runner() as runner:
    runner.run()

無論我對mrdq_job實例做什么,似乎runner.run()正在使用一個沒有定義實例或靜態變量的類的新實例。 如何將我的參數傳遞給reducer ???? 我可以通過傳遞一個字符串:“ - reducer reducer.py arg1 arg2”在常規Hadoop Streaming中完成。 MRjob有沒有相應的東西?

如何將參數傳遞給作業配置,然后使用get_jobconf_value讀取它們?

像這樣的東西:

from mrjob.compat import get_jobconf_value

class MRDataQuality(MRJob):

  def reducer(self, groupId, meterList):
    ...
    startDate = get_jobconf_value("my.job.settings.startdate")
    endDate = get_jobconf_value("my.job.settings.enddate")

    for meterId in meterList:
      sys.stderr.write("Querying: " + str(meterId) + "\n")
      df = extract_meter_data(table, meterId, startDate, endDate)    

然后像上面一樣在代碼中設置參數

mrdq_job = MRDataQuality(args=['-r', 'hadoop', '--conf-path', 'mrjob.conf', '--jobconf', 'mapred.reduce.tasks=42', '--jobconf', 'my.job.settings.startdate=2013-06-10', '--jobconf', 'my.job.settings.enddate=2013-06-11', meterFile])

如何將參數傳遞給作業配置,然后使用reducer_init中的get_jobconf_value讀取它們? 這樣您只需要讀取一次參數。

像這樣的東西:

from mrjob.compat import get_jobconf_value

class MRDataQuality(MRJob):

  def reducer_init(self):
    ...
    self.startDate = get_jobconf_value("my.job.settings.startdate")
    self.endDate = get_jobconf_value("my.job.settings.enddate")

  def reducer(self, groupId, meterList):
    for meterId in meterList:
      sys.stderr.write("Querying: " + str(meterId) + "\n")
      df = extract_meter_data(table, meterId, self.startDate, self.endDate)    

然后像上面一樣在代碼中設置參數

mrdq_job = MRDataQuality(args=['-r', 'hadoop', '--conf-path', 'mrjob.conf', '--jobconf', 'mapred.reduce.tasks=42', '--jobconf', 'my.job.settings.startdate=2013-06-10', '--jobconf', 'my.job.settings.enddate=2013-06-11', meterFile])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM