2016-05-14 56 views
0

這是否意味着第一個mapreduce的輸出作爲第二個mapreduce作業的輸入?那麼,總共有兩個mapreduce作業?如果輸入是夫婦序列(客戶端,日期),則輸出是(日期,客戶端,max_requests)。如何使用兩個mapreduce作業的管道來查找每天大部分請求的客戶端。什麼是兩個mapreduce作業的管道?

+0

[Hadoop中鏈接多個MapReduce作業]的可能的複製(http://stackoverflow.com/questions/2499585 /鏈接-多MapReduce的工作功能於Hadoop的) –

回答

0

MR本質上是一種生成按不同鍵排序的數據集輸出的方法。 reduce函數已經可以聚合到最終結果。

對於您的情況,Mapper會將輸入數據映射到您描述的類型的記錄。

,, other_data

,這映射到:

< _>,other_data

這可能比較容易產生複合鍵。而不是創建一個實現K個子類,V,您可以將此映射到執行的每一天,每個客戶端正確排序字符串類型:

YYYYMMDD_

這可以保證每天每客戶端的所有記錄由同一個減速器處理。然後您可以簡單地統計記錄的數量並將其輸出爲當天的新記錄。然後分解原始密鑰,併發出看起來像新的記錄:

年月日,客戶端,

再就是選擇: - 加載在內存中的文件,如果適合,並確定每天最大。 - 將文件加載到數據庫中,並做SQL選擇 - 運行另一個MR工作:

身份映射:年月日,客戶端,<#請求> - >年月日(鍵)+客戶端,#請

然後在減速機中,您現在可以獲得所有客戶的一天時間。然後,您只需每天維護最高#次請求的狀態以及哪個客戶端,何時更改日期或到達文件末尾,輸出具有最高號碼的客戶端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 
相關問題