簡體   English   中英

發行迭代在減速器中的自定義可寫組件

[英]Issue iterating over custom writable component in reducer

我在MR作業的地圖階段將自定義可寫類用作VALUEOUT,該類具有兩個字段: org.apache.hadoop.io.Textorg.apache.hadoop.io.MapWritable 在我的reduce函數中,我迭代每個鍵的值,然后執行兩個操作:1.過濾器; 2.聚合。 在過濾器中,我有一些規則來檢查MapWritable(鍵為Text且值為IntWritableDoubleWritable )中的某些值DoubleWritable滿足某些條件,然后將它們簡單地添加到ArrayList中。 在篩選操作的最后,我有一個自定義可寫對象的篩選列表。 在聚合階段,當我訪問對象時,事實證明最后一個成功過濾的對象已覆蓋了arraylist中的所有其他對象。 在SO上的列表經歷了一些類似的問題之后,其中最后一個對象覆蓋了所有其他對象,我確認我沒有靜態字段,也沒有通過設置不同的值來重用相同的自定義可寫性(被引述為此類可能的原因)一個問題)。 對於reducer中的每個鍵,我都確保CustomWritableText鍵和MapWritable是新對象。

此外,我還通過在我的reduce中消除了filter&Aggregation操作來執行了一個簡單的測試,並迭代了這些值,並使用for循環將它們添加到ArrayList中。 在循環中,每次我將CustomWritable添加到列表中時,我都會記錄列表中所有內容的值。 在將該元素添加到列表之前和之后,我都進行了登錄。 兩個日志都表明先前的元素集已被覆蓋。 我對這種情況怎么發生感到困惑。 一旦循環for ( CustomWritable result : values )循環訪問了value的可迭代項中的下一個元素,列表內容便被修改。 我無法弄清楚這種行為的原因。 如果有人可以對此有所了解,那將非常有幫助。 謝謝。

reducer中的“值”迭代器在您迭代時重用該值。 這是用於提高性能和減小內存占用的技術。 在幕后,Hadoop將下一條記錄反序列化為同一Java對象。 如果您需要“記住”一個對象,則需要對其進行克隆。

您可以利用Writable接口並使用原始字節來填充新對象。

IntWritable first = WritableUtils.clone(values.next(), context.getConfiguration());
IntWritable second = WritableUtils.clone(values.next(), context.getConfiguration());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM