Spark通过jdbc性能调优--采用分区的方式从oracle读数据

这篇具有很好参考价值的文章主要介绍了Spark通过jdbc性能调优--采用分区的方式从oracle读数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spark通过jdbc读取Oracle,当数据量很大的时候会出现两个问题:

  1. 读取数据异常缓慢,甚至卡死
  2. 大表中进行操作也会出现OOM的问题

调优

常规的读取数据库的方式如下

ods_bdz = spark.read.format(“jdbc”)
.option(“url”, “jdbc:oracle:thin:@”+dbstring)
.option(“dbtable”, “ODS_BDZ”)
.option(“user”, dbuser)
.option(“password”, dbpasswd)
.load()

常规jdbc读取表的时候只有一个分区在执行,也就是只有一个excutor在工作,没有把spark并行操作的特性发挥出来
通过查阅sparksql官方文档,查阅到如下的jdbc操作数据库的连接属性

属性名 含义
url 需要连接的JDBC URL
dbtable 需要读取的JDBC表。注意,任何可以填在SQL的where子句中的东西,都可以填在这里。(既可以填完整的表名,也可填括号括起来的子查询语句)
driver JDBC driver的类名。这个类必须在master和worker节点上都可用,这样各个节点才能将driver注册到JDBC的子系统中。
partitionColumn, lowerBound, upperBound, numPartitions 这几个选项,如果指定其中一个,则必须全部指定。他们描述了多个worker如何并行的读入数据,并将表分区。partitionColumn必须是所查询的表中的一个数值字段。注意,lowerBound和upperBound只是用于决定分区跨度的,而不是过滤表中的行。因此,表中所有的行都会被分区然后返回。
fetchSize JDBC fetch size,决定每次获取多少行数据。在JDBC驱动上设成较小的值有利于性能优化(如,Oracle上设为10)

所以我们可以采取上表中所示的分区读表的方式来优化这个问题

  1. 当有数值字段的时候
    这种情况是最好进行处理的,直接按数值字段分区处理即可。在此需要增加四个属性:numPartitions,partitionColumn,lowerBound,upperBound。
    读数代码如下:
ods_bdz = spark.read.format(“jdbc”)
.option(“url”, “jdbc:oracle:thin:@”+dbstring)
.option(“dbtable”, “ods_bdz”)
.option(“user”, dbuser)
.option(“password”, dbpasswd)
.option(“numPartitions”, 20)
.option(“partitionColumn”, “part_num”)
.option(“lowerBound”, 1)
.option(“upperBound”, 20)
.load()

因为分区数是20,所以在oracle数据里面就会生成20条SQL,每条sql又一个excutor取读取。从未实现了分区读取的优化目的:

Select * from ods_bdz where part_num<2;
Select * from ods_bdz where part_num<3 and part_num>=2;
Select * from ods_bdz where part_num<4 and part_num>=3;
……
Select * from ods_bdz where part_num>=20;

  1. 没有数值字段的时候,采用ROWID自定义分区键
ods_bdz = spark.read.format(“jdbc”)
.option(“url”, “jdbc:oracle:thin:@”+dbstring)
.option(“dbtable”,(SELECT MOD(ASCII(SUBSTR(ROWID,-1)),20) RN,A.* FROM tab A))
.option(“user”, dbuser)
.option(“password”, dbpasswd)
.option(“numPartitions”, 20)
.option(“partitionColumn”, “RN”)
.option(“lowerBound”, 0)
.option(“upperBound”, 20)
.load()

采用ROWID的最后一位的ASCII码对20进行取模,得到的模是0-19之间的,这样就可以将这个值作为分区键,每条数据记录将会划分到固定的分区。文章来源地址https://www.toymoban.com/news/detail-413010.html

到了这里,关于Spark通过jdbc性能调优--采用分区的方式从oracle读数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark on Yarn 最佳运行参数调优-计算方式_spark on yarn 调优 nodemanager

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新软件测试全套学习资料》

    2024年04月26日
    浏览(34)
  • 【spark床头书系列】SparkSQL性能调优官网权威资料

    SparkSQL性能调优官网权威资料点击这里也可看全文 对于某些工作负载,可以通过将数据缓存在内存中或打开一些实验选项来提高性能。 Spark SQL可以 使用内存中的列式格式缓存表格 ,通过调用 spark.catalog.cacheTable(\\\"tableName\\\") 或 dataFrame.cache() 方法。然后,Spark SQL将只扫描所需的列

    2024年01月20日
    浏览(30)
  • Spark-SQL连接JDBC的方式及代码写法

    提示:文章内容仅供参考! 目录 一、数据加载与保存 通用方式: 加载数据: 保存数据: 二、Parquet 加载数据: 保存数据: 三、JSON 四、CSV  五、MySQL SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的

    2024年02月13日
    浏览(24)
  • 【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库

    🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长! 没有找到合适的参考链接,在gpt的协作下一步完成了这份指南。欢迎交流 ~ 在Python项目中,如果你的目标是通过JDBC连接到位于Linux远程服务器上

    2024年04月28日
    浏览(41)
  • 通过matlab能提取体育视频中的运动员,采用互动方式动态提示人员信息

    目录 一、理论基础 二、核心程序 三、仿真结论 在MATLAB中生成Flash互动视频并结合XML文件,需要以下步骤: 创建Flash动画: 使用Adobe Animate(前身为Flash Professional)创建Flash动画。设计互动元素、动画效果等,并将其导出为SWF(Shockwave Flash)文件。 生成XML文件: 创建一个

    2024年02月03日
    浏览(25)
  • Spark2.X通过SparkSession读取JDBC数据时遇到Janino库的版本不兼容的错误 org/codehaus/janino/InternalCompilerException

    通过Springboot + Mybatis-plus框架,通过实体类+ Mapper和配置SQL语句的方式读取数据后传递给Spark进行数据分析,一直没有出现问题。 后来需求的不断变化,特别是进行数据分析的时候。数据库的要分析的表字段不断变化,测试表与真实线上表结构也不一样,主要是在字段上。表名

    2024年01月18日
    浏览(54)
  • spark通过connector的方式读写starrocks

    1,添加maven依赖   然后在resources下面加上这个包  上面的包可以在下面git里的resource里下载 参考官方github demo/SparkDemo/src/main/resources at master · StarRocks/demo · GitHub 2,导入官方github里的sparkdemo下的文件到自己的目录下,如下 代码链接demo/SparkDemo/src/main/scala/com/starrocks at master ·

    2024年02月16日
    浏览(70)
  • Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息

    使用 Kafka client 版本 3.4.0 目前的默认分区策略如下: NOTE this partitioner is deprecated and shouldn\\\'t be used. To use default partitioning logic remove partitioner. class configuration setting. See KIP-794 for more info. The default partitioning strategy: If a partition is specified in the record, use it If no partition is specified but a k

    2024年04月17日
    浏览(16)
  • Spark九:Spark调优之Shuffle调优

    map端和reduce端缓存大小设置,reduce端重试次数和等待时间间隔,以及bypass设置 学习资料:https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中

    2024年01月20日
    浏览(31)
  • 采用seatunnel提交Flink和Spark任务

    seatunnel 是一个非常易用,高性能、支持实时流式和离线批处理的海量数据处理产品,架构于Apache Spark 和 Apache Flink之上。 seatunnel 让Spark和Flink的使用更简单,更高效。 注:当前版本用的是2.1.3版本  如果在github下载自己编译有问题 可在此地址下载编译好的文件seatunnel-2.1.3-b

    2024年02月15日
    浏览(38)