1. 程式人生 > >Spark GraphX 對圖進行視覺化

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 的圖中進行視覺化. 具體是:

  1. 建立一個 SingleGraph 物件, 它來自 graphstream:

    val graph: SingleGraph = new SingleGraph("visualizationDemo")
    • 1
    • 1
  2. 我們可以呼叫 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 屬性是告訴渲染引擎在渲染時以質量為先而非速度. 如果不設定樣式檔案, 頂點與邊預設渲染出來的效果是黑色.

  3. 加入節點和邊. 將 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
  4. 顯示影象

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()

  }
}

至此, 一個簡單的示例完成. 更多實用的內容可自行研究.

目前, 如果不消耗大量的計算資源, 對於大規模的網路圖繪製仍然缺乏一個有力的工具. 類似的工具有:

  • snap: 基於 GraphViz 引擎.
  • Gephi: 它是互動式的視覺化工具, 儘管它有寫多級佈局和內建 3D 渲染引擎這樣的特色, 但是仍然有些高 CPU 和記憶體的需求.

另外, 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

利用TICKDocker進行視覺監控

效能監控是容器服務必不可少的基礎設施,容器化應用運行於宿主機上,我們需要知道該容器的執行情況,包括 CPU使用率、記憶體佔用、網路狀況以及磁碟空間等等一系列資訊。本文通過TICK 的技術棧方案實現Docker的效能監控。 一、監控結構 Telegraf:

【Visual Studio 擴充套件工具】使用 ComponentOne迷你控制元件,進行視覺資料趨勢分析

  概述    迷你圖 —— Sparklines是迷你的輕量級圖表,有助於快速視覺化資料。 它們是由資料視覺化傳奇人物Edward Tufte發明的,他將其描述為“資料密集,設計簡單,位元組大小的圖形。”雖然迷你圖不包含傳統圖表中的許多元素(如軸和座標), 基於它們的簡單性,它們可以比其他圖表型別更具資訊性

使用ROS的rqt_plot任意語言的程式進行視覺

簡介 經常做資料處理的同學可能比較熟悉MATLAB或者Python,而做影象或者機器人用到最多的其實是C和C++。經常需要在除錯時實時看到某些資料的變化趨勢,而C++卻沒有一套好的視覺化庫(或者需要很麻煩的配置。)於是寫了這個工具。呼叫者只要在程式裡列印需要實時顯示的資料,然後將控制

利用echartspm2.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