大数据-105 Spark GraphX 基本概述 与 架构基础 概念详解 核心数据结构

news2024/11/15 9:12:41

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

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(正在更新!)

章节内容

上节完成了如下的内容:

  • Offsets 管理
  • 与Kakfa集成
  • Redis管理Offsets
  • 从Redis获取Offsets 并更新到Redis

在这里插入图片描述

基本介绍

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 之上提供了一栈式数据解决方案,可以方便且高效的完成图计算的一整套流水作业。

在这里插入图片描述

图的相关术语

图是一种较线性和树更为复杂的数据结构,图表达的是多对多的关系。
如下图所示,G1是一个简单的图,其中V1、V2、V3、V4被称为顶点(Vertex),任意两个顶点之间的通路被称为边(Edge),它可以由(V1、V2)有序对来表示,此时称G1为有向图,意味着边是有方向的,若以无序对来表示图中一条边,则该图为无向图,如G2。

在这里插入图片描述
在 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分为社区和企业版,企业版提供了一些高级的功能,但是价格昂贵。

在这里插入图片描述
比较复杂的分析和算法,如基于图的聚类,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),即整体同步点,确定所有并行的计算都完成后再启动下一轮超步。

在这里插入图片描述
每一个超步包含三部分内容:

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

GraphX 基础

GraphX与Spark其他组件相比比较独立,拥有自己的核心数据结构和算子。

GraphX架构

在这里插入图片描述

GraphX的整体架构可以分为三个部分:

  • 算法层:基于 Pregel 接口实现了常用的图算法,包括PageRank、SVDPlusPlus、TriangleCount、ConnectedComponents、StronglyConnectedComponents 等算法
  • 接口层:在底层RDD基础上实现了Pergel模型 BSP模式的计算接口
  • 底层:图计算的核心类,包含:VertexRDD、EdgeRDD、RDD[EdgeTriplet]

存储模式

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

  • 边分割(Edge-Cut ):每个顶点都存储一次,但有的边会被打断分到两台机器上,这样做的好处是节省存储空间,坏处是对图进行基于边的计算时,对于一条两个顶点被分到不同机器上的边来说,要跨机器通信传输数据,内网流量大
  • 点分割(Vertex-Cut):每条边只存储一次,都只会出现在一台机器上,邻居多的点会被复制到多台机器上,增加存储开销,同时会引发数据同步的问题,好处是可以大幅减少内网通信量

在这里插入图片描述
在这里插入图片描述
虽然两种方法互有利弊,但现在是点分割占上风,各种分布式图计算框架都将自己底层存储变成了点分割,主要原因有以下两个:

  • 磁盘价格下降,存储空间不再是问题,而内网的通信资源并没有突破性进展,集群计算时内网带宽是宝贵的,时间比磁盘珍贵。用空间来换时间。
  • 在当前的应用场景下,绝大多数网络都是无尺度网络,遵循幂律分布,不同点的邻居数量相差非常悬殊,而边分割会使那些多邻居的点所相连的边大多数被分到不同的机器上,这样的数据分布会使得内网带宽更加的捉襟见肘,于是边分割存储的方式就被逐渐抛弃了。

核心数据结构

核心数据结构包括:

  • Graph
  • Vertices
  • Edges
  • Triplets

GraphX API的开发语言目前仅支持Scala,GraphX的核心数据结构Graph由RDD封装而成。

Graph

GraphX 用属性图的方式表示图,顶点有属性,边有属性。存储结构采用边集数组的形式,即一个顶点表,一个边表,如下图所示:
在这里插入图片描述
顶点ID是非常重要的手段,它不光是顶点的唯一标识符,也是描述边的唯一手段。
顶点表与边表实际上就是RDD,它们分别为 VertexRDD 与 EdgeRDD。
Graph 类如下:
在这里插入图片描述

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

Vertices

Vertices对应着名为 VertexRDD 的 RDD,这个RDD由顶点ID和顶点属性两个成员变量。
在这里插入图片描述
VertexRDD继承自RDD[(VertexID,VD)],这里VertexId表示顶点ID,VD表示顶点所带的属性的类别。
而 VertexId 实际上是一个 Long 类型的数据
在这里插入图片描述

Edges

Edges对应着EdgeRDD,这个RDD拥有三个成员变量,分别是源顶点Id、目标顶点Id,以及边属性。
在这里插入图片描述
Edge代表边,由源顶点ID、目标顶点ID,以及边的属性构成。
在这里插入图片描述

Triplets

Triplets表示边点三元组,如下图所示(其中圆柱形分别代表顶点属性与边属性)
在这里插入图片描述
通过Triplets成员,用户可以直接获取到起点顶点,起点顶点属性、终点顶点、终点顶点属性、边与边属性信息。Triplets的生成可以有边表与顶点表通过Scrld与Dstld连接而成。
Triplets对应着EdgeTriplet,它是一个三元组视图,这个视图逻辑上将顶点和边的属性保存为一个RDD[EdgeTriples[VD,ED]]
在这里插入图片描述

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[Edge[Int]] = 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") 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用myAGV、Jetson Nano主板和3D摄像头,实现了RTAB-Map的三维建图功能!

引言 在现代机器人技术中,高精度的环境感知与建图是实现自主导航的关键。本文将展示如何使用myAGV Jetson Nano移动平台搭载Jetson Nano BO1主板,结合RTAB-Map和3D相机,实现更加立体和细致的环境建图。myAGV Jetson Nano具备SLAM雷达导航功能…

es的简易dsl语句

