MongoDB本身可以做一些簡單的統計工作,包括其內建的基於Javascript的 MapReduce架構,也包括在MongoDB 2.2版本中引入的新的統計架構。除此之外, MongoDB 還提供了對外部統計工具的介面,這就是本文要說的MongoDB-Hadoop的 資料中介軟體。文章內容來源於MongoDB官方部落格。
原理圖解
MongoDB與Hadoop相結合的方式如下圖所未,MongoDB作為資料來源儲存以及 資料結果儲存。而具體的計算過程在Hadoop中進行。
這一套處理流程,允許我們通過 Python, Ruby 與 JavaScript 來寫 MapReduce函數進行資料統計,而不是使用Java。
例子
首先準備好 Hadoop環境,並安裝好Hadoop,MongoDB中介軟體。然後通過下面的方式進行資料處 理。
1.資料準備
從Twitter API匯入未經處理資料到MongoDB中
curl https://stream.twitter.com/1/statuses/sample.json -u: | mongoimport -d twitter -c in
2.Map函數
寫一個map函數,保 存在檔案mapper.rb 中
#!/usr/bin/env ruby require 'mongo-hadoop' MongoHadoop.map do |document| { :_id => document['user']['time_zone'], :count => 1 } end
3.Reduce函數
然後是reduce函數,儲存在檔案 reducer.rb中
#!/usr/bin/env ruby require 'mongo-hadoop' MongoHadoop.reduce do |key, values| count = sum = 0 values.each do |value| count += 1 sum += value['num'] end { :_id => key, :average => sum / count } end
4.運行指令碼
建立一個運行指令碼,寫入下面內容,就可以 利用上面的MapReduce方法處理第一步中擷取的資料。
hadoop jar mongo-hadoop-streaming-assembly*.jar -mapper mapper.rb -reducer reducer.rb -inputURI mongodb://127.0.0.1/twitter.in -outputURI mongodb://127.0.0.1/twitter.out