Spark-shell不允许查询结构化流

时间:2018-07-27 07:05:12

标签: apache-spark spark-structured-streaming

我正在关注《 以下代码使用spark-shell在本地执行

程序: 没有任何其他选择的情况下启动了火花壳

 scrapy shell http://something.com --set="ROBOTSTXT_OBEY=False"

《书》说

  

执行此代码后,流计算将在后台开始

     

....

     

现在该流正在运行,我们可以通过查询来试验结果

我的观察

执行此代码后,它不会释放外壳程序供我键入命令 例如

val static = spark.read.json("/part-00079-tid-730451297822678341-1dda7027-2071-4d73-a0e2-7fb6a91e1d1f-0-c000.json")
val dataSchema = static.schema
val streaming = spark.readStream.schema(dataSchema) .option("maxFilesPerTrigger",1).json("/part-00079-tid-730451297822678341-1dda7027-2071-4d73-a0e2-7fb6a91e1d1f-0-c000.json")
val activityCounts = streaming.groupBy("gt").count()
val activityQuery  = activityCounts.writeStream.queryName("activity_counts").format("memory").outputMode("complete").start()
activityQuery.awaitTermination()

因此,我无法查询此流

我的研究

我试图打开一个新的spark-shell,但是在该shell中进行查询不会返回任何结果。从此Shell获得的流是否可以从该Shell的其他另一个实例访问。

EDIT1:

我想要表在内存中,以便可以使用命令查询

`spark.streams.active`

3 个答案:

答案 0 :(得分:3)

点对:

1)确保为Spark-shell分配了足够数量的内核

运行流媒体/结构化流媒体应用程序需要至少2个内核,以防止出现饥饿情况,即,在启动流媒体应用程序时,会将1个内核分配给 Receiver 如果您仅使用1个内核启动spark应用程序,则将没有可用的内核来处理执行者收到的消息。

要检查spark-shell中的内核数:

spark.conf.get("spark.master")

启动具有4核的spark-shell

spark-shell --master local[4]

2)您正在将流写入Memory,这将不会在控制台中显示输出,要显示您必须先注册表然后进行查询。

相反,您可以将格式从内存更改为控制台,以在控制台中查看内容。

val activityQuery  = activityCounts.writeStream.queryName("activity_counts").format("console").outputMode("complete").start()

答案 1 :(得分:0)

在Spark shell中,只需避免使用activityQuery.awaitTermination()。流已经以.start()开始。

您也可以在activityQuery.stop()之前停止播放流

答案 2 :(得分:0)

我知道答案真的很晚,您可能已经找到了答案,以防万一有人现在问这个问题:

您需要使用 spark.ui.showConsoleProgress = false

启动spark shell。
spark-shell --conf spark.ui.showConsoleProgress=false

并且如Lakshman Battini

所述

将格式从内存更改为控制台,以查看以下内容 控制台

要了解更多信息,可以看到问题:

How to suppress the “Stage 2===>” from the output console in spark?

puhlen为此给出了完美的答案。

有关控制台进度栏的更多信息,请访问此link