数据模式为文档,_doc格式数据,也就是json 数据 es根据_id查询数据 GET /index_name/_doc/document_id es根据_id删除数据 DELETE /index_name/_doc/document_id es查询mapping结构 GET /index_name/_mappings es查询index下所有数据(突破100…

9、LLaMA-Factory项目微调介绍

1、LLaMA Factory 介绍 LLaMA Factory是一个在GitHub上开源的项目,该项目给自身的定位是:提供一个易于使用的大语言模型(LLM)微调框架,支持LLaMA、Baichuan、Qwen、ChatGLM等架构的大模型。更细致的看,该项…

UG NX二次开发(C++)-获取曲面的相切曲面

文章目录 1、前言2、创建一个三维模型3、获取相切曲面的方法3、测试结果1、前言 最近一段时间,QQ群中的群友总问我一个问题,那就是如何获取曲面的相切曲面,我今天就把这个方法写出来,以帮助读者。 在UG二次开发中,查询了帮助文档,没有找到获取相切曲面的函数。所以采用N…

「C++系列」继承

文章目录 一、继承1. 基本概念2. 继承类型①公有继承(Public Inheritance)②私有继承(Private Inheritance)③保护继承(Protected Inheritance) 3. 继承的语法4. 构造函数和析构函数①构造函数案例②析构函…

单链表的问题(2)

1.对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 这个我们可以运用双指针来解决这个…

爆改YOLOv8|利用全新的聚焦式线性注意力模块Focused Linear Attention 改进yolov8(v1)

1,本文介绍 全新的聚焦线性注意力模块(Focused Linear Attention)是一种旨在提高计算效率和准确性的注意力机制。传统的自注意力机制在处理长序列数据时通常计算复杂度较高,限制了其在大规模数据上的应用。聚焦线性注意力模块则通…

EmguCV学习笔记 C# 7.1 角点检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Excel中让第一行始终显示

要在Excel中让第一行始终显示,你可以使用冻结窗格功能。具体步骤如下: 打开需要设置第一行一直显示的工作表。将光标定位在工作表内任意一个单元格内。选择“视图”菜单,单击工具栏中的“冻结窗格”命令。在弹出的下拉菜单中选择“冻结首行”…

字母的大小写转换(tolower、toupper、transform)

字母的大小写转换(tolower、toupper、transform) 1. tolower()、toupper()函数 (这个在之前的一篇文章 “字符串中需要掌握的函数总结(1)”中有较为详细的介绍。&#…

时利和:如何提升工装夹具的加工质量?

在机械加工领域,工装夹具起着至关重要的作用。它不仅能够提高生产效率,还能保证加工精度,确保产品质量的稳定性。那么,如何提升工装夹具的加工质量呢?以下是时利和整理分享的几个关键因素。 一、精准的设计 工装夹具的设计是决定…

使用物联网卡访问萤石云的常见问题

使用物联网卡接入萤石开放平台时经常遇到各种问题,这边总结了常见的一些 用的是哪家运营商的卡? 电信 移动 联通(申请的时候可以自主选择) 卡有什么限制? 定向流量卡,只能访问萤石云平台,只能…

完美解决Jenkins重启后自动杀掉衍生进程(子进程)问题

完美解决Jenkins重启后自动杀掉衍生进程(子进程)问题 本文中使用的Jenkins版本为Version 2.452.3 先罗列一下前置问题:Jenkins任务构建完成自动杀掉衍生进程 用过Jenkins的都知道,Jenkins任务构建完成后,是会自动杀掉衍生进程,这…

安卓AppBarLayout与ViewPager2里的fragment里的webview滑动冲突

今天开发遇见一个头痛的问题,就是AppBarLayout和webview会存在一个冲突问题。如图下 问题出现在webview推到顶端的时候,AppBarLayout并不会跟着响应伸缩,解决办法是 在 webview 包 一个 父的 NestedScrollView 就能解决了。 运行效果入下 更改…

单向链表和双向链表的一些基本算法

单向链表头插尾插 单向链表的销毁与反转 反转原理:将头节点与后面的节点分开,然后从第一个节点开始对每个节点使用头插法 冒泡排 选排 链表环: 判断是否有环:弗洛伊德快慢指针(快指针一般是慢指针的2倍,差为…

Selenium(HTML基础)

一、HTML基础 (在学习自动化时,保证能看懂) 1.1.HTML介绍 英文是HyperText Markup Language,译为:超文本标记语言是Internet上用于设计网页的主要语言,2008年发布了HTML5.0,是目前互联网的标准,并作为互联…

数据结构之 “单链表“

(1)在顺表表中,如果是头插/删的时间复杂度是O(1);尾插/删的时间复杂度是O(N) (2)增容一般是呈2倍的增长,势必会有一定的空间浪费。比如:申请了50个空间,只用了两个&#…

【Matlab】SSA-BP麻雀搜索算法优化BP神经网络回归预测 可预测未来(附代码)

资源下载: 资源合集: 目录 一,概述 传统的BP神经网络存在一些问题,比如容易陷入局部最优解、训练速度慢等。为了解决这些问题,我们引入了麻雀算法作为优化方法,将其与BP神经网络相结合,提出了…

精准高效,省时省力——2024年翻译工具新趋势

如果你收到一份外文文档,但是你看不懂急需翻译成中文,将文档内容复制粘贴到翻译的的窗口获得中文内容是不是很麻烦。我了解到了deepl翻译文档之后还认识了不少的翻译神器,这次分享给你一起试试吧。 第一款福晰在线翻译 链接直达>>htt…

3D工艺大师:精准助力医疗设备远程维修

医疗设备是现代医疗体系中不可或缺的重要工具,它们帮助医生更准确地诊断病情,更有效地进行治疗。但随着技术的进步,这些设备变得越来越复杂,维修起来也面临诸多挑战。 首先,医疗设备结构复杂,零件众多&…