热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SparkJDBC系列读取优化

本文旨在介绍Spark通过JDBC读取数据时常用的一些优化手段关于数据库索引无论使用哪种JDBCAPI,spark拉取数据最终都是以select语句来执行的,所以在自定义分区条件或

本文旨在介绍 Spark 通过JDBC读取数据时常用的一些优化手段

关于数据库索引

无论使用哪种JDBC API,spark拉取数据最终都是以select语句来执行的,所以在自定义分区条件或者指定的long型column时,都需要结合表的索引来综合考虑,才能以更高性能并发读取数据库数据。

API的使用可以参考文档:Spark JDBC系列–取数的四种方式

离散型的分区字段

当使用spark拉取table_example表的数据时,使用的分区字段,并不是连续或均匀分布的。这时如果简单的按预期的numPartitions做均分,则会造成数据倾斜,读取性能也会受到影响。

ID离散型例举

背景

一般情况下,表的ID字段,都会设置成自增,即使 step!=1,也是均匀分布的的。但是当数据积累到一定程度,需要进行分库分表时,多个实例中ID的唯一性就需要借助分库分表中间件,使用如snowflake之类的全局唯一编号,来生成全局唯一ID了,此时必定会出现一定程度的ID离散。

入参

min_id:1,max_id:1000000,数据集中在:1~500,10000~20000,100000~400000 。。。即存在多段不均匀分布

普通处理方式

sqlContext.read.jdbc(url,tableName, "id", 1, 1000000,400,prop)

此方式的分区where查询条件,会存在很多的无用查询(返回了空结果),划分的task为400,但实际有效的可能只有200个,且数据还可能存在一定程度的倾斜,对后续的计算产生影响。

自定义处理方式

def getPredicates = { //1.获取表total数据。
//2.按numPartitions均分,获得offset,可以确保每个分片的数据一致
//3.获取每个分片内的最大最小ID,组装成条件数组

。。。实现细节省略
}
sqlContext.read.jdbc(url,table, getPredicates,connectionProperties)

通过自由组装方式,可以达到精确控制,但是实现成本较高。

ID取模方式

sqlContext.read.jdbc(url,tableName, "id%200", 1, 1000000,400,prop)

根据numPartitions确定合理的模值,可以尽量做到数据的连续,且写法简单,但是由于在ID字段上使用了函数计算,所以索引将失效,此时需要配合其他包含索引的where条件加以辅助,才能使查询性能最大化。

原理:

API中的columnName其实只会作为where条件进行简单的拼接,所以数据库中支持的语法,都可以使用。tableName的原理也一样,仅会作为from 后的内容进行拼接,所以也可以写一个子句传入tableName中,但依然要在保证性能的前提下。

结语

不仅仅是取模操作,数据库语法支持的任何函数,都可以在API中传入使用,关键在于性能是否达到预期。


推荐阅读
  • 一、使用ContentProvider(内容提供者)共享数据ContentProvider在android中的作用是对外共享数据,也就是说 ... [详细]
  • insert into select 主键自增_为什么 MySQL 的自增主键不单调也不连续
    为什么这么设计(Why’sTHEDesign)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问 ... [详细]
  • 在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉, ... [详细]
  • lazarus使用sqlite3遇到特定字符时出现乱码的Bug
    lazarus使用zeosDB控件时发现SQLite一个奇怪的现象,应用程序编译为win64时,如果输入中国2022中国时出现乱码,win32和linux64正常,开始怀疑的sql ... [详细]
  • 在写每日签到的时候,我居然使用的是本地时间被项目经理笑哭了。。。。,如果你在写单机游戏,没有游戏服务器,但又不想使用本地时间,就可以采用下面方法.方法总结:     1.使用 ... [详细]
  • 外层|条件下_MySQL还能这样玩第五篇之视图应该这样玩
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL还能这样玩---第五篇之视图应该这样玩相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • DDOSDDOS的中文名叫分布式拒绝服务***,俗称洪水***DDoS***概念DoS的***方式有很多种,最基本的DoS***就是利用合理的服务请求来 ... [详细]
  • Linux下安装grafana并且添加influxdb监控的方法
    这篇文章主要介绍了Linux下安装grafana并且添加influxdb监控的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值, ... [详细]
  • 接口自动化相关面试题
    你好,我是懂Java的测试最近辅导简历,有同学向我反馈,自学过接口自动化、没有落地接口自动化项目办?还有很多同学落地实践过自 ... [详细]
  • 开发笔记:Xunit测试使用个人小结
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Xunit测试使用个人小结相关的知识,希望对你有一定的参考价值。因工作中用到xunit测试,故总结下用法,以供个人参考使 ... [详细]
  • 故障申报系统php源码,运维不再专业救火 不会PHP照样找出代码性能问题
    作者:凉白开网站:www.ttlsa.com身处互联网的SA(运维)们总感叹自己职业的苦逼,Why?我来告诉你:APP奔溃、 ... [详细]
  • Spark 贝叶斯分类算法
    一、贝叶斯定理数学基础我们都知道条件概率的数学公式形式为即B发生的条件下A发生的概率等于A和B同时发生的概率除以B发生的概率。根据此公式变换,得到贝叶斯公式:即贝叶斯定律是关于随机 ... [详细]
  • 一、在androidStudio中实现tabs比较简单,新建项目就可以选择tabs模板进行创建,默认实现tabs功能:直接运行项目就可以看到效果:可以说非常简单,但是我们在实际开发 ... [详细]
  • 动力节点数据库mysql_动力节点最新MySQL数据库视频教程
    │037-where后面嵌套子查询.avi│038-from后面嵌套子查询.avi│039-select后面嵌套子查询.avi│040-union的用法.avi│041-limit ... [详细]
author-avatar
全哥-广州仔1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有