广播变量是走task还是excueter
时间: 2024-04-03 15:31:38 浏览: 6
在Spark中,广播变量是由Driver节点广播到所有的Executor节点,然后在Executor节点上使用。具体来说,广播变量是通过序列化后的数据在Driver节点上创建的,然后将其副本发送到所有Executor节点。一旦Executor节点收到了广播变量的副本,它就可以在本地使用该变量,而无需从Driver节点获取数据。在任务执行期间,任务代码可以直接访问本地的广播变量,而无需从网络中获取数据,这可以提高任务的执行效率。因此,可以说广播变量既走了Task也走了Executor。
相关问题
spark 广播变量
Spark广播变量是一种分布式只读共享变量。它通过将一个普通变量封装为广播变量,使得该变量可以在Executor端执行的代码中使用。广播变量的使用非常简单,只需要使用`broadcast`方法将一个普通变量封装为广播变量即可。例如,可以使用以下代码将一个可变的映射封装为广播变量:
```
val map = mutable.Map(("a", 4),("b", 5),("c", 6))
val bc: Broadcast[mutable.Map[String, Int]] = sc.broadcast(map)
```
这样,在Executor端的代码中可以通过`bc.value`来获取广播变量的值,而不需要将整个变量传递到Executor端。广播变量的主要作用是可以在并行计算中共享数据,减少数据传输的开销,提高计算效率。因为广播变量在Executor端是只读的,所以不会出现数据一致性的问题。这使得广播变量非常适合在分布式计算中共享一些大型的只读数据集。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Spark共享变量(广播变量、累加器)](https://blog.csdn.net/Android_xue/article/details/79780463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [spark 累加器,广播变量.docx](https://download.csdn.net/download/weixin_41801538/12279398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [Spark学习笔记(15)——广播变量](https://blog.csdn.net/m0_56602092/article/details/119452562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
taskData.Over是类型但此处被当做变量使用
您提到的 `taskData.Over` 是一个类型的名称和委托类型的名称,而不是变量。实际上,您需要使用委托类型的实例来绑定方法。
在您的示例中, `TaskInputData` 类包含一个名为 `Over` 的委托类型。您需要创建一个实例来引用该委托类型,并在该实例上添加方法。可以像这样实现:
```csharp
public class TaskInputData {
public string name;
public delegate void Over();
public Over onOver; // 声明一个委托类型的实例
}
public class Example {
void Start() {
TaskInputData taskData = new TaskInputData();
taskData.onOver += MyFunction; // 将 MyFunction 添加到 onOver 委托实例的调用列表中
// 当任务完成时,调用 onOver 委托实例的调用列表
taskData.onOver?.Invoke();
}
void MyFunction() {
// 实现需要执行的代码
}
}
```
在这个例子中,`TaskInputData` 类包含一个名为 `onOver` 的委托类型的实例。通过使用 `.Invoke()` 方法在适当的时候调用它来执行添加到该委托实例的方法。在示例中,当任务完成时,您可以使用 `taskData.onOver?.Invoke()` 来调用委托实例的方法。