Kubernetes云原生实战:分布式GeaFlow实现图研发,构建第一个商业智能应用

简介: Kubernetes在云原生应用中扮演着至关重要的角色,为商业智能(BI)强大赋能。不同于传统的BI,容器化部署在集群中可以获得更高的可靠性、弹性和灵活性。

GeaFlow(品牌名TuGraph-Analytics) 已正式开源,欢迎大家关注!!! 欢迎给我们 Star 哦! GitHub👉https://github.com/TuGraph-family/tugraph-analytics
更多精彩内容,关注我们的博客 https://tugraph-analytics.github.io/


引言

Kubernetes在云原生应用中扮演着至关重要的角色,为商业智能(BI)强大赋能。 不同于传统的BI,容器化部署在集群中可以获得更高的可靠性、弹性和灵活性。

但在实际生产实践中,这还远远不够。 商业智能分析人员更希望搭建实时提问快速响应的研发平台,使得数据能够回应分析人员的想法,并产出更多支持商业决策的信息。 这需要类似于OLAP的在线分析处理(OLAP)技术,帮助查询、分析和理解大规模数据,从而做出更明智的商业决策。

例如这样一个接近实际的场景——

分析师想要找到具有'Comedian'类别下标签的博文和评论,TA的意图可以被描述如下:

MATCH (:TagClass where name = 'Comedian')
      <-[:hasType]-(:Tag)
      <-[:hasTag]-(msg:Post|Comment)

这里使用了开源图研发引擎GeaFlow支持的GQL语言描述,可以简单直观地描述商业关系。 后文将介绍基于分布式GeaFlow实现图研发,都采用类似的描述。

一段时间的研究后,分析师开始关注发布者的朋友都有哪些:

MATCH (:Tag)
      <-[:hasTag]-(msg:Post)
      <-[:hasCreator]-(person:Person)
      -[:knows]-{0,1}(friend:Person)

熟悉关系型数据库和大数据处理平台的朋友可能知道,这类模式分析涉及一系列的大型Join连接处理,在现有系统中计算时间往往超出预期。 在传统的商业智能模式下,分析师可能需要等待数天的时间才能获得他们需要的结果,以上3个小查询的处理成本已经大大超出它们产出的价值。

因此,我们需要一种能够快速支持查询和业务演进的解决方案,并且能够在一次构建后持续不断地提供商业智能信息产出。 在这种情况下,最好的选择是使用云原生部署的图研发平台。

图研发平台可以提供高效的图分析能力,使得分析师可以更快地探索数据,并且可以轻松地构建和优化查询。 使用图研发平台,可以将复杂的数据模型转化为可视化的图形表示,使得即使是新手分析师也可以直观地理解数据之间的关系。 此外,云原生技术保证平台的可扩展性和弹性,使得一行代码可以瞬间放大几十万倍,支撑起大规模数据的快速分析。

接下来我们带着这个问题出发,以支持云原生的分布式图研发平台GeaFlow为例,快速搭建起你的第一个商业智能应用。

部署环境

部署GeaFlow需要一个docker+K8S的云原生环境,因此需要提前安装docker和K8S。 GeaFlow能够将业务数据转化为图,一旦将数据导入一张图中,后续就可以持续支持各种分析需求。 业务数据支持各类来源,包括数据库、Hive、Kafka等等。

GeaFlow会在镜像中自动拉起MySQL、Redis、RocksDB、InfluxDB等必须组件。

部署K8S

GeaFlow依赖K8S运行图研发作业,安装K8S后需要取得API地址。

K8S API Server默认监听6443端口,可以在K8S集群的任一节点上使用以下命令查看集群信息:

kubectl cluster-info

查看输出结果中的“Kubernetes master”字段,该字段将列出Master节点的URL地址,该地址即为K8S API地址,例如:

Kubernetes master is running at https://172.25.8.152:6443

'/etc/kubernetes/admin.conf' 是Kubernetes集群的管理员配置文件,其中包含了客户端程序访问Kubernetes API Server的必要信息。

  • kubernetes.ca.data:该字段包含一个Base64编码的PEM格式的CA证书,用于验证Kubernetes API Server的身份。
  • kubernetes.cert.data:该字段包含一个Base64编码的PEM格式的客户端证书,用于验证客户端的身份。
  • kubernetes.cert.key:该字段包含一个Base64编码的PEM格式的私钥,用于解密客户端证书。

