Graph入门介绍

0. 为什么需要图计算

  • 许多大数据以大规模图或网络的形式呈现
  • 许多非图结构的大数据,常会被转换为图模型进行分析
  • 图数据结构很好地表达了数据之间的关联性

1. 图(Graph)的基本概念

  • 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构
    通常表示为二元组:Gragh=(V,E)
    可以对事物之间的关系建模
  • 应用场景
    在地图应用中寻找最短路径
    社交网络关系
    网页间超链接关系

2. 图的术语

  • 顶点(Vertex)
  • 边(Edge)

image-20201123142953487

image-20201123143001392

  • 有向图

image-20201123143035949

image-20201123143043598

  • 无向图

image-20201123143101126

image-20201123143107241

  • 有环图

包含一系列顶点连接的回路(环路)

image-20201123143136922

  • 无环图

    DAG即为有向无环图

image-20201123143209833

  • 度:一个顶点所有边的数量
    出度:指从当前顶点指向其他顶点的边的数量
    入度:其他顶点指向当前顶点的边的数量

image-20201123143228913

3. 图的经典表示法

  • 邻接矩阵

image-20201123143317306

1、对于每条边,矩阵中相应单元格值为1

2、对于每个循环,矩阵中相应单元格值为2,方便在行或列上求得顶点度数

4. Spark GraphX 简介

  • GraphX是Spark提供分布式图计算API
  • GraphX特点
    • 基于内存实现了数据的复用与快速读取
    • 通过弹性分布式属性图(Property Graph)统一了图视图与表视图
    • 与Spark Streaming、Spark SQL和Spark MLlib等无缝衔接

5. GraphX核心抽象

  • 弹性分布式属性图(Resilient Distributed Property Graph)

    ​ 顶点和边都带属性的有向多重图

image-20201123144701324

image-20201123144707217

​ 一份物理存储,两种视图

image-20201123144712007

对Graph视图的所有操作,最终都会转换成其关联的Table视图的RDD操作来完成

6. GraphX API

  • Graph[VD,ED]
  • VertexRDD[VD]
  • EdgeRDD[ED]
  • EdgeTriplet[VD,ED]
  • Edge:样例类
  • VertexId:Long的别名

image-20201123145033272

class Graph[VD, ED] {
   
   
  val vertices: VertexRDD[VD]
  val edges: EdgeRDD[ED]
  val triplets: RDD[EdgeTriplet[VD, ED]]
}
import org.apache.spark.graphx._
val vertices:RDD[(VertexId,Int)]=sc.makeRDD(Seq((1L,1),(2L,2),(3L,3)))
val edges=sc.makeRDD(Seq(Edge(1L,2L,1),Edge(2L,3L,2)))
val graph=Graph(vertices,edges)  //Graph[Int,Int] ?

import org.apache.spark.graphx.GraphLoader
//加载边列表文件创建图,文件每行描述一条边,格式:srcId dstId。顶点与边的属性均为1
val graph = GraphLoader.edgeListFile(sc,"file:///opt/spark/data/graphx/followers.txt")

导入
import org.apache.spark.graphx._

创建顶点rdd
val vertices=sc.makeRDD(seq(1L,1),(2L,2),(3L,3))

创建edges边rdd
val edges=sc.makeRDD(Seq(Edge(1L,2L,1),Edge(2L,3L,2)))

创建graph对象
 val graph=Graph(vertices,edges)

获取graph图对象的vertices信息
graph.vertices.collect

获取graph图对象的edges信息
graph.edges.collect

7. 属性图应用示例

属性图应用示例-1

  • 构建用户合作关系属性图
    • 顶点属性
      • 用户名
      • 职业
    • 边属性
      • 合作关系

image-20201123145524023

val users=sc.makeRDD(Array((3L,("rxin","student")),(7L,("jgonzal","postdoc")),(5L,("franklin","professor")),(2L,("istoica","professor"))))

 val relationship=sc.makeRDD(Array(Edge(3L,7L,"Colla"),Edge(5L,3L,"Advisor"),Edge(2L,5L,"Colleague"),Edge(5L,7L,"Pi")))

val graphUser=Graph(users,relationship)


scala> graphUser.triplets.collect
res9: Array[org.apache.spark.graphx.EdgeTriplet[(String, String),String]] = Array(((2,(istoica,professor)),(5,(franklin,professor)),Colleague), ((3,(rxin,student)),(7,(jgonzal,postdoc)),Colla), ((5,(franklin,professor)),(3,(rxin,student)),Advisor), ((5,(franklin,professor)),(7,(jgonzal,postdoc)),Pi))


