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

时间:2016-05-14 09:57:23

标签: hadoop mapreduce cloud

这是否意味着第一个mapreduce的输出作为第二个mapreduce作业的输入?那么,完全有两个mapreduce工作?如果输入是一对夫妇(客户端,日期),则输出为(date,client,max_requests)。如何使用两个mapreduce作业的管道来查找每天请求最多的客户端。

1 个答案:

答案 0 :(得分:0)

MR本质上是一种生成按不同键排序的数据集输出的方法。 reduce函数已经可以汇总到最终结果。

在您的情况下,Mapper会将输入数据映射到您描述的类型的记录。

,, other_data

并将其映射到:

< _>,other_data

生成复合键可能最简单。您可以将此映射到每天和每个客户端正确排序的字符串类型,而不是创建实现K,V的子类:

YYYYMMDD _

这可以保证每个客户端每天的所有记录都由同一个reducer处理。然后,您可以简单地计算记录数并将其作为当天的新记录输出。然后分解原始密钥并发出看起来像的新记录:

YYYYMMDD,客户端

然后有选项: - 如果适合,则将文件加载到内存中并确定每天的最大值。 - 将文件加载到数据库中并执行SQL选择 - 运行另一个MR工作:

身份映射器:YYYYMMDD,客户端,< #requests> - > YYYYMMDD(关键)+客户端,#requests

然后在reducer中,您现在可以获得一天的所有客户。然后,您只需每天维护最高#请求的状态以及哪个客户端以及日期更改或到达文件末尾时,输出具有最高编号的客户端ID。

我个人认为最简单的方法是从谷歌云平台使用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