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优化,多线程提交任务,提升效率 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后

随机推荐

  • 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