小秦哥 发表于 2024-9-2 11:41:46

大数据-105 Spark GraphX 基本概述 与 架构根本 概念详解 焦点数据布局

点一下关注吧!!!非常感谢!!一连更新!!!

目前已经更新到了:



[*]Hadoop(已更完)
[*]HDFS(已更完)
[*]MapReduce(已更完)
[*]Hive(已更完)
[*]Flume(已更完)
[*]Sqoop(已更完)
[*]Zookeeper(已更完)
[*]HBase(已更完)
[*]Redis (已更完)
[*]Kafka(已更完)
[*]Spark(正在更新!)
章节内容

上节完成了如下的内容:


[*]Offsets 管理
[*]与Kakfa集成
[*]Redis管理Offsets
[*]从Redis获取Offsets 并更新到Redis
https://i-blog.csdnimg.cn/direct/85dd33cd922348889bb164d56479b455.png
基本先容

Spark GraphX 是一个基于 Apache Spark 的分布式图计算框架,专门用于处理图数据和执行图算法。它为用户提供了一种灵活而高效的方式来表达图计算,并支持复杂的图分析使命。GraphX 重要用于交际网络分析、推荐系统、网络流量分析等范畴。
极点 (Vertices) 和边 (Edges)

图是由一组极点(节点)和边(连接)构成的。极点表示图中的实体(例如人、设备等),边表示实体之间的关系(例如朋友关系、通讯路径等)。
在 GraphX 中,极点和边的属性可以是任意类型的数据布局,这使得它可以顺应多种应用场景。
图 (Graph)

GraphX 中的图是由一组极点和边构成的,并且可以具有属性。这些属性可以是图布局相干的数据,比如极点的标签和边的权重。
GraphX 提供了丰富的图操纵和变更方法,如子图提取、边反转、极点属性更新等。
图操纵

GraphX 提供了多种图操纵,包罗基于属性的图转换、子图提取、图的聚合操纵等。
例如,可以通过 mapVertices 和 mapEdges 操纵对极点和边举行变更,还可以通过 subgraph 提取满意特定条件的子图。
Pregel API

GraphX 提供了 Pregel API,这是一种灵活的图计算模子,答应用户通过迭代计算的方式来处理图数据。
Pregel 模子答应用户为每个极点界说一个消息处理函数,在每次迭代时更新极点的属性,直到满意某个条件。
图算法库

GraphX 包含了一些常用的图算法库,例如 PageRank、Connected Components(连通分量)、Triangle Counting(三角计数)等。
这些算法可以直接用于图数据分析,资助用户快速获取图的特性和模式。
与 Spark RDD 的集成

GraphX 的一个重要特性是与 Spark RDD 的无缝集成。用户可以将图的极点和边表示为 RDD,然后使用 RDD 操纵来处理图数据。
这种集成使得 GraphX 可以使用 Spark 的分布式计算本事,同时支持图数据的复杂分析。
性能优化

GraphX 通过数据切片、消息压缩、图的分区等技术来优化分布式图计算的性能。
这些优化使得 GraphX 能够处理大规模图数据,保持高效的计算性能。
Spark GraphX 概述



[*]GraphX 是 Spark 一个组件,专门用来表示图以及举行图的并行计算。GraphX通过重新界说了图的抽象概念来拓展了RDD:定向多图,其属性附加到每个极点和边。
[*]为了支持图计算,GraphX公开了一系列基本运算(比如:mapVertices、mapEdges、subgraph)以及优化后的 Pregel API 变种。此外,还包含越来越多的图算法和构建器,以简化图形分析使命。
[*]GraphX在图极点信息和边信息存储上做了优化,使得图计算框架性能相对于云原生RDD实现得以较大提升,接近或达到 GraphLab 等专业计算平台的性能。
[*]GraphX 最大的贡献是,在 Spark 之上提供了一栈式数据解决方案,可以方便且高效的完成图计算的一整套流水作业。
https://i-blog.csdnimg.cn/direct/6d7289b8eb4e427d8c27494e21d65e37.png
图的相干术语

图是一种较线性和树更为复杂的数据布局,图表达的是多对多的关系。
如下图所示,G1是一个简朴的图,其中V1、V2、V3、V4被称为极点(Vertex),任意两个极点之间的通路被称为边(Edge),它可以由(V1、V2)有序对来表示,此时称G1为有向图,意味着边是有方向的,若以无序对来表示图中一条边,则该图为无向图,如G2。
https://i-blog.csdnimg.cn/direct/b70ecc8bb97345b2924d6ca1f127ed0d.png
在 G1 中,与极点相干联的边的数量被称为极点的度(Degree),其中,以极点为起点的边的数量被称为极点的出度(OutDegree),以极点为终点的边的数量被称为极点的入度(InDegree)。
以 G1 中的 V1 举例,V1的度是3,其中出度为2,入度为1。
在无向图 G2 中,如果任意两个极点之间是连通的,则称 G2 为连通图(Connected Graph)。
在有向图中G1中,如果任意两个极点 Vm、Vn 且 m不即是n,从Vm到Vn以及从Vn到Vm之间都存在通路,则称G1为强连通图(Strongly Connected Graph)。任意两个极点之间存在通路,则称为路径(Path),用一个极点序列表示,若第一个极点和末了一个极点雷同,则称为回路或者环(Cycle)。
图数据库与图计算



