【问题标题】:How to refresh a table and do it concurrently?如何刷新表并同时执行?
【发布时间】:2018-01-30 05:44:43
【问题描述】:

我正在使用 Spark Streaming 2.1。我想定期刷新一些缓存表(由 spark 提供的数据源加载,如 parquet、MySQL 或用户定义的数据源)。

  1. 如何刷新表格?

    假设我加载了一些表格

    spark.read.format("").load().createTempView("my_table")

    它也被缓存了

    spark.sql("cache table my_table")

    以下代码是否足以刷新表格,以及何时 表下次加载,会自动缓存

    spark.sql("refresh table my_table")

    或者我必须手动执行此操作

    spark.table("my_table").unpersist spark.read.format("").load().createOrReplaceTempView("my_table") spark.sql("cache table my_table")

  2. 同时刷新表格是否安全?

    并发我的意思是使用ScheduledThreadPoolExecutor 在主线程之外进行刷新工作。

    如果我在表上调用刷新时 Spark 正在使用缓存表会发生什么?

【问题讨论】:

  • 你能解决这个问题吗?

标签: apache-spark apache-spark-sql spark-streaming


【解决方案1】:

我在使用 SparkSession 特别是方法表(即spark.table(table_name))从 hive 中读取表时遇到问题。每次在写完表格并尝试阅读之后 我收到了这个错误:

java.IO.FileNotFoundException ... 基础文件可能已更新。您可以通过在 SQL 中运行“REFRESH TABLE tableName”命令或通过重新创建所涉及的数据集/数据帧来显式地使 Spark 中的缓存无效。

我尝试使用 spark.catalog.refreshTable(table_name) 刷新表,但 sqlContext 也没有用。

我的解决方案写在表格和阅读后使用:

val usersDF = spark.read.load(s"/path/table_name")

一切正常。

这是个问题吗?也许 hdfs 的数据还没有更新?

【讨论】:

  • 不确定,但对于文件应该使用spark.catalog.refreshByPath(path)
【解决方案2】:

在 Spark 2.2.0 中,他们引入了在表被 hive 或某些外部工具更新时刷新表元数据的功能。

可以通过API实现,

spark.catalog.refreshTable("my_table")

此 API 将更新该表的元数据以保持一致。

【讨论】:

  • API spark.catalog.refreshTable 存在于 Spark 2.2.0 之前,我猜它与 spark.sql("refresh table ...") 相同。你的意思是说在 Spark 2.2.0 之前使用spark.catalog.refreshTable 还不够,我必须手动取消持久化并重新缓存?那么并发呢?
  • 使用 spark.catalog.refreshTable 应该足够了。你所说的并发是什么意思!!如果您的意思是并行化,那么据我所知,它不会损害并行化。
  • 我需要解释更多,我的英语很差。你的回答和你的评论不一致。在您的回答中,您指出该功能是在 Spark 2.2.0 中引入的。在您的评论中,您说即使使用 Spark 2.1.0 spark.catalog.refreshTable 也足够了。这让我很困惑。通过并发,我有一个例子。当 Spark 正在执行一些使用缓存表 t1 的物理计划时,我同时调用了 refresh t1,Spark 会做什么?等到物理计划完成,然后刷新表。还是在实际使用计划中的表之前重新加载表?
  • 我觉得它会重新加载表格并更新计划。但最好测试一次并确认。
  • 你测试了吗?当我缓存表并从缓存表更新文件时,它给了我文件未找到错误,所以我使用了刷新表命令,但是在运行并行进程来更新文件并读取我得到的相同错误时。我应该使用任务上下文来控制并行性的最佳方法是什么?
猜你喜欢
  • 2023-01-10
  • 2023-03-06
  • 2020-09-28
  • 2021-10-10
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多