通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误

Posted

技术标签:

【中文标题】通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误【英文标题】:Running SonarQube analysis via jenkins throwing *** error for Spark Scala code 【发布时间】:2021-12-13 15:51:51 【问题描述】:

我有一个 spark scala 应用程序,它运行良好,在 jenkins 构建和本地构建中没有任何问题。对于其中一种方法,我们使用 160 withColumn 向数据框添加列。我们要求再增加两列。当我添加它时,本地和 EMR 的一切都运行良好,但是当添加这两列时,声纳分析会引发 *** 错误。如果我删除它,则没有问题。不确定 jenkins 容器是否有足够的资源。尝试使用不同的声纳扫描仪版本,都失败了,但是单元测试,代码覆盖在本地和詹金斯工作正常,只有声纳扫描仪失败。 Jenkins error 1 Jenkins error 2

我是否需要重写代码以不多次使用 withcolumns ? 或者这是在声纳扫描仪或詹金斯级别解决的问题?

除了使用 160 次 withcolumn 之外,还有更好的添加列的方法吗?

SonarScanner - 4.6.1.2450 Scala - 2.12 sbt - 1.4.6
     val tempDf = slimDf.withColumn("AAA", concat($"post_visid", $"post_visid")).drop("post_visid").drop("post_visid")
          .withColumnRenamed("aaa", "VST_SEQ_NUM")
          .withColumnRenamed("bbb", "PGVW_SEQ_NUM")
          .withColumn("ddd", to_date($"date_time"))
          .withColumn("ccc", date_format($"date_time", "HH:mm:ss"))
          .withColumn("eee", truncateStringUDF($"evar60", lit(255)))
          .withColumnRenamed("fff", "PAGE_EVT_ID")
          .withColumn("ggg", when($"hhh" === 0 || $"hhh" === 70, true).otherwise(false))
          .withColumn("iii", truncateStringUDF($"page_event_var1", lit(1000)))
          .withColumn("jjj", truncateStringUDF($"page_event_var2", lit(1000)))
          .withColumn("kkk", truncateStringUDF($"post_prop11", lit(255)))
          .withColumn("lll", truncateStringUDF($"exclude_hit", lit(255)))
          .withColumn("mmm", truncateStringUDF($"post_prop9", lit(1000)))
          .withColumn("FRST4", when($"daily_visitor" === 0, "N").otherwise("Y")).drop("daily_visitor")
          .withColumn("FRST3", when($"hourly_visitor" === 0, "N").otherwise("Y")).drop("hourly_visitor")
          .withColumn("FRST1", when($"weekly_visitor" === 0, "N").otherwise("Y")).drop("weekly_visitor")
          .withColumn("FRST2", when($"monthly_visitor" === 0, "N").otherwise("Y")).drop("monthly_visitor")
          .withColumn("FRST_QTRLY_VST_IND", when($"quarterly_visitor" === 0, "N").otherwise("Y")).drop("quarterly_visitor")

与此类似,总共有 160 个带列,将总共 160 列添加到数据框

【问题讨论】:

请通过编辑您的问题分享任何相关代码 - instead of a screenshot。如果您的代码没有以可复制的形式出现,那么很少有人会重现您的问题。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

Scala 解析器通常假定代码由小块组成,它不太适合其他程序发出的代码,或者通常仅适用于嵌套极深的代码。特别是,无论是 Scala 编译器本身,还是 Scalameta 的解析器,在面对嵌套极深的术语时,似乎都不是堆栈安全的。

例如,以下更简单的示例使scalasonar-scanner(依赖于scalameta)崩溃:

object Foo 
  def main(args: Array[String]): Unit = 
    val y = "foo"
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      // repeat .trim() ~250 times

    println(y)

  

只需将巨大的表达式大致切成两半,并引入一个额外的变量:

object Foo 
  def main(args: Array[String]): Unit = 
    val x = "foo"
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      .trim()
      // repeat .trim() ~100 times

   val y = x
     .trim()
     // repeat .trim() ~100 more times

   println(y)

  

这适用于scala-interpreter 和sonar-scanner 的最新版本。

【讨论】:

我会试试这个并告诉你,谢谢

以上是关于通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Jenkins 上配置 SonarQube

持续集成Jenkins+sonarqube部署教程

持续集成Jenkins+sonarqube部署教程

即使在 Jenkins 构建上禁用了浅层,SonarQube 也会发出浅层克隆警告

是否有任何 Maven 命令可以在 Jenkins shell 上运行来分析 SonarQube 中的打字稿代码?

如何将每个 Jenkins 构建链接到它自己的 SonarQube 分析版本?