我嘗試使用Java中的Apache Spark來解決大規模數據處理問題。我的輸入是一大組相對較小的自定義Java對象。Apache Spark中的不同縮減器
我的地圖步驟對每個對象執行一些小的改動。完成後,它會識別對象所屬的一個或多個等價類。綜合起來,可能有數十億等價類/對象對。
我的問題是我需要對每個等價類的元素執行不同的操作。這個項目需要支持插件架構,所以我不知道等價類是什麼,或者每個類需要發生的不同操作。
我的直覺是使用類似如下:
//Get the input set.
JavaRDD<MyType> input = ... //Not important
//Transform the input into (Equivalence Class, MyType) pairs,
//using strings to store the equivalence class.
JavaPairRDD<String, MyType> classedInput = input.flatMapToPair(
new PairFlatMapFunction<MyType, String, MyType>() {
Iterator<Tuple2<String, MyType>> call(MyType arg) {
List<Tuple2<String, MyType>> out = new ArrayList<>();
//Compute equivalence classes for arg.
for(String eqClz: getEquivalenceClasses(arg)) {
out.add(new Tuple2<String, MyType>(equClz, arg));
}
return out.iterator();
}
});
//Collapse the results for each equivalence class.
JavaPairRDD<String, MyType> output = classedInput.reduceByKey(
new Function2<MyType, MyType, MyType>() {
MyType call(MyType a, MyType b) {
String eqClz = ??? //<= Problem
List<MyModule> modules = MyFramework.getModulesForEqClz(eqClz);
for(MyModule m: modules) {
a = m.merge(a, b);
}
return a;
}
}
);
我希望能夠等價類通成reduceByKey的功能,以便用它來確定哪些模塊需要調用。問題在於我沒有發現Spark的鍵控組合函數可以將密鑰傳遞給它們的回調函數。
由於classedInput的大小,我想避免用MyType對象保存密鑰,或者在地圖之後添加太多額外的分佈式操作。
有沒有類似Spark的方式來完成我正在嘗試的?
要開始,很好的答案。對於我的特定用例,我擔心這些解決方案的內存和網絡使用情況。 對於1.,我對Spark的.reduce()的理解是它將單個結果返回給調用者。鑑於單獨的工件數量,我想避免一次將它們集中在一個地方。 對於2.我擔心關聯額外的數據與每個值。我的直覺是,每個記錄多幾十字節就等於在線路上發送千兆字節或更多的額外數據。這是合理的,還是我的基地? – PilotScape64
@ PilotScape64 http://stackoverflow.com/help/someone-answers – huitseeker