spark scala code demo for def class etc.

本文介绍了一个使用Apache Spark进行大数据处理的应用实例。通过定义特定的数据处理类NF和对象NAnalysis,实现了对枚举列表数据的并行处理。该过程包括初始化SparkContext、数据映射、缓存、收集和打印结果等步骤。

a demo for code reference:


import org.apache.spark.SparkContext
import java.util.HashMap
import org.apache.spark.rdd.RDD

class NF(hv: ClassA) extends Serializable {

  var powerMap: HashMap[String, Integer] = null
  var pf2: HashMap[String, Integer] = null;
  var sheddingMap: HashMap[String, java.lang.Double] = null;

  def nf(str: String): (HashMap[String, Integer]) =
    {
      val retmap = new HashMap[String, Integer]()

      

      retmap
    }

  def shedNf(str: String): (HashMap[String, Object]) =
    {
      val arr = str.split("`")
      val singalMap = new HashMap[String, Array[Int]]()
      val arrstrInt = arr(1).split("&")
      val arrInt: Array[Int] = new Array[Int](arrstrInt.length)
      val shedMap: HashMap[String, Object] = method()
      shedMap
    }

  def indexNf(str: String): (HashMap[String, java.lang.Double]) =
    {
     
     indexMap
    }

}

object NAnalysis {

  def main(args: Array[String]): Unit = {
    val start = System.currentTimeMillis();
    val sc = new SparkContext("spark://ip:7077", "ntest", System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass))
    hv.init(args(0).toInt)
    val enumList = hv.getElementEnumList();
    enumList.size()
    val arr = new Array[String](enumList.size());

    val keyset = enumList.keySet();
    val keyIter = keyset.iterator();
    var i = 0;
    while (keyIter.hasNext()) {
      val strkey = keyIter.next();
      val strvalue = enumList.get(strkey);

      var temp = ""
      for (j <- 0 to strvalue.length - 1) {
        if (j == (strvalue.length - 1)) {
          temp = temp + strvalue(j)
        } else {
          temp = temp + strvalue(j) + "&"
        }
      }
      arr(i) = strkey + "`" + temp
      i = i + 1
    }

    val nf: NF = new NF(hv);
    val dataset1: RDD[(String)] = sc.parallelize(arr, 8);
    dataset1.cache()
    val powerRdd = dataset1;
    val shedRdd = dataset1;
    val indexRddC = dataset1;

   
    val dataset2 = powerRdd.map(nf.nf)
    val powerarr = dataset2.collect();
    val powerMap: HashMap[String, Integer] = new HashMap[String, Integer]();
    for (z <- 0 to (powerarr.size - 1)) {
      powerMap.putAll(powerarr(z))
    }
    
       val powerset=powerMap.keySet();
       val powerIt=powerset.iterator()
       while(powerIt.hasNext())
        {
         val powerkey=powerIt.next()
         val powervalue=powerMap.get(powerkey)
         println("power:\t"+powerkey+"\t"+powervalue)
     }
     val end = System.currentTimeMillis();

    println("total time is:" + (end - start) / 1000)
  }

}


