我已经实现了一个简单的Map reduce应用程序来检测最长的单词。工作成功执行 但现在我想知道在减速器中使用局部变量来保持最大长度是否正确?由于分布式环境中可能存在多个reducer,并且它们不共享该变量的值。
这是正确的假设吗?
当存在独立的减速器时,如何在分布式环境中影响输出? 我正在使用自定义比较器,因此单词首先按长度排序,然后按值排序。每个MR阶段的输出如下所示:
df = (df.set_index(cols)['contact'].str.split(' ',expand=True).stack()
Reducer类:
employee = {'EmployeeID' : [0,1,2],
'FirstName' : ['a','b','c'],
'LastName' : ['a','b','c'],
'MiddleName' : ['a','b, None],
'Contact' : ['(M) 133-245-3123', '(F)a123@gmail.com', '(F)312-533-2442 jimmy234@gmail.com']}
df = pd.DataFrame(employee)
答案 0 :(得分:1)
首先,我没有看到比较器的需要,因为找到最大的最大值不应该需要排序的数据集。
查找任何数据集的最大值是仅映射操作。查找多个地图任务的总体最大值需要减少这些单独的任务,而这只能由一个减速器完成,其中所有减速器都具有可比较的所有数据。
您的reducer代码仅输出每个reducer的最大 。你的关键是文本,但有多个文本,所以它没有机会看到整体最大值。您获得一个输出的原因是因为组合器已经将唯一字符串收集到一个项目中,并且项目按降序排序。
您需要的逻辑只输出映射器上字符串的最大长度,可能使用TreeMap存储中间长度,同时迭代标记,而不是写入迭代的当前最大值。使用字段很好,但并不是在所有任务中共享。您将使用Counter对象,并将它们存储在Context对象中。
如果你想要没有使用当前代码的Combiner的整体最大值,那么在给定第一次运行输出的输入的情况下,你将运行它两次。想象一下这个场景,Reducer 1的最大长度为15,Reducer 2的最终长度为20.所以,你已经写了两个输出,而不仅仅是总体最大值。
如上所述,每个map任务都需要写出各自的最大字符串。然后,您实际上可以使用NullWritable作为键,输出null, "length,word"
。在Reducer中,然后获取所有值,提取长度,找到最大值,然后打印