我一直在做社交網絡的挖掘工作,深感目前的一些技術並不能滿足社交挖掘的需要。我並沒有用過太多的工具,而且圖計算的平台也沒有用過,涉及到大規模數據的離線分析,主要是依賴hadoop。不過,這並不妨礙,我從挖掘需求的角度來探討:社交挖掘到底需要哪些技術基礎,需要一些什么樣的工具。
題目中有一個詞:large graph。也有很多人認為是big graph。我之所以改變稱謂,主要的原因在我前面的博客中有體現。因為big data中的個體之間,往往具有關系,這個樣就組成了一個graph,並且這是個超大的graph。元數據信息要比單純的big data要高幾個量級。所以,為了進一步體現graph之大,我稱之為large graph。到底於多大呢?我以新浪微博為例來說明(其實新浪微博在這些large graph中,目前算比較小的)。新浪微博號稱4億的用戶,那么用戶關系有多少呢?我估計在大概在300億-400億。我們在處理社交網絡的時候,絕大多數是要和邊(也就是關系)打交道的,那這樣的一個規模,如何高效存儲、計算對挖掘效果的影響,是非常直接的。如果這是一個面試題,大家該如何分析並給出方案呢。
首先根據自己之前做挖掘的一些經驗,總結一下,在large graph上,要進行哪些操作:
- 隨機訪問:
- 讀取一個節點的鄰居(在微博中,就是讀取關注或者粉絲,如何讀取粉絲??)
- 讀取兩個節點之間的關系
- 順序訪問:
- 圖的遍歷:寬度優先,深度優先等
- 最短路徑
- 其他分析:介數計算等
這個是我在挖掘過程中,主要涉及的操作,而且要針對不同的訪問分析需求,速度要快。如果要求某個計算平台,能夠全部滿足,並且速度都很快,那是不現實的。所以,針對特定功能需求,特殊的去優化性能。比如,我在挖掘過程中有一個特定的需求:快速判斷兩個人之間的關系,要在盡可能短的時間內,完成百萬次的判斷。這個為基礎計算平台的設計,提出了一個直接的挑戰。
在big data出來的時候,相伴着NoSQL也火了起來。這都是相輔相成的,數據多了,自然就需要適合的存儲技術,那一台及其無法存儲,那么直接的想法就是划分,多台進行存儲。可是關系如何划分呢?
這個要從large graph的分析開始,large graph有哪些性質,這些性質對快速存取、快速計算都有哪些影響呢?
- 冪律分布
- 首先是正向的影響。這個性質的意思直白一點說,就是粉絲多的人比較集中,很少。更多的是長尾的、粉絲比較少的用戶。這個可以幫助我們在計算過程中,合理的做一些剪枝。
- kv數據之所以可以采用NoSQL,進行划分存儲的主要原因是,它可以均勻的划分,讓每台機器的負載都近乎均衡。但是關系數據呢?這個冪律分布直接擊碎了按人划分,存儲關系的美夢。這是絕對不會均勻的。少數機器的數據很大,其它的機器數據很少。
- 小世界特性
- 這個很直接,就是兩個人之間的最短路徑很短。最直接的體現了六度分離的理論。
- 在做一些圖分析的時候,代價很大,涉及的節點很多。
- 社團結構
- 社團結構本身是很重要的性質。我之前的博客有詳細的介紹。
- 社團結構的存在,直接導致了圖划分的問題難度增加。要保證均勻,保證划分之間邊最少。社團結構是個很大的障礙。
上面的三個特性,使得圖划分的難度大大增加。但是,由於數據量級的劇增,圖的划分還是非常重要的選擇。目前已經有的一些算法,KL,metis(目前state-of-the-art的方法)等,在處理百萬、千萬級節點的網絡時,還可應付。但是億級節點呢?十億級呢?其實,划分是個核心,是重中之重,存儲、計算都依賴這個。否則,就會有大量的冗余,更多的IO消耗。
需求就在我們面前。現在產生巨大關系數據的公司已經產生,Facebook、微博等。但是能夠處理這些數據的公司呢?可以斷言,能夠大規模挖掘關系數據的公司,必將是下一個Google。這是一波浪潮,讓我們加入進去,一起沖浪。
【完】
【思考題】
1億節點,100億關系,如何迅速判斷連個節點是否有邊?節點用整數唯一標識。如果大家對這個問題感興趣,可以和我一起探討,解決實際問題。