当前位置: 首页 > 科技观察

图数据导入技术性能优化实践

时间:2023-03-18 09:58:55 科技观察

1.背景介绍图数据是NoSQL的一种非关系数据类型,应用图论存储和表示实体之间的关系信息,例如社交网络关系中人与人之间的关系,知识图谱中实体之间的连接关系等。图数据库的独特设计弥补了关系数据库不适合存储图数据、查询逻辑复杂、查询速度慢的缺点。因此,图数据库在社交网络、精准推荐、金融风控、知识图谱等领域得到广泛应用。数据导入功能作为大规模图数据应用中的第一个也是比较关键的环节,在开发图应用的过程中数据导入功能非常重要。经调研,目前市场上主流的图数据库有Neo4j、NebulaGraph、TigerGraph、JanusGraph、HugeGraph、DGraph等国内外多家厂商。本文主要选取Neo4j、NebulaGraph、JanusGraph这三个图数据库作为研究对象,深入对比分析它们在数据导入方面的特点,最后介绍我们在数据导入技术方面的解决方案。1.1NebulaGraph图数据库NebulaGraph是一个采用无共享分布式架构设计的开源分布式原生图数据库。擅长处理千亿节点、万亿边的超大规模数据集,提供毫秒级查询。采用计算与存储分离的架构模式,基于RocksDB自研高性能KVStore作为本地存储引擎,使用Raft协议保证分布式系统多副本的强一致性和高可用。NebulaGraph在数据导入方面提供了多种工具和组件操作,如Importer、Console、Studio、Exchange等,其中Console是通过控制终端使用命令行导入,适合操作小人工测试数据量;Studio组件可以通过浏览器导入。机器上有多个csv文件,只能使用csv类型;Importer工具可以在单机上导入多个csv文件,一般数据量限制在亿级以内使用;Exchange组件基于Spark分布式集群,可从csv、Hive、Neo4j、MySQL下载各种数据源导入大规模数据集,支持十亿级以上的数据;Spark-connector组件的使用需要一定的软件开发能力和少量的代码编写。各个工具的使用复杂度和导入速度可以从下面的坐标图看出:1.2JanusGraph图数据库JanusGraph是一个开源的分布式图数据库,基于ApacheTinkerPop3框架开发,使用Gremlin查询语言,具有完整的工具链帮助用户轻松构建基于图数据库的应用程序和产品的组件。在存储层设计上,JanusGraph支持分布式存储,数据多副本,水平扩展,内置多个后端存储引擎,可以通过插件集成第三方存储扩展后端存储引擎,如Cassandra、HBase、BerkeleyDB等数据中间件。JanusGraph图数据库提供了以下几种数据导入方式:?Api数据导入:该方案通过提交javaapi的方式插入数据请求,数据量较小时可以使用;?基于GremlinServer的批量数据导入:本方案使用gremlin以语句提交插入请求,需要搭建GremlinServer服务,需要具备一定的研发能力;?基于BulkLoader组件导入:提供官方批量导入方式,需要Hadoop/Spark集群环境,支持json、csv、xml、kryo等类型,可批量导入数据。JanusGraph数据导入流程如下图所示:1.3Neo4jGraph图数据库Neo4j是Java开发的半开源图数据库,使用Cypher查询语言,支持快速的数据库操作和直观的图数据展示,运行速度不会随数据量的增减而显着变化。Neo4J采用原生的图存储设计,在存储节点时使用“无索引”的邻接模型。每个节点都有指向其邻居节点的指针,可以在O(1)时间内找到邻居节点,提供快速高效的图遍历。Neo4j支持以下数据导入方式:?基于Cypher语法中的Load-csv方式:官方ETL工具只支持csv文件,导入速度慢。需要掌握Cypher语言,适用于小批量数据;?Neo4j-import导入工具:官方大规模数据导入工具,支持并行可扩展的大规模csv文件导入,适用于初始化数据数千万级以上的数据;?BatchInserter导入工具:只能在Java中使用的API数据导入方案,导入速度非常快,适合千万级以上的大规模数据操作。Neo4j图数据库架构设计图如下:综合比较上述图数据库的数据导入能力,我们选择了NebulaGraph国产图数据库的Exchange组件作为重点研究对象。它是一个ApacheSpark应用程序,基于Apache2.0协议开源代码,支持多种不同格式和来源的数据,例如:csv、json、hdfs、hive、MySQL、kafka、Neo4j等。我们会优化代码架构,依赖集群优化,优化存储层结构。优化了组件的导入能力。2、数据导入优化技术要点经过调研比较,目前的图数据导入功能存在导入效率低、数据源形式限制严格、工具操作复杂等问题。基于Exchange组件,我们将优化导入流程框架、SparkCluster调优策略、存储层RocksDb组件优化等多维度研究,提升数据导入效率,从而最大程度缩短海量数据导入时间,丰富形态导入数据源,节省用户的时间和成本。数据导入组件的技术流程设计如下:2.1Exchange组件优化Exchange是基于Spark组件编写的应用程序。其主要功能是将集群中各种格式的批数据和流数据批量导入到图数据库中。我们设计并优化了“Reader-Processor-Writer”三层数据导入模型,引入并发编程模型多线程处理数据在不同点和侧面的处理,其中Reader层从不同来源读取批量数据并生成分布式数据集DataFrame,Processor层负责读取DataFrame中的批量数据,通过提取图数据的结构特征,根据配置文件中设置的映射关系根据列名获取对应的值,读取指定批次数据后,Writer层负责将获取的批次数据一次性写入图数据库。在整个处理流程中,一些参数设置对处理速率影响比较大,比如batch(指定单个batch中写入图数据库的顶点和边的最大数量)、partition(指定Spark分片的数量)、rate.limit(指定导入数据桶中的令牌数量限制)等,如何根据机器资源环境合理设置相应参数非常重要。在数据导入过程中,为充分利用spark分布式引擎资源,根据服务器资源使用情况、数据插入率、响应时间等因素,通过设计集群动态参数自适应策略,动态调整导入量单个批次中分批插入的数据量,以及spark集群中的分区数。合理的分区数可以减少任务调度时间和数据倾斜问题,快速并行处理RDD数据集,最大化利用集群性能,提高数据转换效率。同时设计了RateLimiter限流机制,通过令牌桶算法控制图数据库单次gql数据插入量,保证图数据库在处理大量数据时能够正常流畅运行。另外,利用断点续传的能力,可以将前一阶段没有转换的数据(网络中断等原因)通过保存断点的方式继续转换,提高数据转换的稳定性。大规模图数据导入流程架构图设计如下:2.2Spark集群优化Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎,Exchange是基于Spark编写的应用程序,它基于Spark的分布。如何充分利用分布式集群资源是提高Exchange数据导入效率的关键点。我们编写完Exchange组件代码程序后,按照Spark协议使用spark-submit命令提交运行。Spark支持四种运行模式:local、standalone、mesos和yarn。生产环境推荐使用yarncluster模式。我们将此模式用于任务运行和调试。通过一系列的优化对比测试,结合官网等资料,总的来说,要充分压榨和利用集群资源,在资源限制内尽可能多的分配内存消耗和提高并发。在应用运行调优过程中,需要根据当前的Spark集群配置,对各种参数进行设置和调优,以减少任务调度时间和数据倾斜问题,最大化数据运行效率。?一些重要的参数简单说明如下:num-executors根据集群服务器数量设置,executor-cores根据每台机器的CPU核数设置,driver-memory和execute-memeory设置根据内存总量,num-executors*execute-memory不能超过集群可用内存等。2.3Storage存储层优化图中存储的主要数据是点和边。Nebula图数据库将点和边的信息存储为key,将点和边的属性信息存储为value,以便更高效地使用属性过滤。Nebula在Storage层使用RocksDB作为存储组件。RocksDB是一个基于LSM架构的可插拔持久化存储系统,支持高效的读写吞吐量,与分布式存储系统有相似的术语和定义,如WAL、Compact、Transaction等,作为分布式存储引擎的存储介质,在方案设计时为了保证数据的一致性,RocksDB的整个写链路都会先写WAL,然后再写memtale,其中WAL保证了数据的高可用,可以根据WAL恢复数据使用。在存储层的参数配置中,RocksDB中一些比较重要的参数介绍如下:rocksdb_block_cache,设置默认块缓存大小,用于缓存解压后的数据,建议设置为1/3左右节点的有效载荷内存;max_background_jobs,设置后台工作子线程数,加快压缩效率,建议设置为节点机有效可用核数;max_subcompactions,设置压缩线程数。以上参数可以在数据导入配置中与batch等参数结合调试使用,然后选择一个与当前环境资源相匹配的理想参数配置。存储层写入数据的流程图如下:3.总结以上是我们在大规模图数据导入功能中总结的一些优化经验。经过多种策略优化设计,测试报告显示,在相同资源下,优化前后导入了亿级数据量。性能提升了12.66%。软件优化是一个永无止境的系统工程。除了我们上面提到的优化策略之外,还有很多其他的处理方式我们没有发现。希望大家继续探讨交流。