我使用tispark加载tidb的表,随机会出现乱码

【 TiDB 使用环境】

tidb 5.2 + tispark2.4.1 + spark2.4 + CDH5.16
【概述】 场景 + 问题概述

在使用tispark开发时,在spark环境使用tidb表,不定期出现乱码。表和数据的格式都是UTF-8 。

【背景】 做过哪些操作

读取tidb表。spark配置
val sparkConf = new SparkConf().
//setIfMissing(“spark.master”, “local[*]”).
setIfMissing(“spark.app.name”, getClass.getName).
setIfMissing(“spark.driver.allowMultipleContexts”, “true”).
setIfMissing(“spark.sql.extensions”, “org.apache.spark.sql.TiExtensions”).
setIfMissing(“spark.tispark.pd.addresses”, “XX.X.XXX.XX:2379,XX.X.XX.XXX:2379,XX.X.XX.XXX:2379”).
setIfMissing(“spark.driver.maxResultSize”, “12g”).
setIfMissing(“spark.debug.maxToStringFields”, “150”).
setIfMissing(“spark.tispark.tidb.addr”, “10.6.201.99”).
setIfMissing(“spark.tispark.tidb.port”, “4000”).
//如果要同时操作hive和tidb,加上enableHiveSupport方法。
// 如果有重名库 要操作Tidb表要加上前缀已区分是hive还是tidb的表
setIfMissing(“spark.tispark.write.allow_spark_sql”, “true”).
setIfMissing(“spark.tispark.db_prefix”, “tidb_”).
setIfMissing(“spark.sql.crossJoin.enabled”, “true”)

【现象】 业务和数据库现象
val sql_6: String =
s"""
|select a.org_code,
| b.sub_department_name,
| b.region_code,
| b.region_name
|from (select
| actual_unpack_org_code as org_code
| from tidb_ytrpt.mdm_first_code_maintain
| where dt = ‘${BDate1}’
| and actual_unpack_place_org_type in (‘1’,‘3’)
| and is_del = ‘0’
| group by actual_unpack_org_code) a
| left join tidb_ytrpt.dw_dim_yto_org_trans b
| on a.org_code = b.sub_department_code
“”".stripMargin

val sql_6_df = spark.sql(sql_6)
sql_6_df.createOrReplaceTempView("temp_unload_package_center")
sql_6_df.show(10) //会随机出现乱码

【问题】 当前遇到的问题

随机出现乱码。一天内执行144次。总会出现1,2次乱码。
【业务影响】

【 TiDB 版本】
5.2
【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

可以检查下终端的 locale 是否正确

全部都是UTF-8。

乱码的数据是固定的吗?或者在数据库中查询这个数据是乱码吗?

能提供一下出错的数据么?每次都是相同的数据出错么?

是相同的列出现乱码。在数据库中都是正常的。平时也都是正常的。这个乱码随机时段出现,而且出现几率挺低的。一天出现几次而已。我们是10分钟查一次。
我开始用tispark读tidb的维度表进行关联。但是不定时出现中文字段乱码。后面我用hive中的维度表进行关联,问题就消失了。

最好能提供一下乱码的数据,不然只能猜测,整个链路有点长,没发排查

试下加两个 spark 配置

spark.driver.extraJavaOptions -Dfile.encoding=UTF-8
spark.executor.extraJavaOptions -Dfile.encoding=UTF-8

可以配在 spark-defaults.conf 里

我怀疑有部分 spark 机器上的 jvm encoding 配置不太对

1赞

问一下,咱们是排查定位的,学习一下:smile::grin: