我想使用Spark结构化流来观看驱动程序上仅存在的放置位置。我这样做
val trackerData = spark.readStream.text(sourcePath)
之后,我想解析,过滤和映射传入的数据,并将其写成弹性。
这很有效,只有当spark.master
设置为例如{}时才有效local[*]
。设置为yarn
时,即使部署模式设置为client
,也不会找到任何文件。
我认为从本地驱动程序节点读取数据是通过将部署设置到客户端并在Spark集群中进行实际处理和写入来实现的。
如何改进我的代码以使用驱动程序进行读入和集群进行处理和编写?
答案 0 :(得分:0)
你想要什么,但特别是在Spark Structured Streaming和Apache Spark中不推荐。
Apache Spark的主要动机是将数据计算与数据相反,因为Spark要处理单个JVM(驱动程序)无法处理的数PB数据。
驱动程序的“作业”(没有双关语)是将RDD谱系(=转换的DAG)转换为知道如何加载数据的任务。任务在Spark执行程序上执行(在大多数情况下),这是数据处理发生的地方。
有一些方法可以使阅读部分在驱动程序和处理执行程序上,其中最“有利可图”的是使用broadcast variables。
广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。例如,它们可用于以有效的方式为每个节点提供大输入数据集的副本。 Spark还尝试使用高效的广播算法来分发广播变量,以降低通信成本。
我想到的一个想法是,你可以“破解”Spark“Streams”并编写自己的streaming sink collect
或其他任何东西。这可以使处理成为本地。