Spark优化,多线程提交任务,提升效率

2023-10-27

优化背景:

for循环提交4次任务,会触发4个Job,由于Driver的单线程运行及Spark的任务调度决定了4个Job是串行执行,但这个4个任务是无关的,可以并行执行。

优化思路

通过线程池并行提交Job,Driver端不卡顿。

具体实现

val listBuffer = new ListBuffer[Future[String]]
    val service: ExecutorService = Executors.newFixedThreadPool(4)
    for (i <- 0 to 3) {
      val task: Future[String] = service.submit(new Callable[String] {
        override def call(): String = {
          println(s"第${i}个任务。。。。。。。。。。。。。。。。")
          val k = i
          reRunDF
            .withColumn(fieldStockAttributeId, lit(k))
            .createOrReplaceTempView(s"${OverseasDetailQuantityReport.tblWwarehouseStorageRecord}_$k")

          val resFrame = spark.sql(OverseasDetailQuantityReport.sqlMain(k))
          resFrame.show()

          writeStarRocks(resFrame, OverseasDetailQuantityReport.tblDetailQuantity, dbInfo)
          writeToKafka(resFrame, OverseasDetailQuantityReport.tblDetailQuantity)
          println(s"第${i}个任务。。。。。。。。。。。。。。。。结束")
          "success"
        }
      })

      listBuffer.append(task)
    }

    //遍历获取结果
    listBuffer.foreach(result=>{
      println(result.get())
    })

    service.shutdown()

效果

优化前 : 5分钟
在这里插入图片描述

优化后:44秒
在这里插入图片描述

关键点

1,要用callable,不能用runnable,runnable没有返回值,无法阻塞driver,不阻塞driver导致driver线程马上结束,应用终止。callable有返回值,可以通过获取返回值阻塞Driver,应用能正常运行。阻塞代码如下:

//遍历获取结果
    listBuffer.foreach(result=>{
      println(result.get())
    })

2,使用了for循环,createOrReplaceTempView时临时表名必须是动态的,否则循环注册的临时表名相同,导致后续计算从同一张表中获取。

.createOrReplaceTempView(s"${OverseasDetailQuantityReport.tblWwarehouseStorageRecord}")

需改为动态临时表名:

.createOrReplaceTempView(s"${OverseasDetailQuantityReport.tblWwarehouseStorageRecord}_$k")

3,集群必须要有足够的资源,且提交任务时要申请足够的资源,否则调度系统仍然会让Job排队执行