属性图应用示例-2

  • 构建用户社交网络关系
    • 顶点:用户名、年龄
    • 边:打call次数

image-20201123145640689

image-20201123145653369

找出大于30岁的用户

假设打call超过5次,表示真爱。请找出他(她)们

val users=sc.makeRDD(Array((1L,("Alice",28)),(2L,("Bob",27)),(3L,("Charlie",65)),(4L,("David",42)),(5L,("Ed",55)
### FunctionGraph 的使用教程与进阶指南 FunctionGraph 是华为云提供的无服务器(Serverless)计算服务,它允许开发者专注于代码编写,而无需关注底层的服务器管理。通过 FunctionGraph,用户可以快速构建、部署和运行 HTTP 函数、事件驱动函数等应用。 #### 基础使用:创建一个简单的 HTTP 函数 1. **环境准备** 在开始之前,确保你已经在华为云上注册了账号,并开通了 FunctionGraph 服务。接下来,选择合适的开发工具和语言运行时环境,例如 Python、Node.js 或 Java。 2. **创建 HTTP 函数** 登录华为云控制台,进入 FunctionGraph 服务页面,点击“创建函数”。选择“HTTP 函数”模板,填写函数名称、运行时语言等信息。完成后,系统将自动生成一个默认的 HTTP 触发器。 3. **编写函数逻辑** 在函数编辑界面中,可以编写处理 HTTP 请求的代码。例如,在 Python 中,你可以这样写一个简单的响应: ```python def handler(event, context): return { "statusCode": 200, "body": "Hello from FunctionGraph!" } ``` 4. **测试函数** 使用控制台内置的测试功能或者通过调用生成的 URL 来验证函数是否正常工作。 5. **部署函数** 完成测试后,点击“发布”按钮以使更改生效。此时,你的函数可以通过公网访问。 #### 进阶指南:使用 Spring Boot 构建 FunctionGraph HTTP 函数 在更复杂的场景下,可以借助 Spring Boot 框架来构建 FunctionGraph 的 HTTP 函数,从而利用其强大的依赖注入、自动配置等功能。 1. **初始化 Spring Boot 工程** 使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加必要的 Web 依赖(如 `spring-boot-starter-web`)。 2. **编写业务逻辑** 利用 Spring MVC 编写控制器类,定义 RESTful 接口。例如: ```java @RestController public class GreetingController { @GetMapping("/greeting") public String greeting() { return "Hello from Spring Boot on FunctionGraph!"; } } ``` 3. **适配 FunctionGraph 环境** 由于 FunctionGraph 的 APIG 触发器会在 URL 中自动添加函数名作为路径的一部分,因此需要调整 Spring Boot 应用的路径匹配策略。可以通过修改 `application.properties` 文件中的 `server.servlet.context-path` 属性来去除或自定义路径前缀: ```properties server.servlet.context-path=/ ``` 4. **打包与上传** 使用 Maven 或 Gradle 将项目打包为 JAR 文件,然后上传到 FunctionGraph 控制台。确保选择正确的运行时环境(如 Java 8/11)。 5. **配置触发器** 为函数添加 HTTP 触发器,并设置请求方法、路径等参数。生成的 URL 将用于外部访问。 6. **调用与调试** 通过浏览器或 Postman 等工具访问函数的调用 URL,检查返回结果是否符合预期。同时,可以在控制台查看日志信息以便于调试。 #### 高级特性与最佳实践 - **冷启动优化** FunctionGraph 的冷启动时间可能会影响性能。为了减少冷启动延迟,建议保持函数包体积尽可能小,并合理设置预留实例数量。 - **安全机制** 启用 IAM 身份认证和 API 密钥保护,限制对函数的非法访问。此外,还可以结合 VPC 和安全组实现网络隔离。 - **监控与日志** 利用华为云的 CloudWatch 或其他监控工具实时跟踪函数执行情况,及时发现并解决问题。同时,开启详细的日志记录功能,便于后续分析。 - **事件驱动架构** FunctionGraph 支持多种事件源,如对象存储(OBS)、消息队列(RabbitMQ/Kafka)等。通过绑定这些事件源,可以构建高度解耦、可扩展的应用程序。 - **自动化部署** 使用 CI/CD 流水线工具(如 Jenkins、GitLab CI)实现函数代码的自动构建与部署,提高开发效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值