Spark提交任务运行报错:Unregistering ApplicationMaster...Promise already completed.

报错日志:

2022-05-23 14:33:05,581 INFO yarn.ApplicationMaster: Unregistering ApplicationMaster with FAILED (diag message: User class threw exception: java.lang.IllegalStateException: Promise already completed.
	at scala.concurrent.Promise.complete(Promise.scala:53)
	at scala.concurrent.Promise.complete$(Promise.scala:52)
	at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:187)
	at scala.concurrent.Promise.success(Promise.scala:86)
	at scala.concurrent.Promise.success$(Promise.scala:86)
	at scala.concurrent.impl.Promise$DefaultPromise.success(Promise.scala:187)
	at org.apache.spark.deploy.yarn.ApplicationMaster.org$apache$spark$deploy$yarn$ApplicationMaster$$sparkContextInitialized(ApplicationMaster.scala:404)
	at org.apache.spark.deploy.yarn.ApplicationMaster$.sparkContextInitialized(ApplicationMaster.scala:895)
	at org.apache.spark.scheduler.cluster.YarnClusterScheduler.postStartHook(YarnClusterScheduler.scala:32)
	at org.apache.spark.SparkContext.<init>(SparkContext.scala:608)
	at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2555)
	at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$1(SparkSession.scala:930)
	at scala.Option.getOrElse(Option.scala:189)
	at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:921)
	at MovieDataAnalysisBySparkRDD$.demand_1_by_sparkSql(Run.scala:153)
	at Run$.main(Run.scala:187)
	at Run.main(Run.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:728)
)

报错原因:一个application 应该只能有一个SparkSession对象或者SparkConext对象。可以将spark或sc在主函数中创建,然后再以参数的形式传递。

object Run {
  def main(args: Array[String]): Unit = {
    // 1 创建上下文环境配置对象
    val conf: SparkConf = new SparkConf()
      .setAppName("movie_data_analysis")
      .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") //替换默认序列化机制
      .registerKryoClasses(Array(classOf[MovieQuota])) //注册使用kryo序列化的自定义类
      .setMaster("yarn")

    // 2 创建SparkSession对象
    val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()
    println("------------字符编码------------")
    println(System.getProperty("file.encoding"))
    MovieDataAnalysisBySparkRDD.demand_1_by_sparkRdd(spark.sparkContext)
    MovieDataAnalysisBySparkRDD.demand_1_by_sparkSql(spark)
    spark.stop()
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在 Vue.js 应用中遇到 "ResizeObserver loop completed with undelivered notifications" 这样的错误时,这通常表示 Vue 的 `ResizeObserver` 已经完成了一次循环,但是还有一些之前注册的观察任务没有得到响应。`ResizeObserver` 是用于监听元素大小变化的现代浏览器 API,Vue 使用它来响应某些组件的布局调整,比如响应式地处理窗口大小变化。 这个错误可能有以下几个原因: 1. **未正确取消观察**:如果你在组件卸载或不再需要观察时没有正确地移除 `ResizeObserver`,可能会导致通知积压。 2. **观察器配置问题**:确保你在使用 `Vue.ResizeObserver` 时没有设置过期时间(timeout)过短,这样可能会使某些观察任务来不及完成就被移除。 3. **循环阻塞**:如果组件内部的计算密集型操作过长,可能导致浏览器的渲染循环被阻塞,影响到 `ResizeObserver` 的执行。 4. **DOM更新延迟**:如果元素的大小改变发生在Vue更新DOM之前,观察者可能无法获取到最新的信息。 要解决这个问题,你可以尝试以下步骤: - **检查代码**:确保在组件卸载时调用了 `resizeObserver.disconnect()` 来停止观察。 - **调整配置**:适当增加 `Vue.ResizeObserver` 的观察者超时时间,但注意不要过大以免影响性能。 - **优化循环**:避免在循环中执行过多计算,特别是对于那些与布局无关的操作。 - **确保及时更新DOM**:如果在计算之前进行DOM操作,考虑使用 `this.$nextTick(() => { ... })`包裹代码。 相关问题: 1. 如何在Vue组件卸载时正确清理ResizeObserver? 2. 如何调整Vue.ResizeObserver的超时时间? 3. 为什么会在Vue的更新循环中执行过多计算导致问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值