apache-spark - 获取广播值失败
问题描述
我创建了一个如下所示的 spark 应用程序。
使用本地客户端模式运行时,一切正常。
但是当我在 prod 环境中以集群部署模式提交到 YARN 时,applicationAction
最后一个匹配块中的变量总是null
.
那么我在这里使用广播是否有任何问题,或者有任何其他方法可以将变量传递给最后一个匹配案例块。
谢谢。
object SparkTask {
private sealed trait AppAction {}
case class Action1() extends AppAction
case class Action2() extends AppAction
def main(args: Array[String]): Unit = {
var applicationAction: Broadcast[AppAction] = null
val sparkSession = SparkSession.builder.appName("SparkTask").getOrCreate
args(0) match {
case "action-1" => applicationAction = sparkSession.sparkContext.broadcast(Action1())
case "action-2" => applicationAction = sparkSession.sparkContext.broadcast(Action2())
case _ => sys.exit(255)
}
// Here goes some df action and get a persisted dataset
val df1 = ...
val df2 = ...
val df3 = ...
applicationAction.value match {
case Action1() => handleAction1(df3)
case Action2() => handleAction2(df3)
}
}
}
解决方案
广播变量的目的是与执行者共享一些数据。我认为在您的用例中有两种可能性:
- 您正在尝试从执行程序向驱动程序获取一些信息:为此,您不应使用广播变量,而应使用累加器或诸如 take/collect 之类的东西。
- 您想根据 applicationAction.value (不可变)做出决定:在这种情况下,您可以直接使用args(0)的值。
推荐阅读
- c++ - 如何使用 Qt Test 模块来测试我自己的应用程序?
- sql - 如何在缺少信息的情况下实现第三范式
- arrays - 我被困在一个 if else 语句中,试图比较存储在“char”变量中的两个字符串值
- c++ - 在 C++ 中声明抽象类型的变量
- http - Golang RedirectHandler() 返回接口,以 *http.redirectHandler 结尾
- python - matplotlib 极坐标图填充整个图形
- c++ - Alsa - 当应用程序作为服务运行时,在应用程序中设置音量会有所不同
- scala - 通过 Pureconfig 从资源目录加载不同的文件
- python - 如何通过组合两个列表来形成字典
- docker - 限制用户访问 Docker Registry 以进行 docker push 操作