在 MySQL 中修改数据库时在 Spark 中删除了行

Dropped rows in Spark when modifying database in MySQL

我一直在关注如何使用 tidb_tispark 设置 htap 数据库的 5 分钟,一切正常,直到我进入 Launch TiSpark 部分。我的第一个问题发生在执行该行时:

docker-compose exec tispark-master  /opt/spark-2.1.1-bin-hadoop2.7/bin/spark-shell

但我通过将 spark 版本修改为我在容器中找到的版本来解决这个问题:

docker-compose exec tispark-master  /opt/spark-2.3.3-bin-hadoop2.7/bin/spark-shell

我的第二个问题发生在执行三行块时:

import org.apache.spark.sql.TiContext
val ti = new TiContext(spark)
ti.tidbMapDatabase("TPCH_001")

当我 运行 最后一条语句时,我得到以下输出

scala> ti.tidbMapDatabase("TPCH_001")
2019-07-11 16:14:32 WARN  General:96 - Plugin (Bundle) "org.datanucleus" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/jars/datanucleus-core-3.2.10.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-2.3.3-bin-hadoop2.7/jars/datanucleus-core-3.2.10.jar."
2019-07-11 16:14:32 WARN  General:96 - Plugin (Bundle) "org.datanucleus.api.jdo" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/jars/datanucleus-api-jdo-3.2.6.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-2.3.3-bin-hadoop2.7/jars/datanucleus-api-jdo-3.2.6.jar."
2019-07-11 16:14:32 WARN  General:96 - Plugin (Bundle) "org.datanucleus.store.rdbms" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/opt/spark/jars/datanucleus-rdbms-3.2.9.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/opt/spark-2.3.3-bin-hadoop2.7/jars/datanucleus-rdbms-3.2.9.jar."
2019-07-11 16:14:36 WARN  ObjectStore:568 - Failed to get database global_temp, returning NoSuchObjectException

这并不妨碍我运行查询:

spark.sql("select * from nation").show(30);

但是当我按照教程的进一步步骤从 MySQL 修改数据库时,更改不会立即反映在 Spark 中。此外,在将来的某个时候(我相信 > 5 分钟后),被修改的行将停止显示在 Spark SQL 查询中。

我对这种设置比较陌生,真的不知道如何调试这个问题。对我收到的警告的搜索没有启发性。

我不知道它是否有帮助,但是当我连接时 MySQL 这是我得到的服务器版本:

Server version: 5.7.25-TiDB-v3.0.0-rc.1-309-g8c20289c7 MySQL Community Server (Apache License 2.0)

我是 TiSpark 的主要开发者之一。很抱歉给您带来不好的体验。

由于我的 docker 问题,我无法直接重现您的问题,但您似乎遇到了最近修复的错误之一。 https://github.com/pingcap/tispark/pull/862/files

  1. 教程文档不完全 up-to-date 并且指向旧版本。这就是为什么它不能像教程中那样与 spark 2.1.1 一起使用。我们会尽快更新。
  2. 新版本的 TiSpark 不再使用 tidbMapDatabase,而是直接与目录挂钩。保留方法 tidbMapDatabase 是为了向后兼容。不幸的是,tidbMapDatabase 有一个错误(当我们从旧版本移植它时),它只会在您调用该函数时检索时间戳以供查询。这导致 TiSpark 总是使用旧的时间戳来做快照读取,而更新的数据永远不会被它看到。

在较新版本的 TiSpark(TiSpark 2.0+ 和 Spark 2.3+)中,数据库和表直接挂接到目录服务中,您可以直接调用

spark.sql("use TPCH_001").show
spark.sql("select * from nation").show

这应该会给您新的数据。 所以尝试重启你的Spark驱动,试试上面两行代码看看是否有效。

如果这能解决您的问题,请告诉我。另一方面,我们将检查我们的 docker 图像以确保它是否已经包含修复。

如果仍然出错,请帮忙运行下面的代码,让我们知道TiSpark的版本。

spark.sql("select ti_version()").show

再次抱歉给您带来麻烦,感谢您的尝试。

编辑

处理您的评论: 警告是由于 spark 本身会首先尝试在其本机目录中定位数据库,这将导致 Failed to get 警告。但是故障转移过程会将搜索委托给 tispark,然后才能正常运行。所以这个警告可以忽略。建议在 spark 的 conf 文件夹中将以下行添加到 log4j.properties。

 log4j.logger.org.apache.hadoop.hive.metastore.ObjectStore=ERROR

我们会尽快完善docker教程图片。非常感谢您的尝试。