我有一个Spark项目,它使用一些关于状态/区域的静态元数据。目前,数据硬编码如下:
object RegionUtil {
val regionNames = Map("US-AL" -> "ALABAMA",
"US-AK" -> "ALASKA",
"US-AZ" -> "ARIZONA",
"US-AR" -> "ARKANSAS",
"US-CA" -> "CALIFORNIA",
"US-CO" -> "COLORADO",
// ... etc
"US-WY" -> "WYOMING")
}
然后只需从RegionUtil中的地图中查找区域映射。这只是一个示例,因为应用程序依赖于许多类似的静态映射。
但是这些元数据中的一些偶尔(很少)更新,并且已经在MySQL数据库中维护。我想做的是最初在spark启动时加载该数据,然后在需要访问元数据时从该点向前查找该数据的缓存副本(理想情况是每个从节点维护自己的副本)。 p>
有谁知道如何实现这一目标?
答案 0 :(得分:1)
您希望为此目的调查broadcasting:
广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。例如,它们可用于以有效的方式为每个节点提供大输入数据集的副本。 Spark还尝试使用高效的广播算法来分发广播变量,以降低通信成本。
他们的代码示例:
val broadcastVar = sc.broadcast(Array(1, 2, 3))
答案 1 :(得分:0)
如果在编写特定于spark的代码之前创建/更新结构而不使用spark(例如直接使用Slick或JDBC或其他),并且保存数据的值将在范围内并在spark代码中使用,spark将序列化并为你播放。
如果您需要在火花作业运行期间更新这些,那么您需要使用广播