两个mapreduce作业的管道是什么?

h43kikqp  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(334)

这是否意味着第一个mapreduce的输出作为第二个mapreduce作业的输入?那么,总共有两个mapreduce工作?如果输入是一对夫妇的序列(客户机,日期),则输出是(日期,客户机,最大\u请求)。如何使用两个mapreduce作业的管道来查找每天请求最多的客户机。

w6lpcovy

w6lpcovy1#

mr本质上是一种生成按不同键排序的数据集输出的方法。reduce函数已经可以聚合到最终结果。
在您的例子中,Map器会将输入数据Map到您描述的类型的记录。
、其他数据
并将其Map到:
其他数据
生成复合密钥可能是最简单的。与创建实现k,v的子类不同,您可以将其Map到一个字符串类型,该类型每天和每个客户机都正确排序:
yyyymmdd年_
这保证了每个客户机每天的所有记录都由同一个reducer处理。然后,您可以简单地计算记录的数量,并将其作为当天的新记录输出。然后分解原始密钥并发出如下新记录:
yyyymmdd,客户,
还有一些选项:-如果合适的话,将文件加载到内存中,并确定每天的最大值。-将文件加载到数据库并执行sql选择-运行另一个mr作业:
身份Map器:yyyymmdd,client,<#requests>->yyyymmdd(key)+client,#requests
然后在减速机中,您现在可以在一天内获得所有客户。然后,您只需维护每天的状态,即最高的请求是什么,针对哪个客户机,以及当日期更改或到达文件末尾时,输出具有最高编号的客户机id。
我个人认为最简单的方法是使用google云平台的bigquery。您可以将(gzip)中的文件加载到一个简单的模式中,并针对该模式运行bq语句:

select date, client, num_requests, row_number() over(partition by date order by num_requests desc) as rn
from (
  select date, client, count(client) as num_requests from my_table 
group by date, client
) as T
where rn = 1

相关问题