java.lang.NullPointerException at org.apache.spark.sql.execution.SparkPlan.makeCopy(SparkPlan.scala:70) at org.apache.spark.sql.execution.SparkPlan.makeCopy(SparkPlan.scala:47) at org.apache.spark.sql.catalyst.plans.QueryPlan.mapExpressions(QueryPlan.scala:300) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized$lzycompute(QueryPlan.scala:375) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized(QueryPlan.scala:372) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:285) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized$lzycompute(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized(QueryPlan.scala:372) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:285) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized$lzycompute(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized(QueryPlan.scala:372) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:285) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized$lzycompute(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized(QueryPlan.scala:372) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:373) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) at scala.collection.immutable.List.map(List.scala:285) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized$lzycompute(QueryPlan.scala:373) at org.apache.spark.sql.catalyst.plans.QueryPlan.canonicalized(QueryPlan.scala:372) at org.apache.spark.sql.catalyst.plans.QueryPlan.sameResult(QueryPlan.scala:413) at org.apache.spark.sql.execution.ScalarSubquery.semanticEquals(subquery.scala:58) at org.apache.spark.sql.catalyst.expressions.EquivalentExpressions$Expr.equals(EquivalentExpressions.scala:36) at scala.collection.mutable.HashTable$class.elemEquals(HashTable.scala:358) at scala.collection.mutable.HashMap.elemEquals(HashMap.scala:40) at scala.collection.mutable.HashTable$class.scala$collection$mutable$HashTable$$findEntry0(HashTable.scala:136) at scala.collection.mutable.HashTable$class.findEntry(HashTable.scala:132) at scala.collection.mutable.HashMap.findEntry(HashMap.scala:40) at scala.collection.mutable.HashMap.get(HashMap.scala:70) at org.apache.spark.sql.catalyst.expressions.EquivalentExpressions.addExpr(EquivalentExpressions.scala:54) at org.apache.spark.sql.catalyst.expressions.EquivalentExpressions.addExprTree(EquivalentExpressions.scala:96) at org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext$$anonfun$subexpressionElimination$1.apply(CodeGenerator.scala:754) at org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext$$anonfun$subexpressionElimination$1.apply(CodeGenerator.scala:754) at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) at org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext.subexpressionElimination(CodeGenerator.scala:754) at org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext.generateExpressions(CodeGenerator.scala:808) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateUnsafeProjection$.createCode(GenerateUnsafeProjection.scala:309) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateUnsafeProjection$.create(GenerateUnsafeProjection.scala:373) at org.apache.spark.sql.catalyst.expressions.codegen.GenerateUnsafeProjection$.generate(GenerateUnsafeProjection.scala:362) at org.apache.spark.sql.catalyst.expressions.UnsafeProjection$.create(Projection.scala:155) at org.apache.spark.sql.execution.ProjectExec$$anonfun$9.apply(basicPhysicalOperators.scala:74) at org.apache.spark.sql.execution.ProjectExec$$anonfun$9.apply(basicPhysicalOperators.scala:73) at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndexInternal$1$$anonfun$apply$24.apply(RDD.scala:815) at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndexInternal$1$$anonfun$apply$24.apply(RDD.scala:815) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) at org.apache.spark.scheduler.Task.run(Task.scala:108) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
08-30
<think> 我们正在解决Spark作业快完成时遇到的java.lang.NullPointerException错误。根据提供的引用和错误发生的时机(作业快完成时),我们可以从多个角度分析。 首先,根据引用[3]中提到的错误:“ERROR Utils: Uncaught exception in thread shutdown-hook-0 java.lang.NullPointerException”,这通常发生在关闭钩子(shutdown hook)中。关闭钩子是在JVM关闭时执行的一些清理任务,而作业快完成时可能正在触发一些清理操作,从而引发空指针异常。 引用[3]给出了一个快速恢复的配置选项(跳过部分关闭逻辑): --conf spark.executor.extraJavaOptions="-Dspark.executor.cleanupOnShutdown=false" 但需要注意,这可能会带来资源未清理的风险,需要评估。 另外,引用[2]提到了动态分区裁剪(DPP)导致的空指针异常,但该异常发生在Executor端执行任务时(FilterExec),而我们的错误发生在作业快完成时(即关闭阶段),因此可能与引用[2]的情况不同。 然而,我们也不能完全排除其他原因。例如,在作业完成阶段,Spark会进行一些最后的操作,如提交commit、释放资源等,这些过程中也可能出现空指针异常。 结合引用[3]中的总结表格,我们可以从以下几个方面考虑: 1. 资源释放顺序冲突:在关闭过程中,某些资源可能已经被释放,而关闭钩子中又尝试访问这些资源,导致空指针。解决策略是修改源码增加空指针保护,但这通常需要深入Spark内部代码,对于用户来说可能较难。 2. 并发关闭竞态条件:多个关闭钩子同时执行,可能产生竞态条件。解决策略是统一关闭入口,避免手动干预。 3. 依赖版本冲突:如Netty等依赖库的版本不一致。解决策略是升级Spark和Netty至稳定版本。 因此,针对作业快完成时出现的空指针异常,我们建议如下: 步骤1:检查错误堆栈 虽然用户提供了错误描述,但没有具体的堆栈信息。如果能获取完整的堆栈信息,可以更准确地定位问题。例如,如果堆栈中出现“shutdown-hook”字样,则可以确定是关闭钩子问题。 步骤2:尝试使用临时解决方案 如果问题确实在关闭钩子中,可以尝试使用引用[3]中提到的配置: --conf spark.executor.extraJavaOptions="-Dspark.executor.cleanupOnShutdown=false" 注意:这只是一个临时解决方案,可能会带来资源未正确释放的风险,比如临时文件没有删除、网络连接没有关闭等。 步骤3:检查依赖版本 检查Spark版本以及所使用的依赖(如Netty)是否存在已知问题。建议升级到最新稳定版本,因为新版本可能已经修复了该问题。 步骤4:检查代码中是否有自定义关闭钩子 如果用户代码中注册了自定义的关闭钩子,那么需要检查这些钩子中是否存在空指针访问。可以通过在代码中查找`Runtime.getRuntime().addShutdownHook`来定位。 步骤5:查看Spark社区已知问题 搜索Spark JIRA,查看是否有类似的已知问题。例如,在Spark 3.0.0之前,有一个已知问题(SPARK-25111)在关闭钩子中可能抛出空指针异常,该问题在Spark 3.0.0中修复。 如果上述步骤无法解决问题,可能需要收集更详细的日志(例如在启动时加上`--conf spark.logConf=true`来记录配置,以及开启DEBUG日志)并进一步分析。 由于用户提供的引用[1]是关于Streaming读取文件时的空指针,这与当前问题(作业完成阶段)关系不大,因此暂时不作为重点。 综上所述,解决方案如下: 1. 首先,尝试在作业提交时添加配置项跳过清理(临时方案): ```bash spark-submit ... --conf spark.executor.extraJavaOptions="-Dspark.executor.cleanupOnShutdown=false" ``` 2. 升级Spark版本到最新稳定版(如果当前版本较旧)。 3. 检查用户代码中是否添加了自定义的关闭钩子,并确保其健壮性。 4. 如果以上方法无效,则需收集完整的错误堆栈信息,进一步分析。 注意:如果错误堆栈信息中显示的是其他位置(如Executor执行任务时),则可能需要考虑其他原因(如动态分区裁剪问题,即引用[2]的情况),但根据问题描述“作业快完成时”,我们更倾向于关闭阶段的钩子问题。 最后,由于用户没有提供具体的错误堆栈,以上建议是基于常见情况的分析。 相关问题: 1. 如何获取Spark作业的详细错误堆栈信息? 2. Spark作业关闭阶段通常执行哪些操作? 3. 如何避免Spark关闭钩子中的资源释放冲突? </think> ### Spark作业完成时出现`java.lang.NullPointerException`的解决方案 根据引用内容和错误发生的时机(作业即将完成时),问题通常与**资源关闭顺序**或**清理钩子(Shutdown Hook)** 相关。以下是分步解决方案: --- #### **1. 确认错误根源**(需结合堆栈分析) - 若堆栈包含 `shutdown-hook-0`(如引用[3]): ```log ERROR Utils: Uncaught exception in thread shutdown-hook-0 java.lang.NullPointerException ``` 属于**资源释放冲突**:JVM关闭时多个钩子竞争释放资源导致空指针。 - 若堆栈涉及 `FilterExec` 或 `DynamicPruningExpression`(如引用[2]): 属于**动态分区裁剪(DPP)优化缺陷**:查询优化器生成无效执行计划。 --- #### **2. 通用解决方案** ##### ✅ 方案1:跳过冲突的关闭逻辑(临时修复) 在提交作业时添加配置: ```bash spark-submit \ --conf spark.executor.extraJavaOptions="-Dspark.executor.cleanupOnShutdown=false" \ --conf spark.driver.extraJavaOptions="-Dspark.driver.cleanupOnShutdown=false" \ ... ``` > **注意**:此方案跳过部分清理逻辑,可能导致资源未完全释放(如临时文件)。仅建议快速恢复生产任务[^3]。 ##### ✅ 方案2:升级Spark版本 空指针常见于旧版Spark(尤其是3.0以下): - 升级至**Spark 3.3+**(修复了SPARK-25111等关闭钩子问题) - 验证Netty依赖版本兼容性(引用[3]): ```bash lsof -p <Spark_PID> | grep netty # 检查Netty版本冲突 ``` ##### ✅ 方案3:关闭动态分区裁剪(DPP) 若错误涉及 `DynamicPruningExpression`(引用[2]),禁用DPP优化: ```scala spark.conf.set("spark.sql.optimizer.dynamicPartitionPruning.enabled", false) ``` --- #### **3. 深度修复(需代码调整)** ##### 🔧 修复关闭钩子冲突(引用[3]) 修改Spark源码,增加空指针保护: ```scala // 示例:修改Utils.scala中的关闭钩子 def addShutdownHook(hook: Thread) { if (shutdownHooks.add(hook)) { try { Runtime.getRuntime.addShutdownHook(hook) } catch { case _: IllegalStateException => // 忽略JVM已关闭的情况 case e: Exception => logError("Failed to add shutdown hook", e) } } } ``` ##### 🔧 修复DPP逻辑(引用[2]) 在生成动态分区计划时增加空值检查: ```scala // 修改InSubqueryExec.eval方法 override def eval(input: InternalRow): Any = { if (broadcastValues != null && broadcastValues.value != null) { // 空指针保护 broadcastValues.value.contains(value.eval(input)) } else { false } } ``` --- #### **4. 验证数据完整性** 排除输入数据问题(如引用[1][3]): ```bash hdfs dfs -ls /your/input/path # 确认目录存在 hdfs dfs -cat /your/input/path/part-* | head # 检查数据格式 ``` --- #### **总结流程** ```mermaid graph TD A[出现NullPointerException] --> B{检查堆栈} B -->|含shutdown-hook| C[跳过关闭钩子+升级Spark] B -->|含FilterExec/DPP| D[禁用DPP优化+修复源码] B -->|不确定| E[检查HDFS数据+升级Spark] C & D & E --> F[问题解决] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值