/usr/local/service/spark/bin/spark-submit --master yarn --jars ./jars/guava-29.0-jre.jar --conf "spark.executor.extraClassPath=guava-29.0-jre.jar"   --num-executors 6 --executor-cores 2 --executor-memory 4g --class com.quantity.OverseasDentityReportApp /home/hadoop/cter/finbatch-1.0.jar daily
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark优化,多线程提交任务,提升效率 的相关文章

  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • Canvas 移动缩放点击交互设计

    Canvas 地铁类线路绘制设计过程的记录 最近有个地铁类项目H5的 但是如果是一般的单线 网上随便一个项目都能做 可能还实现的效果会更好 可惜 是双向线 这就有点难度了 领导让两天时间加周六日弄一个效果出来 这就百度了一番 没有找到双向的
  • ModuleNotFoundError: No module named ‘distutils.util‘

    Ubuntu 16 04 上使用 ppa 源安装了 python3 8 之后安装 pip 时 python3 8 get pip py 出现这个问题 解决办法 sudo apt get install python3 8 distutils
  • vscode Downloading package ‘C/C++ language components (Windows)‘ Failed.问题解决

    vscode打开项目后无法使用代码跳转等功能 然后提示一堆错误 Downloading package C C language components Windows Failed Retrying Failed Retrying 下载错误
  • DoTween的部分方法解析

    DoTween的各种使用方法有点多 本人只试用了几种比较常用的 后续项目中如果需要用到更多再补吧 详细内容上官网看http dotween demigiant com documentation php using System Colle
  • mbed开发板STM32L476RG回传上位机数据程序

    用途 测试上位机串口发送的数据是否符合要求 如数据位 奇偶校验 终止位等 实物图 红圈为与上位机连接的串口 供电口 Code 使用mbed在线编译平台 选择设备为STM32L476RG include mbed h include plat
  • 网络安全_密码学实验_非对称加密算法RSA

    网络安全 密码学实验 非对称加密算法RSA 一 实验环境 二 非对称加密RSA 1 理解RSA算法原理 2 加密过程 解密过程 一 实验环境 PyCharm 2019 2 4 Professional Edition Python 3 7
  • 关于logisticregression.fit()报错str‘ object has no attribute ‘decode‘的解决

    先上图 这是听的课里的运行代码之后的效果图 然后代码也是源码 但是在我的机器上一直报错 报错提示 str object has no attribute decode 错误的位置是在logisticregression fit 这里 我上网
  • c++多线程中的利器-thread_local

    我们在这里简单介绍一下在c 11中新添加的 thread local 我们在介绍thread local之间首先需要说明一下什么是线程周期 以及什么情况下的变量可以被声明为thread local相等与将一个可变数据 一 什么是thread
  • 类对象、实例对象、isa指针

    文章目录 实例对象 类对象 Class 元类对象 Metaclass 关于isa指针 isa概述 实例对象的isa指针指向类对象 类对象的isa指针指向元类 元类对象的isa指向根元类 举例 推荐阅读 在iOS开发中可能会遇到这样的问题 什
  • update 批量修改数据

    update 批量修改数据 更新同一张的数据表 将父ID赋值为对应的ID 根据父编码等于部门编码 update dept2 set parentdeptId dept1 ID from BO BY HR CREATE DEPT dept1
  • SQL注入-布尔盲注

    页面没有显示位 没有报错信息 只有成功和不成功两种情况时 可以使用布尔盲注 本次以 SQLi LABS 第9关为案例进行讲解 布尔盲注常用的两个函数 我觉得 length abc 判断字符串长度 substr abc 1 1 截取字符串 从
  • 一个编译器的实现0

    前一阵做了个编译器 仅词法分析 语法分析 部分语义分析 所以说是前端 拿来分享一下 如有错误 欢迎批评指教 整个代码库具有如下功能 提供编译器所需基础数据结构 计算流程框架类 可供继承使用 提供基础数据结构的可视化控件 提供类似YACC的词
  • iOS崩溃日志搜集

    iOS崩溃日志搜集 开发一款APP用户体验可能显得非常重要 想想要是一款APP老是闪退 bug层出不穷 那得多难受 用户肯定会直接卸载掉的 那么为了开发出更加健壮的程序 我们大致有以下方法 充分考虑系统版本之间的差异 codeReview
  • Linux账号及权限管理

    目录 1账号和组账号概述 1 1 用户账号 1 2 组账号 1 3 UID与GID 2 用户账号 2 1 etc passwd 2 1 etc shawod 2 3 添加用户 useradd 2 4 为用户账号设置密码 passwd 2 5
  • 学生用灯用什么光的好?色温4000K暖黄光的学生台灯分享

    暖黄光的护眼台灯最好 学生最重要的是成长过程中 保护好视力 在学习用灯时 选择色温4000K的暖黄光是最好的 色温4000K 犹如早晨十点的太阳光 是人眼直射也不会觉得刺眼的色温 给人一种舒适的感觉 推荐几款好用的学生护眼灯 TOP1 南卡
  • spring源码学习:容器与 bean(二)BeanFactory

    前面我们大概知道了 我们调起springboot调的是一个ApplicationContext 那这个ApplicationContext 接口 是 BeanFactory 的子接口 相当于BeanFactory自己定义了一些接触的 但是呢
  • Java接口通过token登录实现页面跳转到登录成功后的页面

    方式一 自动化测 token 免登录页面跳转 https blog csdn net qq 27361727 article details 89710738 方式二 首先 你需要在接口请求中将token作为参数传递给后端 后端需要对tok
  • Gitlab设置中文

    1 打开设置 2 选择首选项Preferences 3 下滑选择本地化选项Localization 设置简体中文 然后保存更改save changes 刷新网页即可
  • AFX_MANAGE_STATE(AfxGetStaticModuleState()) 作用

    AFX MANAGE STATE AfxGetStaticModuleState AFX MANAGE STATE AfxGetStaticModuleState 用于模块切换时的状态保护 1 AfxGetStaticModuleState
  • Spark优化,多线程提交任务,提升效率

    优化背景 for循环提交4次任务 会触发4个Job 由于Driver的单线程运行及Spark的任务调度决定了4个Job是串行执行 但这个4个任务是无关的 可以并行执行 优化思路 通过线程池并行提交Job Driver端不卡顿 具体实现 va