我一直在遵循5分钟的时间来使用tidb_tispark设置htap数据库,并且一切正常,直到进入“启动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的主要开发人员之一。对不起,您不好的经验。
由于我的泊坞窗问题,我无法直接重现您的问题,但看来您遇到了最近修复的错误之一。
https://github.com/pingcap/tispark/pull/862/files
教程文档不是最新的,并且指向较旧的版本。这就是为什么它不能与教程中的spark 2.1.1一起使用。我们将尽快对其进行更新。
较新版本的TiSpark不再使用tidbMapDatabase,而是直接与目录挂钩。保留方法tidbMapDatabase是为了向后兼容。不幸的是,tidbMapDatabase有一个错误(当我们从旧版本移植时),只有在调用该函数后,它才会检索时间戳进行查询。这导致TiSpark始终使用旧时间戳来读取快照,而永远不会看到新数据。
在较新版本的TiSpark(带有Spark 2.3+的TiSpark 2.0+)中,数据库和表直接挂接到目录服务中,您可以直接调用
spark.sql("use TPCH_001").show
spark.sql("select * from nation").show
这应该为您提供新数据。
因此,尝试重新启动您的Spark驱动程序,只需尝试上面的两行代码,看看它是否有效。
让我知道是否可以解决您的问题。另一方面,我们将检查docker映像以确保它已包含修复程序。
如果仍然出错,请您帮忙运行以下代码,并让我们知道TiSpark的版本。
spark.sql("select ti_version()").show
同样,很抱歉给您带来麻烦,并感谢您的尝试。
编辑
要发表您的评论:
该警告是由于spark本身将首先尝试在其本机目录中查找数据库,这将导致Failed无法获得警告。但是故障转移过程会将搜索委派给tispark,然后正确执行。因此,此警告可以忽略。建议将以下行添加到spark的conf文件夹中的log4j.properties中。
log4j.logger.org.apache.hadoop.hive.metastore.ObjectStore=ERROR
我们将尽快完善docker教程映像。非常感谢您的尝试。
关于mysql - 在MySQL中修改数据库时在Spark中删除行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56993559/