写点什么

TiSpark 在 DATABUS 中的应用

  • 2019-09-27
  • 本文字数:3405 字

    阅读完需:约 11 分钟

TiSpark在DATABUS中的应用

1 引言

在 2019 年 2 月 21 号发布的《DATABUS-数据孤岛解决方案》(点击跳转)文章中,就有提到 TiSpark。在 Databus 项目中,为了打通散落在公司内部的业务数据,解决数据孤岛,一个重要的功能是将指定数据库表快速准确导入目的地数据源中。目前 Databus 支持以 T+1 方式,天级别、小时级别配置全量,增量任务,从指定数据源导入目的地数据源中。其中在将业务数据导入到数据仓库的过程中,TiSpark 起到了重要的作用。

2 介绍

首先什么是 TiSpark?在介绍 Tispark 之前需要简单介绍下 TiDB 的整体架构,因为 TiSpark 是基于 TIDB 与 TIKV 的。TiDB 是一款定位于在线事务处理/在线分析处理(HTAP)的融合型数据库产品,具有易水平伸缩,强一致性的多副本数据安全,分布式事务,实时 OLAP 等重要特性。TIDB 的整体架构如下所示。


2.1 TiDB Server

Tispark 深度整合了 Spark Catalys 引擎。它可以对计算的精确控制,可以高效的从 TIKV 读取数据.它还支持索引查找,这样大大提高了查询的性能。它通过计算下推策略将一部分计算任务移交给 TIKV,减少 Spark SQL 需要处理的数据量,这样加快了查询的效率。它还使用 TiDB 内置的统计信息来优化查询计划。

2.2 Placement Driver

Placement Driver(简称 PD)是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。

2.3 TiKV Serve

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。

2.4 TiSpark

TiSpark 是为了在 TiDB/TiKV 上运行 Spark 程序而产生的,可以用于一些复杂的 OLAP 查询。TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品。它借助 Spark 平台,同时融合 TiKV 分布式集群的优势,和 TiDB 一起为用户一站式解决 HTAP(Hybrid Transactional/Analytical Processing)需求。



TiSpark 整体架构


TiSpark 深度整合了 Spark Catalys 引擎。它可以对计算的精确控制,可以高效的从 TIKV 读取数据。它还支持索引查找,这样大大提高了查询的性能。


它通过计算下推策略将一部分计算任务移交给 TIKV,减少 Spark SQL 需要处理的数据量,这样加快了查询的效率。它还使用 TiDB 内置的统计信息来优化查询计划。


从数据集成的角度来看,TiSpark+TiDB 提供了一站式的解决方案,可以在同一个平台上直接运行事务和分析,而无需构建和维护任何 ETL,这样简化了系统架构,降低了维护成本。


此外,还可以利用 Spark 生态系统中的工具来对 TiDB 进行进一步的数据处理和分析。例如,使用 TiSpark 进行数据分析和 ETL;从 TiKV 中检索数据作为机器学习数据源;从调度系统生成报告等等。

3 实践

Databus 对于 TIDB 的使用如下图所示。TiSpark 主要用来将业务数据以 T+1 的方式同步到 Hive 数据仓库。



运行环境:Jdk1.8、Spark2.3.2、Spark 部署模式 Yarn


TiSaprk 部署采用外接 jar 包的方式,因此在已有的 Spark 集群部署 TiSpark 的方式很简单,只需将 Tispark 的 jar 包放到 spark 的 jars 路径,并修改 spark-defaults.conf 配置文件即可。

3.1 关键配置

spark.sql.extensions   org.apache.spark.sql.TiExtensionsspark.tispark.pd.addresses  127.0.0.1:2379spark.tispark.db_prefix  tidb_ spark.tispark.request.command.priority  Normal
复制代码


spark.sql.extensions org.apache.spark.sql.TiExtensions 该配置必须存在表示 Spark 引入 Tispark 扩展。


spark.tispark.pd.addresses,该配置为 Placement Driver 集群的地址,Spark driver 会与 Placement Driver 进行通信,获得要查询的数据的在对应 TIKV 结点的具体地址。


