首页 > 其他分享 >Spark GraphX 的数据可视化

Spark GraphX 的数据可视化

时间:2023-06-01 10:05:41浏览次数:45  
标签:graph 可视化 text org Spark graphstream GraphX GraphStream


概述


Spark GraphX 本身并不提供可视化的支持, 我们通过第三方库 GraphStream 和 Breeze 来实现这一目标


详细



Spark 和 GraphX 对并不提供对数据可视化的支持, 它们所关注的是数据处理。但是, 一图胜千言, 尤其是在数据分析时。接下来, 我们构建一个可视化分析图的 Spark 应用。需要用到的第三方库有:

  • GraphStream: 用于画出网络图
  • BreezeViz: 用户绘制图的结构化信息, 比如度的分布。

这些第三方库尽管并不完美, 而且有些限制, 但是相对稳定和易于使用。

一、安装 GraphStream 和 BreezeViz

因为我们只需要绘制静态网络, 所以下载 core 和 UI 两个 JAR 就可以了。

  • gs-core-1.2.jar(请看下载的压缩包里的jars.zip)
  • gs-ui-1.2.jar(请看下载的压缩包里的jars.zip

breeze 也需要两个 JAR:

  • breeze_2.10-0.9.jar(请看下载的压缩包里的jars.zip
  • breeze-viz_2.10-0.9.jar(请看下载的压缩包里的jars.zip

由于 BreezeViz 是一个 Scala 库, 它依赖了另一个叫做 JfreeChart 的 Java 库, 所以也需要安装:

  • jcommon-1.0.16.jar(请看下载的压缩包里的jars.zip
  • jfreechart-1.0.13.jar(请看下载的压缩包里的jars.zip

可以到 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"

二、画图

一、导入

在导入环节需要注意的是, 如果是与 GraphX 的 Graph 一同使用, 在导入时将 graphstream 的 Graph 重命名为 GraphStream, 否则都叫 Graph 会有命名空间上的冲突。当然, 如果只使用一个就无所谓了。

import org.graphstream.graph.{Graph => GraphStream}

二、绘制

首先是使用 GraphX 加载一个图, 然后将这个图的信息导入 graphstream 的图中进行可视化. 具体是:

1、创建一个 SingleGraph 对象, 它来自 graphstream:

val graph: SingleGraph = new SingleGraph("visualizationDemo")

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;
 }

上面的样式文件定义了节点与边的样式, 更多内容可见其官方文档.

准备好样式文件以后, 就可以使用它:

// 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")

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]
}

加入顶点时, 只需要将顶点的 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$

4、显示图像

graph.display()

5、部分示例代码:

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

三、运行效果与文件截图

1、运行效果:

Spark GraphX 的数据可视化_Spark GraphX

至此, 一个简单的示例完成. 更多实用的内容可自行研究。

2、文件截图:

Spark GraphX 的数据可视化_Spark GraphX_02

四、其他补充

目前, 如果不消耗大量的计算资源, 对于大规模的网络图绘制仍然缺乏一个有力的工具. 类似的工具有:

  • snap: 基于 GraphViz 引擎。
  • Gephi: 它是交互式的可视化工具, 尽管它有写多级布局和内置 3D 渲染引擎这样的特色, 但是仍然有些高 CPU 和内存的需求。

另外, zeepelin 也可与 Spark 集成, 可自行了解。



注:本文著作权归作者,由demo大师宣传,拒绝转载,转载需要作者授权




标签:graph,可视化,text,org,Spark,graphstream,GraphX,GraphStream
From: https://blog.51cto.com/u_7583030/6392448

相关文章

  • 说一下朗数可视化快速开发平台
    朗数他们的业务定位比较特别:他们卖的是居于eclipse体系上的基础平台代码、技术、服务这些,而不是卖一个体系完整的平台成品,简单的来说,如果你不懂eclipse插件开发技术,缺乏可视化平台研发经验,找他们就对了。  目前国内的平台不少,不过基本上都是卖成品,也有些是卖代码的,但卖代码的基......
  • Python进行多输出(多因变量)回归:集成学习梯度提升决策树GRADIENT BOOSTING,GBR回归训练
    原文链接: http://tecdat.cn/?p=25939最近我们被客户要求撰写关于多输出(多因变量)回归的研究报告,包括一些图形和统计输出。在之前的文章中,我们研究了许多使用多输出回归分析的方法。在本教程中,我们将学习如何使用梯度提升决策树GRADIENTBOOSTINGREGRESSOR拟合和预测多输出回归......
  • 【博学谷学习记录】超强总结,用心分享 | spark知识点总结2
    【博学谷IT技术支持】Action动作算子reduce:通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的collect:在驱动程序中,以数组的形式返回数据集的所有元素count:返回RDD的元素个数first:返回RDD的第一个元素(类似于take(1))take:返回一个由数据集的前n个元......
  • Windows 配置 Hadoop and Spark
    一JDK环境配置由于项目用的JDK17,所以单独给Hadoop配了JDK11,建议直接配置JAVA_HOME环境变量为JDK11,因为后面Spark需要用到JAVA_HOME下载JDK11链接:https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html目前Hadoop和Spark兼容JDK11和JDK8单独修改Had......
  • 视觉盛宴:探索可视化大屏的无限魅力
    在信息时代的浪潮下,数据已经成为推动各行各业发展的重要动力。然而,海量的数据如何快速、直观地呈现给用户,成为了一个亟待解决的难题。在这样的背景下,可视化大屏应运而生,以其出色的表现力和交互性成为信息展示的佼佼者。 可视化大屏是一种利用先进的显示技术、数据可视化和交互......
  • 可视化探索开源项目的 contributor 关系
    引语:作为国内外最大的代码托管平台,根据最新的GitHub数据,它拥有超372,000,000个仓库,其中有28,000,000是公开仓。分布式图数据库NebulaGraph便是其中之一,同其他开源项目一样,NebulaGrpah也有自己的contributor们,他们是何时,通过哪个pr与NebulaGraph产生联系的呢?本文......
  • 数据可视化开发的加入让办公工作更智能!
    想要实现办公自动化、智能化,就需要选择灵活、简便、易操作的数据可视化开发平台全力助力。因为这是专注于办公高效发展的开发平台,是企业级的应用低代码开发平台,用于职场中可以实现APP、CRM、OA、ERP、WMS各类管理系统开发。可以说,数据可视化开发的灵活性、实用性、便利性等优势特......
  • spark 任务运行原理
    调优概述在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置。很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置这些参数,最后就只能胡乱设置,甚至压根儿不设置。资源参数设置的不合理,可能会导致没有充分利用......
  • spark RDD底层原理
    RDD底层实现原理RDD是一个分布式数据集,顾名思义,其数据应该分部存储于多台机器上。事实上,每个RDD的数据都以Block的形式存储于多台机器上,下图是Spark的RDD存储架构图,其中每个Executor会启动一个BlockManagerSlave,并管理一部分Block;而Block的元数据由Driver节点的BlockManagerMaster......
  • R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模
    原文链接:http://tecdat.cn/?p=26271最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。Box等人的开创性工作(1994)在自回归移动平均模型领域的相关工作为波动率建模领域的相关工作铺平了道路,分别由Engle(1982)和Bollerslev(1986)引入了ARCH和GARCH......