LouvainMethod分布式运行的升级之路

这篇具有很好参考价值的文章主要介绍了LouvainMethod分布式运行的升级之路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、背景介绍        

        Louvain是大规模图谱的谱聚类算法,引入模块度的概念分二阶段进行聚类,直到收敛为止。分布式的代码可以在如下网址进行下载。

GitHub - Sotera/spark-distributed-louvain-modularity: Spark / graphX implementation of the distributed louvain modularity algorithm

  该代码依赖的spark-core和spark-graphx、scala-lang是2.10版本,采用的gradle的进行打包,也可以采用maven进行打包,解决相关的依赖问题之后,本地模式可以很快跑通。但是转向集群的时候,发现集群的spark的scala版本是2.12,我采用的是maven的scala编译的版本是2.10, 编译用到的scala和运行环境的scala版本不一致,结果无法进行spark集群模式的运行。

2、LouvainMethod的升级之路

        首先更改环境,即把louvain的代码依赖保持2.10,把spark的scala版本改成2.10,但是这样会影响其他任务的执行,其他任务可能依赖2.12的版本。因此,踏上了LouvainMethod的升级之路,即由2.10升级到2.12。

        将项目依赖的版本和编译的scala版本改为2.12之后,发现在新的高版本的spark-graphx_2.12版本里Graph对象没有了mapReduceTriplet方法,通过查找发现该方法在2.12版本的GraphXUtils类里,以一个私有方法存在,只能在包graphx下被访问,对外部不可见,因此首先想到的是通过反射机制对该私有方法进行访问,参照了如下的方法:

         在任意scala对象中调用私有方法 - 问答 - 腾讯云开发者社区-腾讯云

代码调试后,私有方法带有泛类型参数和普通参数,可以正常被反射出来,然而在调用的时候,始终报 wrong-number-of-arguments的问题。原因还没有查到。继而通过高版本的api是实现低版本的mapReduceTriplets方法。   参照该文档  GraphX - Spark 3.4.1 Documentation   的api接口含义,注意到新版2.12的Graph里aggregateMessage方法和低版本的mapReduceTriplets返回值一致,参数类型有diff,高版本的参数是EdgeContext,低版本的是EdgeTriplet,高版本通过sendToDst和sendToSrc对低版本进行了简化,使用功能更强大,因此尝试用aggregateMessage实现mapReduceTriplets。

val nodeWeightMapFunc = (e:EdgeTriplet[VD,Long]) => Iterator((e.srcId,e.attr), (e.dstId,e.attr))

val nodeWeightReduceFunc = (e1:Long,e2:Long) => e1+e2

转化为:

def nodeWeightMapFunc(e:EdgeContext[VD, Long, Long]) {
e.sendToDst(e.attr)
e.sendToSrc(e.attr)
}
Msg与reduceFunc的返回值保持一致。

通过如下方式进行调用:val nodeWeights = graph.aggregateMessages[Long](nodeWeightMapFunc,nodeWeightReduceFunc)

sendMsg的低版本如下:

private def sendMsg(et:EdgeTriplet[VertexState,Long]) = {
    val m1 = (et.dstId,Map((et.srcAttr.community,et.srcAttr.communitySigmaTot)->et.attr))
   val m2 = (et.srcId,Map((et.dstAttr.community,et.dstAttr.communitySigmaTot)->et.attr))
   Iterator(m1, m2)
}

升级为:

private def sendMsg(et: EdgeContext[VertexState, Long, Map[(Long,Long),Long]]) = {
et.sendToSrc(Map((et.dstAttr.community, et.dstAttr.communitySigmaTot) -> et.attr))
et.sendToDst(Map((et.srcAttr.community, et.srcAttr.communitySigmaTot) -> et.attr))
}

4、在集群运行相关jar的及运行脚本

LouvainMethod分布式运行的升级之路,分布式,louvain,谱聚类

 文章来源地址https://www.toymoban.com/news/detail-632137.html