这些字段的值通常被编码为Base64格式并存储在配置文件中,以保证安全性。

GeaFlow需要取得这三个参数以启动K8S客户端,提交作业到集群。

部署DFS

为了存储TB级别的超大规模图,可能需要搭建DFS,小规模数据则不必要部署Hadoop,GeaFlow可以将图数据保存在本地磁盘中。

部署Hadoop后,需要取得文件系统地址,GeaFlow需要连接Hadoop写入图数据和系统运行状态数据。 打开终端并登录到Hadoop集群中的任何一个节点,运行以下命令:

hdfs getconf -namenodes

这将显示Hadoop集群的所有主节点的列表。如果集群只有一个主节点,则只会显示一个主节点的名称。 连接到Hadoop集群的主节点,运行以下命令:

hadoop org.apache.hadoop.conf.Configuration | grep 'fs.defaultFS'

这将显示fs.defaultFS的值,即Hadoop集群的默认文件系统URI。

部署外部数据源

GeaFlow目前支持DFS、Kafka、Hive等数据源,未来将支持JDBC、Pulsar等数据源。

用户可以实现自定义的数据源,参考自定义Connector文档。其中也包含现有数据源的使用方法。

如果需要更多数据源的支持,可以通过GitHub项目地址提出ISSUE,或者加入微信群联系我们。

安装GeaFlow

GeaFlow提供一个分布式图计算引擎GeaFlow,同时提供一个完整的图研发管控平台Console。 用户可在系统内完成图数据创建、研发、运维等工作。 管控平台Console可以基于Docker独立启动,配置好集群和存储系统后,图研发作业可以方便地提交到K8S集群运行。

参考GeaFlow安装部署文档安装GeaFlow。

在集群配置步骤中,配置K8S集群到GeaFlow,填入K8S服务地址与前文提到的证书信息。

anzhuang1.png

安装时会提示当前为单机部署模式,这表示Console平台使用默认单机部署。 图研发作业会被提交到配置的K8S集群,Console平台提供作业编辑和运维能力,不受影响。

在数据存储配置步骤中,配置导入GeaFlow的图数据存储位置。

anzhuang3.png

数据量较小可以配置为LOCAL模式,无需修改。 若数据量比较大,配置为DFS地址,Root路径为存储数据在DFS中的根目录。

最后点击一键安装完成GeaFlow安装部署。

构图

一次构图

GeaFlow可以支持TB级别的超大规模图,使得用户构图完成后,轻松应对业务演进。 超大规模数据的存储需要DFS的支持,数据来源可以是数据库、Hive、Kafka等等任何外部系统,通过对应的Connector读写数据。

举例来说,我们创建实现商业智能应用的第一张图,命名为bi。 创建图后, 将外部数据源的业务数据导入图中,使用对应的Connector完成数据导入。

create-graph.png

图的Schema定义如下,图名称为bi:

CREATE GRAPH IF NOT EXISTS bi (
  Vertex Tag (id bigint ID, name varchar, url varchar),
  Vertex Person (id bigint ID,  creationDate bigint,  firstName varchar,  lastName varchar,
                 gender varchar,  browserUsed varchar,  locationIP varchar),
  Vertex Post (id bigint ID,  creationDate bigint,  browserUsed varchar,  locationIP varchar,
               content varchar, length bigint,  lang varchar, imageFile varchar),
  Edge hasType (srcId bigint SOURCE ID, targetId bigint DESTINATION ID),
  Edge hasTag (srcId bigint SOURCE ID,  targetId bigint DESTINATION ID),
  Edge hasInterest (srcId bigint SOURCE ID, targetId bigint DESTINATION ID),
  Edge hasCreator (srcId bigint SOURCE ID,  targetId bigint DESTINATION ID),
  Edge knows (srcId bigint SOURCE ID, targetId bigint DESTINATION ID, creationDate bigint)
) WITH (
  storeType='rocksdb'
);

追加

