0

我一直在关注 5 分钟如何使用 tidb_tispark 设置 htap 数据库,一切正常,直到我到达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)
4

1 回答 1

1

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

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

  1. 教程文档不是最新的,并且指向较旧的版本。这就是为什么它不能与教程中的 spark 2.1.1 一起使用。我们会尽快更新。
  2. 较新版本的 TiSpark 不再使用 tidbMapDatabase,而是直接与目录挂钩。tidbMapDatabase 方法保持向后兼容。不幸的是,tidbMapDatabase 有一个 bug(当我们从旧版本移植时)它只有在调用该函数时才检索时间戳进行查询。这导致 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 教程图像。非常感谢您的尝试。

于 2019-07-11T18:04:39.173 回答