Spark Shell 的 Spark Session 中不显示新插入的 Hive 记录

Posted

技术标签:

【中文标题】Spark Shell 的 Spark Session 中不显示新插入的 Hive 记录【英文标题】:Newly Inserted Hive records do not show in Spark Session of Spark Shell 【发布时间】:2019-05-24 06:57:19 【问题描述】:

我运行了一个简单的 Spark-sql 程序,使用 spark-SQL 从 Hive 获取数据到 Spark 会话。

scala> spark.sql("select count(1) from firsthivestreamtable").show(100,false)
+--------+
|count(1)|
+--------+
|36      |
+--------+

运行插入语句以在 Hive 表中插入 9 条新记录(直接在 Hive 控制台上)。验证 Hive 表已正确插入其他行。

hive> select count(1) aa from firsthivestreamtable;
Total MapReduce CPU Time Spent: 4 seconds 520 msec
OK
45
Time taken: 22.173 seconds, Fetched: 1 row(s)
hive>

但是已经打开的 spark session 没有显示新插入的 9 行。所以,当我在 spark 会话中计数时,它仍然显示 36 行。为什么会这样?

scala> spark.sql("select count(1) from firsthivestreamtable").show(100,false)
+--------+
|count(1)|
+--------+
|36      |
+--------+

在 Spark 会话中需要做什么才能将刷新的(新)数据放入会话中?由于插入了新数据,Hive 表中的实际行数现在是 45,而不是 36。

它位于 spark shell 中,并且 Hive 中的表正在通过 Spark 结构化流 API 加载。

【问题讨论】:

在已编译的程序或 spark shell 中?由于程序,假设前者。不是流媒体节目? 在 Hue 中,查询将使用 Hive 中的 Map/Reduce 程序执行。所以,这个问题不会发生。每次运行 Hue 查询 (HQL) 时,它都会触发下面的 map-reduce 程序。 黑斑羚不是这样的 【参考方案1】:

当 Spark 第一次访问时从 Metastore 中检索表时,它会列出文件并将其缓存在内存中。 当我们执行insert 操作时,记录会进入一个 Spark 不知道的 new 文件。两种选择。 1. 触发REFRESH TABLE <tblname> -> spark.sql("REFRESH TABLE firsthivestreamtable") . 2. 重启Spark应用(表和文件会被重新获取)

【讨论】:

与 JDBC 源完全不同的行为。 在 Hue 这不会发生。 是的,这取决于数据源的内部实现。文件支持的数据源(如 Parquet、Orc、CSV 等)会出现此问题,其中缓存了文件列表(这是云存储中的一项昂贵操作)。在其他数据源(如 JDBC)中,这不是问题。 我会检查色调。 我的评论更多是关于差异【参考方案2】:

这个故事的线索是,在 Spark 中观察到的行为有助于重新计算 DAG - 如果工作节点故障需要。

另一个答案解释了机制,这个答案解释了原因。

【讨论】:

以上是关于Spark Shell 的 Spark Session 中不显示新插入的 Hive 记录的主要内容,如果未能解决你的问题,请参考以下文章

Learning Spark——使用spark-shell运行Word Count

如何在 spark-shell (spark 2.1.1) 中启用对 spark 的 Hive 支持

spark-shell启动spark报错

spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异

剖析spark-shell

Spark源码解析 —— Spark-shell浅析