ANTLR Tool version 4.8 used for code generation does not match the current runtime version 4.7.1

【 TiDB 使用环境`】测试环境
1、PD:192.168.3.221/222/223:2379
2、TiDB:192.168.3.221/222/223:4000
3、TiKV:192.168.3.224/225/226
4、Haproxy:192.168.3.221:13390
5、Spark:Master(192.168.3.227:7077)、Worker(192.168.3.228/229)
6、${SPARK_HOME}/conf/spark-defaults.conf内容如下


【 TiDB 版本】TiDB v5.4.2,Spark v3.1.3,TISpark tispark-assembly-3.1_2.12-3.0.1.jar

【遇到的问题】

【复现路径】做过哪些操作出现的问题
spark-sql中执行sql语句,提示ANTLR版本不匹配。
【问题现象及影响】


spark-sql> show database;
ANTLR Tool version 4.8 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.8 used for parser compilation does not match the current runtime version 4.7.122/07/27 22:53:34 WARN HttpClientUtil: Failed to send HTTP get request.

spark.tispark.tidb.port 13390
13390是什么端口?


看到了,Haproxy:192.168.3.221:13390

Haproxy 的负载均衡端口

你用的spark是这个包 spark-3.1.3-bin-hadoop3.2
换成这个试下 spark-3.1.3-bin-hadoop2.7

我们是能显示show databases 但是实际查数据时会报hive 元数据异常

  1. 换了 spark-3.1.3-bin-hadoop2.7 包,问题依旧。
  2. 替换成 tispark-assembly-3.1-2.5.1.jar 后。
    ANTLR 不匹配的警告仍然存在,但是 WARN HttpClientUtil: Failed to send HTTP get request.的警告消失了,也可正常执行SQL查询了
  3. 另外,spark-defaults.conf 只保留了如下配置项:
    spark.sql.extensions org.apache.spark.sql.TiExtensions
    spark.tispark.pd.addresses 192.168.3.221:2379,192.168.3.222:2379,192.168.3.223:2379
    spark.tispark.write.allow_spark_sql true
    spark.master spark://192.168.3.227:7077

替换后能重现问题么?你的tidb是独立部署还是部署在k8s中的?你那有spark 3.0.x的环境么?能不能帮忙试一下,在spark 3.0.x下能否重现错误?

我翻了翻tispark的源码,初步判断,spark 3.1.x编译时引用了org.antlr:antlr4-runtime:4.8-1,tispark-assembly-3.1_2.12-3.0.1.jar在编译时大概率引用的是org.antlr:antlr4-runtime:4.7,所以会有这个警告。tispark用了tikv-client,tikv-client中用了org.antlr:antlr4-runtime:4.7,所以我猜测tispark-assembly-3.1_2.12-3.0.1.jar大概率引用的是org.antlr:antlr4-runtime:4.7。

1 个赞

好几个帖子里面看到过这个错误:


你的两次测试之间,有问题的测试和没问题的测试,pd的地址有没有做过修改?或者说是新拷贝的?

我在自己的测试环境搭的Spark3.1.3集群,如果需要的话,明天白天可以试一下Spark 3.0.x的环境。

我是独立部署的TiDB,OS是CentOS7.9。将 tispark-assembly-3.1_2.12-3.0.1.jar替换为tispark-assembly-3.1-2.5.1.jar之后,ANTLR的警告仍然存在。但是WARN HttpClientUtil: Failed to send HTTP get request.这个错误消失了。也可以正常执行SQL语句。

这个错误,我也注意到了。
第1次测试,spark-defaults.conf中pd配置为
spark.tispark.pd.addresses 192.168.3.221:2379,192.168.3.222:2379,192.168.3.223:2379
发现这个错误之后,我以为是我写法问题,就只保留了一个PD地址,写成了
spark.tispark.pd.addresses 192.168.3.221:2379
然后,这个错误好像没了(记不太清了)
第二次测试,换了spark-3.1.3-bin-hadoop2.7,这个PD的错误没注意
第三次测试,tispark包换成了tispark-assembly-3.1-2.5.1.jar之后,我把PD的配置又写回了
spark.tispark.pd.addresses 192.168.3.221:2379,192.168.3.222:2379,192.168.3.223:2379。
这个错误就没再出现。

将Spark3.1.3更换为Spark3.0.3之后,关于ANTLR版本不匹配的警告消失了,同时也可以正常执行SQL查询。

经过验证,不会产生 ANTLR 版本 does not match 的组合如下:

  1. TiDB v5.4.2 - Spark v3.0.3 - TiSpark v2.5.1/v3.0.1

  2. TiDB v6.1 - Spark v3.0.3 - tispark-assembly-3.0_2.12-3.0.1.jar

spark-sql> use tidb_catalog.mysql;
22/07/29 03:38:08 WARN HttpClientUtil: Failed to send HTTP get request.
22/07/29 03:38:08 WARN TiSparkTeleInfo$: Failed to get PD version For input string: "2379,192.168.3.222:2379,192.168.3.223:2379"
22/07/29 03:38:08 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
Time taken: 2.741 seconds
spark-sql> use tidb_catalog.mysql;
Time taken: 0.025 seconds
spark-sql> select * from user;
22/07/29 03:38:19 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.
%       root    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       mysql_native_password   Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       N       Y       Y       Y       Y   Y
%       admin   *4ACFE3202A5FF5CF467898FC58AAB1D615029441       mysql_native_password   Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       N       Y       Y       Y       Y   Y
Time taken: 2.552 seconds, Fetched 2 row(s)
  1. TiDB v6.1 - Spark v3.0.3 - tispark-assembly-3.0-2.5.1.jar
spark-sql> use tidb_catalog.mysql;
22/07/29 03:32:35 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
Time taken: 2.641 seconds
spark-sql> use tidb_catalog.mysql;
Time taken: 0.024 seconds
spark-sql> select * from user;
22/07/29 03:32:42 WARN package: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.sql.debug.maxToStringFields'.
%       root    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       mysql_native_password   Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       N       Y       Y       Y       Y   Y
%       admin   *4ACFE3202A5FF5CF467898FC58AAB1D615029441       mysql_native_password   Y       Y       Y       Y       Y       Y       Y       Y       Y       Y   YY       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       N       Y       Y       Y       Y   Y
Time taken: 2.78 seconds, Fetched 2 row(s)

存在 ANTLR 版本 does not match 的组合为:

  1. TiDB v6.1 - Spark v3.1.3 - tispark-assembly-3.0-2.5.1.jar
ANTLR Tool version 4.8 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.8 used for parser compilation does not match the current runtime version 4.7.1ANTLR Tool version 4.8 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.8 used for parser compilation does not match the current runtime version 4.7.1default
  1. TiDB v5.4.2 - Spark v3.1.3 - tispark-assembly-3.0-2.5.1.jar

  2. TiDB v5.4.2 - Spark v3.1.3 - tispark-assembly-3.1_2.12-3.0.1.jar

根据以上结果,初步判断。Spark v3.1.3 中引入的 ANTLR 4.8,Spark v3.0.3 中引入的ANTLR 为 4.7,而TiDB5.x/6.x与TiSpark2.5.x/3.x中引入的ANTLR版本为4.7.1

环境:
tidb: v5.4.2
tispark: 3.1_2.12-3.0.1
spark: 3.1.3
并没有复现你的问题。pd地址那里确实解析有问题。

我尝试了一下,把半角冒号换成全角冒号,错误提示如下:

22/07/29 07:51:42 WARN PDClient: failed to get member from pd server.

2022/7/29 15:51:42 com.pingcap.tikv.exception.TiKVException: Failed to build NettyChannelBuilder
加个空格的错误:
java.lang.IllegalArgumentException: Illegal character in authority at index 7: http://basic-pd.tidb-cluster: 2379
似乎不是因为半角全角或者空格的问题引起的:
22/07/27 23:15:56 WARN TiSparkTeleInfo$: Failed to qet PD version For input string: “2379,192.168.3.222:23379,192.168.3.223:2379”

你的意思是说即使有个Failed to qet PD version For input string: “2379,192.168.3.222:23379,192.168.3.223:2379”的报错,仍然能够访问通?

翻了翻以前的问答, 这个帖子中也有相同的错误,最后应该也不是这个原因



这里获取pd 状态时拼的url有问题,所以会抛异常,但是不影响整体运行,会把值设置为UNKNOWN。
这是个bug。

https://github.com/pingcap/tispark/pull/2473
这个问题已经修复了

1 个赞