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 支持