spark.tispark.db_prefix,该配置可以在 TiDB 中所有数据库上加上额外数据库前缀,如 databus 数据库在利用 TiSpark 查询时应该查询的数据库名为 tidb_databus,这样可以简单区分源数据库来自 TIDB。


spark.tispark.request.command.priority Tispark 查询的优先级,可选为"Low", “Normal”, “High"通过设置优先级可以影响 Tispark 获取的 TIKV 资源,默认的优先级级别为"Low”,这样是为了避免 Tispark 影响 OLTP 的工作负担,在 Databus 项目中,目前 TIDB 的 OLTP 的查询量较少,而 TiSpark 在每天凌晨有大量的数据同步任务,因此将优先级设为"Normal"。

3.2 数据同步效率提升

在引入 Tispark 之后数据同步的效率大大提升,将 TiSpark 分别与 Spark sql、Sqoop 进行对比,选取多个数据量不同的表来进行测试,分别用 Tispark、Spark sql、Sqoop 将数据同步到 hive 中,实验效果如下图所示。



由实验可得 TiSaprk 数据同步效率有显著的优势,平均单位数据量 Tispark 同步速率是 Spark Sql 的四分倍左右,为 Sqoop15 倍左右。

3.3 优化数据同步流程

在 Spark sql 同步数据时存在着一些问题,例如对于个别数据量比较大的业务数据表,有着主键非递增不连续、分布不均匀的情况。为了提高 spark sql 的数据同步性能,执行任务之前会指定 partitionColumn(通常为业务表的主键或者其他数值类型的字段)、lowerBound、upperBound。那么分布不均匀的主键会导致 spark 不同 partition 的数据量差距很大,对于数据量大的 partition 则可能会出现 OOM 的情况。


除此之外,spark sql 在执行任务之前需要指定 spark.executor.memory 的大小,目前只能根据业务数据库元数据存储的数据量大小,并考虑到将数据读到 Java 内存中会有一定的增大来进行预估,来调整 spark 任务需要的资源,这样存在着资源浪费的情况。


而引入 Tispark 之后可以很好的解决这些之前存在的问题。当数据量较大时,存储在 TIKV 的数据会被分成多个 Region,切分的方式是按照 key range 进行排序并划分,每一个 key range 对应一个 Region。相邻的两个 Regiona 不会出现空洞,前面一个 Region 的 start key 是下一个 Region 的 end key。Region 会有一定的大小限制,当超过阀值后,一个大的 Region 会分裂成小的 Region,相反,数据量很小的两个相邻 Region 也会合并生成一个大的 Region。



TIKV 查询数据时,首先会跟 PD 进行通信,从 PD 的 Region 路由表获 Region 的具体信息,比如 Region 有多少副本,leader 副本存储在哪个 TIKV 结点上。Tispark 可以根据不同的 TIKV 结点切分多个 Spark partition 并行读取,Spark 分区数据量比较均匀。

3.4 提高数据同步稳定性

利用 TIDB 的周边工具 Syncer 利用主从同步可以将 mysql 数据实时、增量同步到 TIDB 中,TiSpark 则可以直接从 TIKV 读取数据。


众所周知,无论是 Spark sql 还是 Sqoop 来同步数据都需要通过大量的 JDBC 连接 mysql 从库,对业务数据库会造成一定的压力,若从库不可用则同步数据任务将会失败。


在 TIDB 架构中数据在 TIKV 中以 Region 为单位,被分散在集群中所有的节点上,并且尽量保证每个节点上服务的 Region 数量差不多,并且以 Region 为单位做 Raft 的复制和成员管理,这样一方面实现了存储容量的水平扩展(增加新的节点后,会自动将其他节点上的 Region 调度过来),另一方面也实现了负载均衡(不会出现某个节点有很多数据,其他节点上没什么数据的情况)。


除此之外的好处是具有一定的容灾能力,一个节点挂掉之后,数据在其他节点依旧存在,可以继续提供服务。


4 总结与展望

