MRJob相同的密钥被发送到不同的减速器

2024-05-20 00:38:52 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我把hadoop2.7.1安装在一个3机集群上。我正在尝试使用MRJob和Hadoop流媒体运行一个反向索引mapreduce作业。在

以下是我的配置:

MRJob.SORT_VALUES = True 

def steps(self):
    JOBCONF_STEP1 = {
        "mapred.map.tasks":20,
        "mapred.reduce.tasks":10
    }
    return [MRStep(jobconf=JOBCONF_STEP1,
                mapper=self.mapper,
                reducer=self.reducer)
            ]

然而,我注意到在我的输出中,我经常得到同一个键到两个不同的减速器。这将导致如下输出:

^{pr2}$

这意味着一个减速器获得X键和值1和2,而另一个减速器也获得X键和值3。但是我只需要一个reducer来获得X键和所有相关的值。在

所以期望的输出是:

Key | Output
X   | 1,2,3
Z   | 1,2

如何解决此问题?在

这是我的MRJob代码

%%writefile invertedIndex.py

import json
import mrjob
from mrjob.job import MRJob
from mrjob.step import MRStep
class MRinvertedIndex(MRJob):

  MRJob.SORT_VALUES = True 

  def steps(self):
      JOBCONF_STEP1 = {
          "mapred.map.tasks":20,
          "mapred.reduce.tasks":10
      }
      return [MRStep(jobconf=JOBCONF_STEP1,
                  mapper=self.mapper,
                  reducer=self.reducer)
              ]

  def mapper(self,_,line):
      key, stripe = line.split("\t")
      stripe = json.loads(stripe)
      for w in stripe:
          yield w, key

  def reducer(self,key,values):
      d = [v for v in values]
      yield key,d

  if __name__ == '__main__':
      MRinvertedIndex.run() enter code here

Tags: keyimportselfdefstripetasksmappermrjob
1条回答
网友
1楼 · 发布于 2024-05-20 00:38:52

明白了。问题是MRJob默认设置了以下内容:

'stream.num.map.output.key.fields': '2'

我通过在jobconf中显式设置来解决问题:

^{pr2}$

我不知道2怎么会成为这个设置的默认值,但至少我解决了我的问题

相关问题 更多 >