±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉܹ¹½¨Ò»¸ö¿ÉÊÓ»¯·ÖÎöͼµÄ
Spark Ó¦Ó㬻ͼ²¢»æÖÆ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚSpark¼¼ÊõÈÕ±¨£¬ÓÉ»ðÁú¹ûÈí¼þç÷ç÷±à¼¡¢ÍƼö¡£
|
|
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" |
»Í¼
µ¼Èë
ÔÚµ¼Èë»·½ÚÐèҪעÒâµÄÊÇ, Èç¹ûÊÇÓë GraphX µÄ Graph һͬʹÓÃ, ÔÚµ¼Èëʱ½« graphstream µÄ Graph ÖØÃüÃûΪ GraphStream, ·ñÔò¶¼½Ð Graph »áÓÐÃüÃû¿Õ¼äÉϵijåÍ». µ±È», Èç¹ûֻʹÓÃÒ»¸ö¾ÍÎÞËùνÁË.
import org.graphstream.graph.
{Graph => GraphStream} |
»æÖÆ
Ê×ÏÈÊÇʹÓà GraphX ¼ÓÔØÒ»¸öͼ, È»ºó½«Õâ¸öͼµÄÐÅÏ¢µ¼Èë graphstream µÄͼÖнøÐпÉÊÓ»¯. ¾ßÌåÊÇ:
´´½¨Ò»¸ö SingleGraph ¶ÔÏó, ËüÀ´×Ô graphstream:
val graph: SingleGraph
= new SingleGraph ("visualizationDemo") |
ÎÒÃÇ¿ÉÒÔµ÷Óà 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;
} |
ÉÏÃæµÄÑùʽÎļþ¶¨ÒåÁ˽ڵãÓë±ßµÄÑùʽ, ¸ü¶àÄÚÈݿɼûÆä ¹Ù·½Îĵµ£¨ http://graphstream-project.org/doc/Tutorials/Graph-Visualisation/£©.
×¼±¸ºÃÑùʽÎļþÒÔºó, ¾Í¿ÉÒÔʹÓÃËü:
// 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 ÊôÐÔÊǸæËßäÖȾÒýÇæÔÚäÖȾʱÒÔÖÊÁ¿ÎªÏȶø·ÇËÙ¶È. Èç¹û²»ÉèÖÃÑùʽÎļþ, ¶¥µãÓë±ßĬÈÏäÖȾ³öÀ´µÄЧ¹ûÊǺÚÉ«.
¼ÓÈë½ÚµãºÍ±ß. ½« 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 ¿â, ÎÒÃDZØÐëÇ¿ÖÆÊ¹Óà asInstanceOf[T], ÆäÖÐ [T] Ϊ SingleNode ºÍ AbstractEdge, ×÷Ϊ addNode ºÍ
addEdge µÄ·µ»ØÀàÐÍ. Èç¹ûÎÒÃÇ©µôÁËÕâЩÏÔʽµÄÀàÐÍת»», ¿ÉÄÜ»áµÃµ½Ò»¸öÆæ¹ÖµÄÒì³£:
java.lang.ClassCastException:
org.graphstream.graph.implementations. SingleNode
cannot be cast to scala.runtime.Nothing$ |
ÏÔʾͼÏñ
ÍêÕûʾÀý:
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). as
InstanceOf [SingleNode]
}
// load the graphx edges into GraphStream edges
for (Edge(x, y, _) <- srcGraph.edges.collect()){
val edge = graph.addEdge
(x.toString ++ y.to String,
x.toString,
y.toString, true). asInstanceOf[AbstractEdge]
}
graph.display()
}
} |

ÖÁ´Ë, Ò»¸ö¼òµ¥µÄʾÀýÍê³É. ¸ü¶àʵÓõÄÄÚÈÝ¿É×ÔÐÐÑо¿.
Ŀǰ, Èç¹û²»ÏûºÄ´óÁ¿µÄ¼ÆËã×ÊÔ´, ¶ÔÓÚ´ó¹æÄ£µÄÍøÂçͼ»æÖÆÈÔȻȱ·¦Ò»¸öÓÐÁ¦µÄ¹¤¾ß. ÀàËÆµÄ¹¤¾ßÓÐ:
snap: »ùÓÚ GraphViz ÒýÇæ.
Gephi: ËüÊǽ»»¥Ê½µÄ¿ÉÊÓ»¯¹¤¾ß, ¾¡¹ÜËüÓÐд¶à¼¶²¼¾ÖºÍÄÚÖà 3D äÖȾÒýÇæÕâÑùµÄÌØÉ«, µ«ÊÇÈÔÈ»ÓÐЩ¸ß CPU ºÍÄÚ´æµÄÐèÇó.
ÁíÍâ, zeepelin Ò²¿ÉÓë Spark ¼¯³É, ¿É×ÔÐÐÁ˽â.
ͼµÄ·Ö²¼Ê½»òÕß²¢Ðд¦ÀíÆäʵÊǰÑͼ²ð·Ö³ÉºÜ¶àµÄ×Óͼ£¬È»ºó·Ö±ð¶ÔÕâЩ×Óͼ½øÐмÆË㣬¼ÆËãµÄʱºò¿ÉÒÔ·Ö±ðµü´ú½øÐзֽ׶εļÆË㣬¼´¶Ôͼ½øÐв¢ÐмÆËã¡£ÏÂÃæÎÒÃÇ¿´Ò»ÏÂͼ¼ÆËãµÄ¼òµ¥Ê¾Àý£º
|