Apache Crunch(孵化器專案)基於 Google FlumeJava 開發,用於建立 MapReduce 流水線的 Java 庫。與 Hive、Pig、Cascading 類似提供高層抽象,但 不強制統一資料類型,採用靈活的定制類型系統,直接支援時間序列、HDF5、HBase 表、Protocol Buffer/Avro 序列化物件等複雜類型。
Crunch 不阻止開發者以 MapReduce 思維思考,而是簡化其表達。真實世界計算常由多個 MapReduce 作業組成,Crunch 讓邏輯獨立的操作(過濾、投影、轉換)能組合為單一物理作業,在正確抽象層級解決問題,不犧牲 MapReduce 功能與性能。
parallelDo:對 PCollection 每個元素應用使用者函數,產生新 PCollectiongroupByKey:依鍵排序分組(相當於 Shuffle 階段)combineValues:對分組後的值執行關聯聚合操作union:將多個 PCollection 視為單一虛擬集合所有高階操作(Join、CoGroup、Set Operations)皆由上述原語組合而成。
Crunch 規劃器接收操作圖,分解為一系列 MapReduce 作業於 Hadoop 叢集執行。亦支援記憶體執行引擎,便於本地測試除錯。
Crunch UDF 設計輕量,仍保留完整底層 MapReduce API 存取權。開發者可用 Crunch 原語建構高階 API,提供 ETL、機器學習、科學計算等複雜功能。
public class WordCount {
public static void main(String[] args) throws Exception {
Pipeline pipeline = new MRPipeline(WordCount.class);
PCollection lines = pipeline.readTextFile(args[0]);
PCollection words = lines.parallelDo(
new DoFn() {
public void process(String line, Emitter emitter) {
for (String word : line.split("\\s+")) emitter.emit(word);
}
}, Writables.strings());
for (Pair wc : words.count().top(20).materialize()) {
System.out.println(wc);
}
}
}
目標:減少 MapReduce 作業數量(IO 密集型)。優化器原語對開發者開放,便於構建可復用高階操作(如 ETL 流水線、隨機森林模型評估)。
仍處孵化階段,歡迎社群貢獻。重點方向:基於成本的優化器、新 MapReduce 設計模式、更多資料源支援(HCatalog、Solr、ElasticSearch)、Scala/Clojure/R 等 JVM 語言綁定。
Crunch 為 MapReduce 開發提供了「薄而強」的抽象層,適合處理複雜資料類型、需精細控制作業流程的場景。其靈活類型系統與開放優化原語是獨特優勢。