使用tispark写入数据到tidb

【TiDB 使用环境】:测试

【TiDB 版本】
tidb版本:5.4
tisaprk:2.5
spark:3.0.1

【出现的问题】 使用tispark读取表A数据然后写入表B数据,在windows执行完全没有问题,但是在服务器运行任务在K8s中,则出现错误

代码:参考官网:

 
// write data to tidb
df.write.
  format("tidb").
  option("tidb.addr", "127.0.0.1").
  option("tidb.port", "4000").
  option("tidb.user", "root").
  option("tidb.password", "").
  option("database", "tpch").
  option("table", "target_orders").
  mode("append").
  save()
1 个赞

你贴的日志描述了,缺包…

顶楼上,k8s里面怎么启动的?启动镜像或者打包镜像时,tispark的jar包放进去了没?

我jar包里面有 依赖,通过httpd下载执行得jar包,windows执行,和k8s使用tispark读数据都时没问题的

com.pingcap.tispark
tispark-assembly
2.5.0

com.pingcap.tispark tispark-assembly 2.5.0 除了这个还需要别的嘛,最骚得是我windows上执行时没问题得

jar包多大?另外你的spark版本是3.X还是2.X?我遇到过这个,是在spark2.X环境上测试,然后提交到了spark3.0.x集群里面,入口定义参数不一致,导致这个问题,例如:
2.x的定义:

        SparkConf conf = new SparkConf()
                .set("spark.sql.extensions", "org.apache.spark.sql.TiExtensions")
                .set("spark.tispark.pd.addresses", pd_addr);

3.0.X的定义:

        SparkConf conf = new SparkConf()
                .set("spark.sql.extensions", "org.apache.spark.sql.TiExtensions")
                .set("spark.sql.catalog.tidb_catalog", "org.apache.spark.sql.catalyst.catalog.TiCatalog")
                .set("spark.sql.catalog.tidb_catalog.pd.addresses", pd_addr)
                .set("spark.tispark.pd.addresses", pd_addr);

我看到这个.set(“spark.sql.catalog.tidb_catalog”, “org.apache.spark.sql.catalyst.catalog.TiCatalog”)
.set(“spark.sql.catalog.tidb_catalog.pd.addresses”, pd_addr)。不知道这个是干啥的,本地加上就错了,k8s里面没加,spark3.0.1,上面版本说明我写了

那应该就是这个问题了,我试试

3.0.X版本必须要有

        SparkConf conf = new SparkConf()
                .set("spark.sql.extensions", "org.apache.spark.sql.TiExtensions")
                .set("spark.sql.catalog.tidb_catalog", "org.apache.spark.sql.catalyst.catalog.TiCatalog")
                .set("spark.sql.catalog.tidb_catalog.pd.addresses", pd_addr)
                .set("spark.tispark.pd.addresses", pd_addr);

缺一不可,都加上看看。

ok,我在提交命令里加一下,但是为啥windows本地 master为local能执行成功,然后加了这个就出错呢

怀疑你本地的spark的jar包有问题,可能原因很多,不好判断。

我刚刚加上之后,然后查询不到我的库表了,不加就能查询,因为我是先读取tidb A表数据然后写入B表,现在A表查不到啦就很神奇

https://asktug.com/t/topic/573310
完整的看一下吧,不知道你那还有没有没改的地方。

这样没得问题


这样就有问题了

还是没能解决那个问题,找不到tidb这个源

spark 3.0.x 增加了一层catalog,例如需要获取数据,需要这么写:

            String source_db_name = "tidb_catalog.sbtest";
            String source_table_name = "sbtest_o";

            spark.sql("use "+source_db_name);
            String source_sql = "select * from "+source_table_name;

兄弟,我最开始的问题不是这个,是这个 format(“tidb”). tidb源有问题
df.write.
format(“tidb”).
option(“tidb.addr”, “127.0.0.1”).
option(“tidb.port”, “4000”).
option(“tidb.user”, “root”).
option(“tidb.password”, “”).
option(“database”, “tpch”).
option(“table”, “target_orders”).
mode(“append”).
save()

我始终怀疑哪个地方沟通的不到位,方不方便提供完整的测试用例和建表语句?我在我的环境里面调通了,然后放到你的环境里面跑,对比排查问题。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。