[*]Neo4j 是一个老牌的开源图数据库,目前在业界的使用也较为广泛,它提供了一种简朴易学的查询语言:Cypher。
[*]Neo4j 支持交互式查询,查询效率很高,能够敏捷从整网中找出符合特定模式的子网,供随后分析用,实用于 OLTP 场景。
[*]Neo4j是图数据库,方向于存储和查询,能存储关联关系比力复杂,实体之间的连接丰富。比如:交际网络、知识图谱、金融风控等范畴的数据。
[*]擅长从某个点或者某些点出发,根据特定条件在复杂的关系中找到目标点或者边。如在交际网络中找到某个点三步以内能认识的人,这些人可以认为是潜在朋友。
[*]数据量限定在肯定范围内,能短时间完成的查询就是所谓的OLTP操纵。
[*]Neo4j查询与插入速度较快,没有分布式版本,容量有限,而且一旦图变得很大,如数十亿极点,数百亿边,查询速度会变得非常痴钝。
[*]Neo4j分为社区和企业版,企业版提供了一些高级的功能,但是代价昂贵。
https://i-blog.csdnimg.cn/direct/69a5a6084ec14440a64c1d20e4090ccb.png
比力复杂的分析和算法,如基于图的聚类,PageRank算法等,这类计算使命对于图数据库来说很难胜任了,重要由一些图发掘技术来负责。
Pregel 是 Google 与 2010年在 SIGMOD会议上发表的《Pregel:A System for Large-Scale Graph Processing》论文中提到海量并行图发掘的抽象框架,Pregel与Dremel一样,是Google新三驾马车之一,它基于BSP模子(Bulk Synchronous Paralles,整体同步并行计算模子),将计算分为多少个超步(Super Step),在超步内,通过消息来流传极点之间的状态。
Pergel 可以当作是同步计算,即等所有极点完成处理后再举行下一轮的超步,Spark基于Pregel论文实现的海量并行图发掘框架GraphX。
图计算模式

目前基于图的并行计算框架已经有许多,比如来自Google的Pergel、来自Apache开源的图计算框架Giraph/HAMA以及最著名的GraphLab,其中 Pregel、HAMA和Giraph都是非常雷同的,都是基于BSP模式。
BSP即整体同步并行,它将计算分成一系列超步的迭代,从纵向上看,它是一个串行模式,而从横向上看,它是一个并行模式,每两个超步之间设置一个栅栏(barrier),即整体同步点,确定所有并行的计算都完成后再启动下一轮超步。
https://i-blog.csdnimg.cn/direct/2aec16ed06b84cb7b076e2a3bc21406e.png
每一个超步包含三部分内容:


[*]计算Compute:每一个 processor 使用上一个超步传过来的消息和本地数据举行本地计算
[*]消息传递:每一个processor 计算完毕后,将消息传递给与之关联的其他processor
[*]整体同步点:用于整体同步,确定所有的计算和消息传递都没有举行完毕后,进入下一个超步
GraphX 根本

GraphX与Spark其他组件相比比力独立,拥有自己的焦点数据布局和算子。
GraphX架构

https://i-blog.csdnimg.cn/direct/fae814b944b94e27850e53c9ff6f0037.png
GraphX的整体架构可以分为三个部分:


[*]算法层:基于 Pregel 接口实现了常用的图算法,包罗PageRank、SVDPlusPlus、TriangleCount、ConnectedComponents、StronglyConnectedComponents 等算法
[*]接口层:在底层RDD根本上实现了Pergel模子 BSP模式的计算接口
[*]底层:图计算的焦点类,包含:VertexRDD、EdgeRDD、RDD
存储模式

巨型图的存储总体上有边分割和点分割两种存储方式,2013年,GraphLab2.0将其存储方式由边分割变为点分割,在性能上取得重大提升,目前基本上被业界广泛接受并使用。


