利用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));
父主题: 故障排除