即使在构图完成后,也可以向图中追加新的数据。 追加数据时,还可以流式触发增量查询,不断更新查询结果。

insert.png

向图bi中单独追加Person和knows点边数据的GQL:

Create Table If Not Exists tbl_Person (id bigint, type varchar, creationDate bigint, firstName varchar,
    lastName varchar, gender varchar, browserUsed varchar, locationIP varchar)
WITH ( type='file', geaflow.dsl.file.path='/tmp/data/bi_person');
INSERT INTO bi.Person
SELECT id, creationDate, firstName, lastName, gender, browserUsed, locationIP FROM tbl_Person;

Create Table If Not Exists tbl_edge_va (srcId bigint, targetId bigint, type varchar, va bigint)
WITH ( type='file', geaflow.dsl.file.path='/tmp/data/bi_edge_with_value');

INSERT INTO bi.knows SELECT srcId, targetId, va FROM tbl_edge_va WHERE type = 'knows';

图研发实现商业智能

数据调查

分析商业数据的第一步是明确问题,并通过数据调查开始针对性地进行数据分析,避免浪费时间和资源在无用的分析上。 我们已经利用GeaFlow将数据导入图bi中,可以通过运行图查询作业快速地得出结论和洞察。

以如下查询为例,它帮助我们了解用户关注的tag都有哪些,结果被写入本地或DFS的interest_tag文件夹中。

CREATE TABLE IF NOT EXISTS tbl_interest_tag
(personId bigint, personName varchar, tagId bigint, tagName varchar)
WITH (
  type='file',
  geaflow.dsl.file.path='/tmp/geaflow/chk/result/interest_tag'
);

USE GRAPH bi;

INSERT INTO tbl_interest_tag
MATCH (person:Person)-[:hasInterest]->(tag:Tag)
RETURN person.id as personId, concat(person.lastName, person.firstName) as personName,
       tag.id as tagId, tag.name as tagName
ORDER BY personId, tagId LIMIT 100
;

其核心查询是 MATCH (person:Person)-[:hasInterest]->(tag:Tag)。 这里()表示查询图中的点,[]表示查询图中的边。 完整的含义是"用户感兴趣的标签",GeaFlow采用类似ISO-GQL的模式表达,可以方便自然地描述关系。

通过管控平台Console,分析人员可以提交一系列研究作业。 这些图查询作业会通过GeaFlow引擎自动提交到K8S集群中分布式地运行,大大太高了数据分析的能力和效率。

jobs.png

运行的图查询均可在Console界面查看,方便回溯和管理。

图研发

通过了基础的数据调查,分析师开始关注用户在标签上展现的中心性。 我们可以自定义一种中心性关系:

用户相对标签的中心性包括两部分,第一部分等于用户发送该标签消息数,第二部分为用户对该TAG感兴趣则+100

计算图中所有用户对TAG的中心性可以被表示为如下的查询:

CREATE TABLE IF NOT EXISTS tbl_centrality_score
(personId bigint, personName varchar, tagId bigint, tagName varchar, personCentralityScore bigint)
WITH (
  type='file',
  geaflow.dsl.file.path='/tmp/geaflow/chk/result/tag_centrality_score'
);

USE GRAPH bi;

INSERT INTO tbl_centrality_score
MATCH (interest_tag:Tag)<-[:hasInterest]-(person:Person)
LET person.hasInterest = COUNT((person:Person)-[:hasInterest]->(tag where id = interest_tag.id) => tag.id)
LET person.messageScore = COUNT((person:Person)
                                <-[:hasCreator]-(message:Post|Comment)
                                -[:hasTag]->(tag where id = interest_tag.id)
                                => tag.id)
LET person.score = person.messageScore + IF(person.hasInterest > 0, 100, 0)
RETURN person.id as personId, concat(person.lastName, person.firstName) as personName,
       interest_tag.id as tagId, interest_tag.name as tagName, person.score as personCentralityScore
ORDER BY personId, personCentralityScore DESC LIMIT 100
;

其中person.scoreperson.messageScoreIF(person.hasInterest > 0, 100, 0)两部分组成,返回的列表经分数降序排列,取前100条记录。

