2011-03-30 39 views
0

Hadoop in Action中的第4章練習4是關於實現計算時間序列移動平均值的線性過濾器。也就是說,給定N和一系列時間戳的值a(t)的,計算y,其中Hadoop中的線性過濾器(FIR)(Hadoop in Action練習)

y(t) = a(t)*1/N + a(t-1)*1/N + ... + a(t-N)*1/N. 

我具有MapReduce的實施這一麻煩。 Reducer需要接收計算y中元素所需的N個記錄。即使記錄按時間順序排列,這些N記錄可能會分成兩個映射器。在映射器中發射什麼樣的密鑰可以保證同一個reducer接收這些N記錄?他們的時間戳都是不同的,因此沒有用作關鍵字。

還是我完全在我的方法?我會很感激提示。

回答

1

從書中看問題,你錯誤地解決了這個問題。

輸入數據是一個鍵/值序列(t - > x(t)),其中t是時間,x(t)是當時觀察到的值。然後計算在任何時間的移動平均,您使用的公式:

y(t) = a0 * x(t) + a1 * x(t-1) + a2 * x(t-2) + ... + aN * x(t-N) 

其中a0,A1,A2,...一個已知常數。

對這個問題實現映射器的關鍵是識別包含特定x的所有y(t)方程,並使用方程作爲關鍵。這是通過觀察時間參數t的模式來完成的。對於任何x(t),x(t)在y(t)中是第一個。 x(t)也是y(t + 1)中的第二項,y(t + 2)中的第三項,直到y(t + N)中的(N + 1)位置項爲止。

所以,對於每一個用於每個(T - > X(t))的所述輸入映射器需要輸出幾個新的鍵/值對的鍵/值:

t -> {a0, x(t)} 
t+1 -> {a1, x(t)} 
t+2 -> {a2, x(t)} 
... 
t+N -> {aN, x(t)} 

映射器完成後,將會有一組由他們所屬的y(t)方程鍵入的{an,x(t)}值。

在減速器一側,特定y(t)的{an,x(t)}值的集合將被傳遞,產品的總和可以被計算以產生y(t)值。

+0

非常感謝布倫特,這是有道理的。在接下來的幾天裏我不會執行它,但我會回到這個問題上。 – 2011-04-01 07:01:47

+0

我試圖再次實現這一點。布倫特,在你的方法中,時間戳是否需要固定的時間間隔?如果我遇到t並想要發出密鑰t + 1,t + 2,...,我需要能夠計算t + n。如果可能的話,你的解決方案是有效的,但是如果它們有些隨機,就像外部事件觸發的時間戳一樣? – 2011-04-09 07:30:15