Spark GraphX 對圖進行視覺化
Spark 和 GraphX 對並不提供對資料視覺化的支援, 它們所關注的是資料處理. 但是, 一圖勝千言, 尤其是在資料分析時. 接下來, 我們構建一個視覺化分析圖的 Spark 應用. 需要用到的第三方庫有:
- GraphStream: 用於畫出網路圖
- BreezeViz: 使用者繪製圖的結構化資訊, 比如度的分佈.
這些第三方庫儘管並不完美, 而且有些限制, 但是相對穩定和易於使用.
安裝 GraphStream 和 BreezeViz
因為我們只需要繪製靜態網路, 所以下載 core 和 UI 兩個 JAR 就可以了.
- gs-core-1.2.jar
- gs-ui-1.2.jar
breeze 也需要兩個 JAR:
- breeze_2.10-0.9.jar
- breeze-viz_2.10-0.9.jar
由於 BreezeViz 是一個 Scala 庫, 它依賴了另一個叫做 JfreeChart 的 Java 庫, 所以也需要安裝:
- jcommon-1.0.16.jar
- jfreechart-1.0.13.jar
可以到 maven 倉庫去下載, 下載完成後放到專案根目錄下 lib 資料夾下即可. 用 sbt 來管理依賴比較方便, 所以我使用 sbt 來安裝這些依賴:
// Graph Visualization
// https://mvnrepository.com/artifact/org.graphstream/gs-core
libraryDependencies += "org.graphstream" % "gs-core" % "1.2"
// https://mvnrepository.com/artifact/org.graphstream/gs-ui
libraryDependencies += "org.graphstream" % "gs-ui" % "1.2"
// https://mvnrepository.com/artifact/org.scalanlp/breeze_2.10
libraryDependencies += "org.scalanlp" % "breeze_2.11" % "0.12"
// https://mvnrepository.com/artifact/org.scalanlp/breeze-viz_2.11
libraryDependencies += "org.scalanlp" % "breeze-viz_2.11" % "0.12"
// https://mvnrepository.com/artifact/org.jfree/jcommon
libraryDependencies += "org.jfree" % "jcommon" % "1.0.24"
// https://mvnrepository.com/artifact/org.jfree/jfreechart
libraryDependencies += "org.jfree" % "jfreechart" % "1.0.19"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
畫圖
匯入
在匯入環節需要注意的是, 如果是與 GraphX 的 Graph 一同使用, 在匯入時將 graphstream 的 Graph 重新命名為 GraphStream, 否則都叫 Graph 會有名稱空間上的衝突. 當然, 如果只使用一個就無所謂了.
import org.graphstream.graph.{Graph => GraphStream}
- 1
- 1
繪製
首先是使用 GraphX 載入一個圖, 然後將這個圖的資訊匯入 graphstream 的圖中進行視覺化. 具體是:
-
建立一個
SingleGraph
物件, 它來自 graphstream:val graph: SingleGraph = new SingleGraph("visualizationDemo")
- 1
- 1
-
我們可以呼叫
SingleGraph
的addNode
和addEdge
方法來新增節點和邊, 也可以呼叫addAttribute
方法來給圖, 或是單獨的邊和頂點來設定視覺化屬性. graphsteam API 非常好的一點是, 它將圖的結構和視覺化用一個類 CSS 的樣式檔案完全分離了開來, 我們可以通過這個樣式檔案來控制視覺化的方式. 比如, 我們新建一個stylesheet
檔案並放到使用者目錄下的 style 檔案下面:node { fill-color: #a1d99b; size: 20px; text-size: 12; text-alignment: at-right; text-padding: 2; text-background-color: #fff7bc; } edge { shape: cubic-curve; fill-color: #dd1c77; z-index: 0; text-background-mode: rounded-box; text-background-color: #fff7bc; text-alignment: above; text-padding: 2; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
上面的樣式檔案定義了節點與邊的樣式, 更多內容可見其 官方文件.
準備好樣式檔案以後, 就可以使用它:
// Set up the visual attributes for graph visualization graph.addAttribute("ui.stylesheet","url(file:/home/xlc/style/stylesheet)") graph.addAttribute("ui.quality") graph.addAttribute("ui.antialias")
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
ui.quality
和ui.antialias
屬性是告訴渲染引擎在渲染時以質量為先而非速度. 如果不設定樣式檔案, 頂點與邊預設渲染出來的效果是黑色. -
加入節點和邊. 將 GraphX 所構建圖的 VertexRDD 和 EdgeRDD 裡面的內容加入到 GraphStream 的圖物件中:
// Given the egoNetwork, load the graphX vertices into GraphStream for ((id,_) <- egoNetwork.vertices.collect()) { val node = graph.addNode(id.toString).asInstanceOf[SingleNode] } // Load the graphX edges into GraphStream edges for (Edge(x,y,_) <- egoNetwork.edges.collect()) { val edge = graph.addEdge(x.toString ++ y.toString, x.toString, y.toString, true).asInstanceOf[AbstractEdge] }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
加入頂點時, 只需要將頂點的 vertex ID 轉換成字串傳入即可.
對於邊, 稍顯麻煩. addEdge 的 API 文件在 這裡, 我們需要傳入 4 個引數. 第一個引數是每條邊的字串識別符號, 由於在 GraphX 原有的圖中並不存在, 所以我們需要自己建立. 最簡單的方式是將這條邊的兩個端點的 vertex ID 連線起來.
注意, 在上面的程式碼中, 為了避免我們的 scala 程式碼與 Java 庫 GraphStream 互用上的一些問題, 採用了小的技巧. 在 GraphStream 的
org.graphstream.graph.implementations.AbstractGraph
API o文件中,addNode
和addEdge
分別返回頂點和邊. 但是由於 GraphStream 是一個第三方的 Java 庫, 我們必須強制使用asInstanceOf[T]
, 其中 [T] 為 SingleNode 和 AbstractEdge, 作為addNode
和addEdge
的返回型別. 如果我們漏掉了這些顯式的型別轉換, 可能會得到一個奇怪的異常:java.lang.ClassCastException: org.graphstream.graph.implementations.SingleNode cannot be cast to scala.runtime.Nothing$
- 1
- 2
- 3
- 1
- 2
- 3
-
顯示影象
graph.display()
- 1
- 1
完整示例:
object Visualization {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf()
.setAppName("GraphStreamDemo")
.set("spark.master", "local[*]")
val sc = new SparkContext(sparkConf)
val graph: SingleGraph = new SingleGraph("graphDemo")
val vertices: RDD[(VertexId, String)] = sc.parallelize(List(
(1L, "A"),
(2L, "B"),
(3L, "C"),
(4L, "D"),
(5L, "E"),
(6L, "F"),
(7L, "G")))
val edges: RDD[Edge[String]] = sc.parallelize(List(
Edge(1L, 2L, "1-2"),
Edge(1L, 3L, "1-3"),
Edge(2L, 4L, "2-4"),
Edge(3L, 5L, "3-5"),
Edge(3L, 6L, "3-6"),
Edge(5L, 7L, "5-7"),
Edge(6L, 7L, "6-7")))
val srcGraph = Graph(vertices, edges)
graph.setAttribute("ui.stylesheet", "url(file:/home/hadoop/style/stylesheet)")
graph.setAttribute("ui.quality")
graph.setAttribute("ui.antialias")
// load the graphx vertices into GraphStream
for ((id, _) <- srcGraph.vertices.collect()){
val node = graph.addNode(id.toString).asInstanceOf[SingleNode]
}
// load the graphx edges into GraphStream edges
for (Edge(x, y, _) <- srcGraph.edges.collect()){
val edge = graph.addEdge(x.toString ++ y.toString, x.toString, y.toString, true).asInstanceOf[AbstractEdge]
}
graph.display()
}
}
至此, 一個簡單的示例完成. 更多實用的內容可自行研究.
目前, 如果不消耗大量的計算資源, 對於大規模的網路圖繪製仍然缺乏一個有力的工具. 類似的工具有:
另外, zeepelin 也可與 Spark 整合, 可自行了解.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
相關推薦
Spark GraphX 對圖進行視覺化
Spark 和 GraphX 對並不提供對資料視覺化的支援, 它們所關注的是資料處理. 但是, 一圖勝千言, 尤其是在資料分析時. 接下來, 我們構建一個視覺化分析圖的 Spark 應用. 需要用到的第三方庫有: GraphStream: 用於畫出網路圖BreezeViz
利用 ELK系統分析Nginx日誌並對資料進行視覺化展示
一、寫在前面 結合之前寫的一篇文章:Centos7 之安裝Logstash ELK stack 日誌管理系統,上篇文章主要講了監控軟體的作用以及部署方法。而這篇文章介紹的是單獨監控nginx 日誌分析再進行視覺化圖形展示,並在使用者前端使用nginx 來代理kibana
利用TICK對Docker進行視覺化監控
效能監控是容器服務必不可少的基礎設施,容器化應用運行於宿主機上,我們需要知道該容器的執行情況,包括 CPU使用率、記憶體佔用、網路狀況以及磁碟空間等等一系列資訊。本文通過TICK 的技術棧方案實現Docker的效能監控。 一、監控結構 Telegraf:
【Visual Studio 擴充套件工具】使用 ComponentOne迷你圖控制元件,進行視覺化資料趨勢分析
概述 迷你圖 —— Sparklines是迷你的輕量級圖表,有助於快速視覺化資料。 它們是由資料視覺化傳奇人物Edward Tufte發明的,他將其描述為“資料密集,設計簡單,位元組大小的圖形。”雖然迷你圖不包含傳統圖表中的許多元素(如軸和座標), 基於它們的簡單性,它們可以比其他圖表型別更具資訊性
使用ROS的rqt_plot對任意語言的程式進行視覺化
簡介 經常做資料處理的同學可能比較熟悉MATLAB或者Python,而做影象或者機器人用到最多的其實是C和C++。經常需要在除錯時實時看到某些資料的變化趨勢,而C++卻沒有一套好的視覺化庫(或者需要很麻煩的配置。)於是寫了這個工具。呼叫者只要在程式裡列印需要實時顯示的資料,然後將控制
利用echarts對pm2.5資料進行視覺化處理
echarts是百度提供的資料視覺化js外掛,功能強大,提供各種基本的圖表(尤其世界以及中國各種地圖,方便時空資料的視覺化);具體看參考http://echarts.baidu.com/ 。 本文主要嘗試了四個功能 1. 滑鼠放在地圖某個區上時顯示該區在所給資料
Excel·建立資料圖表:對Excel資料進行視覺化處理
1. Excel資料圖表對Excel資料進行視覺化資料處理 二、常用的三種資料圖表: 1.柱形資料圖表:顯示一段時間的資料變化
使用Python對大腦成像資料進行視覺化分析
## 簡介 大腦是人類目前所知的最複雜的器官,為了很好的瞭解大腦這個器官,我們做了很多努力,核磁共振成像(Magnetic Resonance Image,MRI)技術就是其中的重要突破,通過MRI的方式,我們可以獲得大腦的一些資料。 近年來,隨著機器學習的興起,醫學資料與機器學習結合使用的情況越來越多,而
如何使用Gephi工具進行視覺化複雜網路圖
在Gephi安裝官網中也介紹了一些如何使用該工具的方法,我將根據自己的資料和視覺化的圖片進行介紹 第一步:整理資料格式,我的資料是.csv格式的(.xlsx,.xls等等) 資料第一行第一列必須是相同的,表示節點的標籤,可以不用數字表示(如:N1,M2,B3等等任意形式表示,注意
Spark GraphX 屬性圖操作
val 元組 連接 string parent ase 限制 apach appname package Spark_GraphX import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD impo
機器學習入門-載入sklearn中資料並用matplotlib進行視覺化
from sklearn import datasets import matplotlib.pyplot as plt def get_data(): """ 從sklearn中獲取鳶尾花的資料 :return: 鳶尾花資料的字典,字典中包括的key有:【'data'
NLP之WE之Skip-Gram:基於TF利用Skip-Gram模型實現詞嵌入並進行視覺化、過程全記錄
NLP之WE之Skip-Gram:基於TF利用Skip-Gram模型實現詞嵌入並進行視覺化 輸出結果 程式碼設計思路 程式碼執行過程全記錄 3081 originated -> 12 as 3081 originated
資料分析(使用matplotlib,seaborn,ploty進行視覺化)——1
柱狀圖 使用matplotlib畫圖 import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np # 匯入資料 df = pd.read_csv(
Pytorch求索(2): Pytorch使用visdom進行視覺化
Pytorch使用visdom進行視覺化 文章目錄 Pytorch使用visdom進行視覺化 visdom介紹 visdom核心概念 visdom安裝與使用 常用API plot.scat
應用圖表進行視覺化時,如何有效地展現資料?
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 大部分人對資料進行視覺化時,只是一種圖表的堆砌,先把需要的單個圖表做完,然後簡單地羅列組合在一起,最後改變一下整體顏色,就完成了。整個過程雖然不能說錯,但並沒有把圖表的優勢發揮出來。下面分享一些用圖表展現資料的方法,希望對題主有所幫助。
OpenCV---如何對影象進行銳化(11)
附程式碼如下: import cv2 as cv import numpy as np def sharpe(): src = cv.imread("D:/matplotlib/0.jpg") cv.imshow("input",src) lap_5 = np.array
使用Flask & Plotly 做股票k線圖互動式視覺化處理(二)
接上一篇,這篇要實現搜尋功能: 建立搜尋頁面: 在templates資料夾內新建main.html檔案,內容如下: <!doctype html> <html lang="en"> <head> <
Keras特徵圖Tensorboard視覺化
前言 之前在用Tensorflow框架的時候,對於特徵圖的視覺化已經研究了一下。主要的思路其實就是將特徵圖展開鋪平成一張大圖。具體文章參考Tensorboard特徵圖視覺化。 文章主要的函式就是將特徵圖沿著第四通道展開,然後將其拼接。最後的返回結果 all_concact 其實還
爬取微信好友資訊,進行視覺化分析(頭像人臉識別部分已更新!)(程式碼已上傳)
【Code】下載 1、專案說明 本次專案主要實現了以下功能: 2、微信好友資訊的獲取與檔案儲存 3、微信好友性別分析 4、微信好友地區分佈視覺化 5、微信好友個性簽名詞雲圖及好友備註詞雲圖 6、微信好
行人重識別(ReID) ——基於MGN-pytorch進行視覺化展示
模型訓練,修改demo.sh,將 --datadir修改已下載的Market1501資料集地址,將修改CUDA_VISIBLE_DEVICES=2,3自己的GPU裝置ID,將修改--nGPU自己的GPU數量。 部分demo.sh示例: #mAP: 0.920