[*]边分割(Edge-Cut ):每个极点都存储一次,但有的边会被打断分到两台呆板上,如许做的好处是节省存储空间,弊端是对图举行基于边的计算时,对于一条两个极点被分到不同呆板上的边来说,要跨呆板通讯传输数据,内网流量大
[*]点分割(Vertex-Cut):每条边只存储一次,都只会出现在一台呆板上,邻居多的点会被复制到多台呆板上,增长存储开销,同时会引发数据同步的题目,好处是可以大幅减少内网通讯量
https://i-blog.csdnimg.cn/direct/347aaf90acd74f508c1d4b6f8c757457.png
https://i-blog.csdnimg.cn/direct/32053918741a4d3cba18115f95fa9c5c.png
虽然两种方法互有利弊,但现在是点分割占上风,各种分布式图计算框架都将自己底层存储变成了点分割,重要原因有以下两个:


[*]磁盘代价下降,存储空间不再是题目,而内网的通讯资源并没有突破性希望,集群计算时内网带宽是宝贵的,时间比磁盘珍贵。用空间来换时间。
[*]在当前的应用场景下,绝大多数网络都是无尺度网络,遵循幂律分布,不同点的邻居数量相差非常悬殊,而边分割会使那些多邻居的点所相连的边大多数被分到不同的呆板上,如许的数据分布会使得内网带宽更加的左支右绌,于是边分割存储的方式就被渐渐抛弃了。
焦点数据布局

焦点数据布局包罗:


[*]Graph
[*]Vertices
[*]Edges
[*]Triplets
GraphX API的开发语言目前仅支持Scala,GraphX的焦点数据布局Graph由RDD封装而成。
Graph

GraphX 用属性图的方式表示图,极点有属性,边有属性。存储布局接纳边集数组的形式,即一个极点表,一个边表,如下图所示:
https://i-blog.csdnimg.cn/direct/c8f2d7bc158943a2a1d41f5ef79e4f2c.png
极点ID是非常重要的手段,它不光是极点的唯一标识符,也是描述边的唯一手段。
极点表与边表实际上就是RDD,它们分别为 VertexRDD 与 EdgeRDD。
Graph 类如下:
https://i-blog.csdnimg.cn/direct/1f5b6be3114246abaa7f50ba8d9b4aab.png


[*]Vertices 为极点表,VD为极点属性类型
[*]Edges 为边表,ED为边属性类型
[*]可以通过Graph的Vertices与Edges成员直接得到极点RDD与边RDD
[*]边RDD类型为EdgeRDD,继续自RDD]
Vertices

Vertices对应着名为 VertexRDD 的 RDD,这个RDD由极点ID和极点属性两个成员变量。
https://i-blog.csdnimg.cn/direct/84efbfbee2f946edb3080749b5725a6d.png
VertexRDD继续自RDD[(VertexID,VD)],这里VertexId表示极点ID,VD表示极点所带的属性的类别。
而 VertexId 实际上是一个 Long 类型的数据
https://i-blog.csdnimg.cn/direct/ff8b8382ae9b463fbc5058f6837e49c3.png
Edges

Edges对应着EdgeRDD,这个RDD拥有三个成员变量,分别是源极点Id、目标极点Id,以及边属性。
https://i-blog.csdnimg.cn/direct/5536ff5f45d64a13b58f6bdb6dda0d2f.png
Edge代表边,由源极点ID、目标极点ID,以及边的属性构成。
https://i-blog.csdnimg.cn/direct/87b3dbd997ca4aaa89e808362b8f935a.png
Triplets

Triplets表示边点三元组,如下图所示(其中圆柱形分别代表极点属性与边属性)
https://i-blog.csdnimg.cn/direct/8a36076aba9c4e75bb4c7058bca0386a.png
通过Triplets成员,用户可以直接获取到起点极点,起点极点属性、终点极点、终点极点属性、边与边属性信息。Triplets的生成可以有边表与极点表通过Scrld与Dstld连接而成。
Triplets对应着EdgeTriplet,它是一个三元组视图,这个视图逻辑上将极点和边的属性生存为一个RDD]
https://i-blog.csdnimg.cn/direct/80388569114b4b1bac049eb7aacb8e3a.png
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD

// 创建顶点和边
val vertices: RDD[(VertexId, String)] = sc.parallelize(Array(
(1L, "Alice"),
(2L, "Bob"),
(3L, "Charlie"),
(4L, "David")
))

val edges: RDD] = sc.parallelize(Array(
Edge(1L, 2L, 1),
Edge(2L, 3L, 1),
Edge(3L, 4L, 1),
Edge(4L, 1L, 1)
))

// 构建图
val graph = Graph(vertices, edges)

// 运行 PageRank 算法
val ranks = graph.pageRank(0.01).vertices

// 输出结果
ranks.collect().foreach { case (id, rank) =>
println(s"Vertex $id has rank: $rank")
}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 大数据-105 Spark GraphX 基本概述 与 架构根本 概念详解 焦点数据布局