中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

利用Spark-Shell对算法包调用调测参数错误的解决方法

问题现象描述

使用Spark-Shell调测极大团等算法时(Kernel包),外部接口参数个数与算法定义不一致。如下所示。

原始接口:

def run[T: ClassTag](graph: RDD[(T, T)], minK: Int, maxDegree: Int, repartition: Int)

调测时显示的接口参数:

def run (graph: RDD[(T, T)], minK: Int, maxDegree: Int, repartition: Int, t: scala.reflect.ClassTag)

关键过程、根本原因分析

由于Kernel包为核心资产,在出包时会进行代码混淆,混淆后,泛化类型会作为参数嵌入接口中,若按算法对外接口文档传参,将报参数个数不一致的错误。

结论、解决方案及效果

建议基于Client包开发测试程序并编译,此时通过spark-submit提交可正确运行(运行时依赖Kernel包)。若现场开发人员需要实时调试,可基于Kernel包开发并调测,此时有如下两种解决方案可正确运行。

  • 方案1:基于Spark-Shell进行接口调测,Kernel包以-jars参数引入并定义实例化泛化类型。
    1
    2
    3
    import scala.reflect._
    val ct =classTag[String]
    MaximalCliqueEnumeration.run(graph, mink, maxDegree, repartiton, ct)
    

    通过-jars引入Kernel包和Client包,在Spark-Shell中调用接口时不需要传入classtag参数,但运行时返回NULL值—失败。

  • 方案2:将Kernel包作为第三方依赖加入IDEA,并在Scala环境和Java环境开发并进行本地调测。Scala环境中处理方式与方案1相同,Java环境接口调用如下。
    1
    MaximalCliqueEnumeration.run(JavaPairRDD.toRdd(inputRdd),Integer.valueOf(mink),Integer.valueOf(maxDegree),Integer.valueOf(saveFilePartition),ClassManifestFactory.classType(String.class));
    

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词