在 Databus 项目中,TiDB 与 TiSpark 起到了至关重要的作用,目前 Tispark 主要用来定时的同步数据,在 Databus 的未来规划中,会利用 Tispark 提供一定的数据分析功能,这样的一个好处是不需要再把数据同步到数据分析平台,不需要 ETL 过程,上游业务 OLTP 的数据通过 TiDB 实时写入,并且可以利用 TiSpark 的 OLAP 能力实时分析,可以实时的查询最新的业务数据,满足一部分用户查询需求。


作者介绍:


沸羊羊(企业代号名),目前负责实时数据流平台以及大数据工具链组件研发相关工作。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/RYZEMH3SKCyP_CqgbSVq9w


2019-09-27 13:041153

评论

发布
暂无评论
发现更多内容

Cassandra Gossip协议的二三事儿

华为云开发者联盟

源码 三次握手 开发者 Cassandra Gossip协议

LeetCode题解:155. 最小栈,单个栈存储入栈元素与最小值之差,JavaScript,详细注释

Lee Chen

大前端 LeetCode

关于显性知识和隐性知识

Tanmer

知识管理 知识产权

融云Geek Online 2020 编程挑战赛重磅来袭

InfoQ_967a83c6d0d7

凡泰极客与Rancher达成深度战略合作,加速企业构建私有化小程序生态

FinClip

区块链助力军事人力资源配置

CECBC

区块链 军事

1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知

YourBatman

Hibernate-Validator Bean Validation 数据校验 JSR380

话题讨论 | 当你敲代码累了时,一般喜欢吃点什么补充能量?

InfoQ写作社区官方

加班 写作平台 代码 话题讨论

案例分享丨红外自动感应门设计与实现详解

华为云开发者联盟

物联网 传感器 感应探测器 SMT32处理器 感应门

从 Node.js(JavaScript) 到 Golang,我的开发体验

Garfield

node.js Go 语言

某程序员毕业进UC,被阿里收购!跳去优酷土豆,又被阿里收购!再跳去饿了么,还被阿里收购!难道阿里想收购的是他?

程序员生活志

职场 阿里

读懂k8s 容器编排控制器 Deployment

Garfield

k8s pod k8s入门

数字资产钱包开发,数字加密货币app搭建

13530558032

挽救你的视频号:能够把PPT转换成视频,把备注转换成语音的开源项目

陈磊@Criss

Spring Bean处理器

语霖

Spring Framework

3种双集群系统方案设计模式详解

华为云开发者联盟

数据库 数据仓库 数据 双集群系统 双ETL模式

你问我答:现有的应用有必要做微服务改造吗?

BoCloud博云

容器 DevOps 微服务 云平台 博云

云原生如何来进行HTTPS升级

soolaugust

架构 云原生 设计模式

人的转型才是关键 数字化时代你具备数字领导力么

CECBC

区块链 数字化时代

云算力挖矿平台APP,算力挖矿建设开发

13530558032

深圳泰利能源有限公司涉嫌传销 共计2.7亿元

CECBC

区块链 基金

MAC系统初始化

焦振清

macos 重装系统

SpreadJS 纯前端表格控件应用案例:MHT-CP数据填报采集平台

葡萄城技术团队

技术分享:即构互动白板音视频同步、多端有序协作技术实践

ZEGO即构

音视频 在线教育 SVG

XSKY对象存储获全球备份领域领导者Commvault官方认证

XSKY星辰天合

anyRTC Native 4.1.0.1与Web SDK 4.0.11上线

anyRTC开发者

学习 WebRTC 语音 直播 sdk

SpreadJS 纯前端表格控件应用案例:雨诺订单管理系统(雨诺OMS)

葡萄城技术团队

数字货币交易平台源码,数字货币交易所开发核心功能

13530558032

C语言内存泄露很严重,如何应对?

华为云开发者联盟

c 内存泄露 内存 代码 函数

华为云FusionInsight大数据技术普惠创新,释放千行百业数据价值

数据湖洞见

大数据 FusionInsight 华为云

区块链支付新模式开发,USDT支付系统搭建

13530558032

TiSpark在DATABUS中的应用_文化 & 方法_沸羊羊_InfoQ精选文章