臨時要處理一批數據,目標是從銷售訂單明細獲得電子商務常見的一些推薦:1.購買了XX的用戶還購買了什么 2.XX經常和YY一起購買 3.XX商品被同一用戶多次購買;這是典型的MapReduce場景,但由於數據量比較小22w條數據,實在不想搭Hadoop,就找了一個簡單的方案搞定:Qizmt;
看下項目簡介:
![]()
MySpace Qizmt is a mapreduce framework for executing and developing distributed computation applications on large clusters of Windows servers. The MySpace Qizmt project develops open-source software for reliable, scalable, super-easy, distributed computation software.
MySpace真是微軟技術的忠實擁護者,這么多年不離不棄,MySpace架構演變的過程也影響了很多采用.net架構的網站,這一次他們開源的是基於.net的MapReduce框架.
是的,C#編寫MapReduce邏輯,我Win7的機器就可以跑起來;很快就搞定了,中間出了幾個小狀況,記錄一下:
1. 安裝的時候有一個需要填寫用戶名密碼的地方,這里一定要填寫機器名或者域賬號 比如: test-pc\administrator
2. 安裝完成之后qizmt已經注冊到環境變量,可以在命令行環境中調用
3. 第一次使用需要執行format http://code.google.com/p/qizmt/wiki/MySpaceQizmtSingleMachineQuickStart
4. Qizmt會自己維護一套文件系統 DFS 你可以在安裝目錄查看DFS.XML查看文件系統的元數據
5. 把文件拷貝到DFS系統中,可以使用:qizmt put \\admin-PC\d$\data\some_file.xml dfs://some_file.xml 注意這里使用的也是網絡路徑
6.把文件從DFS拷貝出來,使用: qizmt get dfs://reslut_output.txt \\admin-PC\d$\data\all_step_2.csv
7.qizmt edit xx.xml 可以修改MapReduce的代碼,甚至是調試
8.MapReduce代碼支持.net Framework框架的其它類庫,直接全namespace引用就可以,不過qizmt的編輯器沒有提供對這些類庫的智能提示
9.MapReduce代碼支持使用本地路徑,比如"D:\data.csv"
|
MySpace Qizmt IDE/Debugger
MapReduce的處理思路並沒有太復雜,可以看下面的演示代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Kockerbeck.MapReduce { /// <summary> /// Very Simple MapReduce implementation in C# /// </summary> /// <remarks> /// Thanks to Stephan Brenner. Refactored for C# 4.0 /// </remarks> public class MapReduce { public static int NumberOfCores = 4; public static Dictionary<T3, List<T4>> Execute<T1, T2, T3, T4>(Func<T1, T2, List<KeyValuePair<T3, T4>>> mapFunction, Func<T3, List<T4>, List<T4>> reduceFunction, Dictionary<T1, T2> input) { var result = new Dictionary<T3, List<T4>>(); var maps = new Dictionary<T3, List<T4>>(); input.DivvyUp(NumberOfCores, l => l.ForEach(kv => maps.Add(mapFunction(kv.Key, kv.Value), i => i.Key, i => i.Value))); maps.DivvyUp(NumberOfCores, m => m.ForEach(map => result.Add(reduceFunction(map.Key, map.Value), i => map.Key, i => i))); return result; } } }
補上一張思路圖(新標簽打開,查看大圖):
購買了XX的用戶還購買了
微博:你關注的人也關注了
Map Reduce 做大數據量排序
最后,小圖一張