TiSpark On Kubernetes 实践
作者: 数据小黑原文来源:https://tidb.net/blog/30f417ad
版权声明 ©
【是否原创】是
【首发渠道】TiDB 社区,转载请注明出处
概述
最近做了一下 TiSpark On Kubernetes 的实践,在开发环境中走通了 TiSpark On Kubernetes 的整个过程。此文介绍测试 TiSpark On Kubernetes 的 step by step 过程。
背景介绍
做此次探索,是源于一次讨论,(详情:https://asktug.com/t/topic/274926/12)。讨论解决方案的过程中 @Kongdom 同学表示,客户资源比较紧张,没有资源搭建独立的 Spark 运行环境。联想到最近遇到的一些项目有一些共同特点:
项目初期资源规划按照应用 + 数据库做了规划,有一些资源比较紧张的项目,都有所谓先跑起来的说法。
需求越提越多,项目经理需求控制的不好,其中一些需求,会给数据库造成较大的压力,基于种种原因,必须要做。
很多的企业系统,晚上是没有访问的,资源闲置。
基于以上情景的总结,诞生了一个想法,如果晚上复用 k8s 的资源跑计算,利用 Spark 的计算能力解决一些 TiDB 计算瓶颈问题,是不是可以解决以上的困局。
在官方的图上稍作修改,架构图如下:
适用读者范围
有现成的 k8s 测试环境和 TiDB 测试环境
有一定的 k8s 运维基础
运算资源比较紧张,有合理利用资源的需求
资源描述
一个 TiDB 集群,只是用来测试,满足最低部署要求就可以, 版本为 5.3.0。
一个 k8s 集群,我的 k8s 集群版本是 v1.18.20
下载 Spark 代码,版本 3.0.3,参考连接:https://github.com/apache/spark/archive/refs/tags/v3.0.3.tar.gz
克隆 https://gitee.com/a-i-c/tisparkonk8sshell.git
关键解释
k8s 地址为 k8s 的 api server 地址如果实在搞不明白,可以直接把 k8s 的第一个 master 地址带入,端口默认 8443
我本机的 java 环境是 java version “1.8.0_251”,spark-2.4.5 on k8s 在此环境下是有问题的,而 TiSpark 集成 Spark3.0.X 环境,我始终未调通,所以运行环境用 spark-3.0.3,编译环境是 spark-2.4.5,镜像也依赖 spark-2.4.5。
实践过程
A. 准备 Spark 运行环境
解压下载的 v3.0.3.tar.gz,并导入 IDEA,克隆 tisparkonk8sshell 项目到 IDEA 中,拷贝 tisparkonk8sshell 中的 shells/init_spark_on_k8s.sh 到 spark 项目根目录下并执行。在 k8s 中创建 spark 命名空间。
B. 准备数据环境
在 TiDB 上构建两个库,建库脚本参考:tisparkonk8sshell 项目中 sqlfile/init.sql, 其中 sbtest.sbtest_o 为原始表,数据读取表,sbtest2.sbtest_t 为目标表,数据导入表。sbtest.sbtest_o 需要初始化数据,可以直接 source sqlfile/data.sql。
C. 快速体验
拷贝 tisparkonk8s 中的 shell/quick_start_sparkonk8s_245.sh 到 spark 项目根目录下。
跑任务之前,检查 sbtest2.sbtest_t 的数据量:
执行 sh quick_start_sparkonk8s_245.sh xxx.xxx.xxx.xxx,其中 xxx.xxx.xxx.xxx 修改为 k8s 地址, 项目正常开始运行会见到如下的日志:
使用 kubectl 查看 spark 空间中的 pod,如下:
跑任务之后,检查 sbtest2.sbtest_t 的数据量:
总结
这次实践只是做了一次 poc,离真正的生产运行还差很远,Spark 如果在 k8s 上部署 history server,后续的任务跟踪会更方便,这一块程序如果可以读取对象存储上的 sql 列表,直接进行计算和写入,使用起来门槛会更低。下一步准备做一个类似的框架,并开放出来,开放出来的代码包含上述测试所用代码。
评论