更近一步地,分析人员可以定义这种中心性分数的一度传播,使其成为中介中心性分数的近似值。 我们设计的查询关系如下图,用户对某个TAG的中介中心性分数近似为与其具有knows关系用户的中心性分数之和。

bi_08_graph.png

表示为GQL查询如下:

CREATE TABLE IF NOT EXISTS tbl_person_centrality (
  personId bigint,
  score bigint,
  friendsScore bigint
) WITH (
  type='file',
  geaflow.dsl.file.path='/tmp/geaflow/chk/result/person_centrality'
);

USE GRAPH bi;

INSERT INTO tbl_person_centrality
MATCH (person:Person)
--tag.name = 'Huang Bo' tag.id = 1020002
LET person.hasInterest = COUNT((person:Person)-[:hasInterest]->(tag where id = 1020002) => tag.id)
LET person.messageScore = COUNT((person:Person)
                                <-[:hasCreator]-(message:Post|Comment
                                where creationDate > 1672502400000 and creationDate < 1696160400000)
                                -[:hasTag]->(tag where id = 1020002)
                                => tag.id)
LET GLOBAL person.score = person.messageScore + IF(person.hasInterest > 0, 100, 0)
MATCH (person:Person)-[:knows]-{0,1}(friend:Person)
RETURN person.id as personId, person.score as personCentralityScore,
SUM(IF(friend.id = person.id, CAST(0 as BIGINT), CAST(friend.score as BIGINT))) as friendScore
GROUP BY personId, personCentralityScore
ORDER BY personCentralityScore + friendScore DESC, personId LIMIT 100
;

这个查询计算了一段时间内,1020002这个标签相关的用户一度中介中心性分数,把个人的中心性分数与中介中心性分数相加,降序排列后输出前100条记录。

至此,我们模拟进行了一次图研发过程,得到了一种可以利用的标签中心性计算方法。 整个过程都在GeaFlow的管控平台Console中完成,分析人员无需关注云上的作业运行细节。

构建应用

如果我们希望长期利用图研发得到的计算方法,则可以将其构建为长期运行的图计算应用。

通过接入数据源进行流式图查询,GeaFlow将在图每次更新或外部数据触发时,执行一次中介中心性分数计算。 更新的结果将被输出到外部系统,方便分发给下游。

搭建方法可以参考"[谁在以太坊区块链上循环交易?TuGraph+Kafka的0元流图解决方案]"这篇博文,这里不再赘述。

总结

本文介绍了GeaFlow如何在云原生的K8S环境中安装部署,并模拟了一次商业智能研究过程。 全程采用GeaFlow自有的管控平台Console提交作业,展现了系统强大的表达和计算能力。


GeaFlow(品牌名TuGraph-Analytics) 已正式开源,欢迎大家关注!!!

欢迎给我们 Star 哦!

Welcome to give us a Star!

GitHub👉https://github.com/TuGraph-family/tugraph-analytics

更多精彩内容,关注我们的博客 https://tugraph-analytics.github.io/

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
9天前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战####
本文探讨了云原生技术在现代企业IT架构中的关键作用,分析了其带来的优势和面临的主要挑战。通过实际案例分析,揭示了如何有效应对这些挑战,以实现业务敏捷性和技术创新的平衡。 ####
|
6天前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
11天前
|
Kubernetes Cloud Native 物联网
云原生技术在现代软件开发中的应用与挑战####
本文探讨了云原生技术的兴起背景、核心理念及其在现代软件开发中的广泛应用。通过具体案例分析,揭示了云原生架构如何促进企业数字化转型,并指出了在实施过程中面临的主要挑战及应对策略。 ####
|
1天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
1天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
2天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
30 13
|
1天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
6天前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
13天前
|
消息中间件 Cloud Native 持续交付
云原生技术在现代企业中的应用与优势###
本文深入探讨了云原生技术在现代企业中的具体应用及其带来的显著优势。随着云计算的普及,云原生作为一种新兴的技术架构,正逐渐成为企业数字化转型的关键驱动力。文章将详细介绍云原生的核心概念、主要技术组件以及在实际业务场景中的成功案例,旨在为读者提供一个全面且实用的参考框架,以便更好地理解和应用云原生技术。 ###