到了这里,关于LouvainMethod分布式运行的升级之路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 浪花 - 单机登录升级为分布式 Session 登录

    浪花 - 单机登录升级为分布式 Session 登录

    目录 一、单机登录思路 二、修改为分布式登录的原理和思路 1. 单机登录的局限性 2. 解决方案:共享存储 三、使用 Redis 实现分布式登录 1. 本地安装 Redis 后启动 Redis 2. 引入 Redis 依赖 3. 在 application.yml 中配置 Redis 账户和密码 4. Redis 本地可视化管理工具:Another Redis Desktop

    2024年01月21日
    浏览(25)
  • 多线程、分布式运行用例

    多线程、分布式运行用例

    python多线程 多线程实例 输出: 多线程跑unittest框架中的用例:基于一个原则先将需要处理的内容保存在list中,基于list的元素来进行线程的添加,在unittest中可以通过 discover = unittest.defaultTestLoader.discover(start_dir=path, pattern=\\\'test*.py\\\') 发现所有的测试套件,然后使用 unittest.TextT

    2024年02月21日
    浏览(14)
  • 传统项目基于tomcat cookie单体会话升级分布式会话解决方案

    传统项目基于tomcat cookie单体会话升级分布式会话解决方案

    传统捞项目基于servlet容器 cookie单体会话改造分布式会话方案 ##引入redis,spring-session依赖 ##修改配置文件 ##启动类加入EnableRedisHttpSession注解 ##原理 ##spring自动配置spring.factories ##生成SessionRepositoryFilter过滤器对象 ##使用包装的SessionRepositoryRequestWrapper的request   SessionRepositoryResp

    2024年02月03日
    浏览(13)
  • [架构之路-221]:鸿蒙系统和安卓系统的比较:微内核VS宏内核, 分布式VS单体式

    [架构之路-221]:鸿蒙系统和安卓系统的比较:微内核VS宏内核, 分布式VS单体式

    目录 一、鸿蒙系统和安卓系统的系统架构 1.1 鸿蒙系统的分层架构 1.2 安卓系统的分层架构 1.3 鸿蒙系统和安卓系统是操作系统吗? 二、鸿蒙系统和安卓系统的系统架构比较 2.1 它们与Linux操作系统的关系 2.2 架构比较 三、操作系统基础 3.1 微内核架构 3.2 宏内核架构 3.3 传统

    2024年02月07日
    浏览(12)
  • 机器学习分布式框架ray运行xgboost实例

            Ray是一个开源的分布式计算框架,专门用于构建高性能的机器学习和深度学习应用程序。它的目标是简化分布式计算的复杂性,使得用户能够轻松地将任务并行化并在多台机器上运行,以加速训练和推理的速度。Ray的主要特点包括支持分布式任务执行、Actor模型、

    2024年02月15日
    浏览(15)
  • 机器学习分布式框架ray运行TensorFlow实例

    使用Ray来实现TensorFlow的训练是一种并行化和分布式的方法,它可以有效地加速大规模数据集上的深度学习模型的训练过程。Ray是一个高性能、分布式计算框架,可以在集群上进行任务并行化和数据并行化,从而提高训练速度和可扩展性。 以下是实现TensorFlow训练的概括性描述

    2024年02月15日
    浏览(10)
  • Python中的分布式运行:Selenium Grid

    Python中的分布式运行:Selenium Grid

    Selenium Grid 是 Selenium 测试框架的一个关键组件,它为测试人员提供了在多个计算机和浏览器上并行执行测试的能力。通过 Selenium Grid,我们能够更高效地进行大规模测试,并确保应用程序在不同环境中的稳定性和一致性。 我们将从以下几点深入解析Selenium Grid分布式运行的逻辑

    2024年04月12日
    浏览(14)
  • 火山引擎云搜索服务升级云原生新架构;提供数十亿级分布式向量数据库能力

    火山引擎云搜索服务升级云原生新架构;提供数十亿级分布式向量数据库能力

    从互联网发展伊始,搜索技术就绽放出了惊人的社会和经济价值。随着信息社会快速发展,数据呈爆炸式增长,搜索技术通过数据收集与处理,满足信息共享与快速检索的需求。 云搜索服务 ESCloud 是火山引擎提供的 完全托管在线分布式搜索服务 ,兼容 Elasticsearch、Kibana 等软

    2024年02月16日
    浏览(12)
  • 深度解析Redisson框架的分布式锁运行原理与高级知识点

    分布式系统中的锁管理一直是一个复杂而关键的问 题。在这个领域,Redisson框架凭借其出色的性能和功能成为了开发者的首选之一。本篇博客将深入探讨Redisson框架的分布式锁运行原理以及涉及的高级知识点。通过详细的解释和示例代码,您将更好地理解如何在分布式环境中

    2024年02月09日
    浏览(34)
  • 分布式任务调度平台XXL-JOB学习笔记-helloworld运行

    分布式任务调度平台XXL-JOB学习笔记-helloworld运行

    环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot(通过springboot管理的执行器实例)。 如果导入时速度非常慢,或者报错如 Plugin ‘org.apache.maven.plugins:maven-

    2024年02月13日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包