pub struct NetworkBroadcastExec { /* private fields */ }Expand description
Network boundary for broadcasting data to all consumer tasks.
This operator works with BroadcastExec which scales up partitions so each consumer task fetches a unique set of partition numbers. Each partition request is sent to all stage tasks because each task’s leaf node is specialized to serve a different slice of the data for the same logical partition number.
Here are some examples of how NetworkBroadcastExec distributes data:
§1 to many
┌────────────────────────┐ ┌────────────────────────┐ ■
│ NetworkBroadcastExec │ │ NetworkBroadcastExec │ │
│ (task 1) │ ... │ (task M) │ │
│ │ │ │ Stage N
│ Populates Caches │ │ Populates Caches │ │
└────────┬─┬┬─┬┬─┬───────┘ └────────┬─┬┬─┬┬─┬───────┘ │
│0││1││2│ │0││1││2│ │
└▲┘└▲┘└▲┘ └▲┘└▲┘└▲┘ ■
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ └─────────────┐ ┌──────────────────┘ │ │
│ └─────────────┐ │ │ ┌───────────────┘ │
└─────────────┐ │ │ │ │ ┌─────────────┘
│ │ │ │ │ │
┌┴┐┌┴┐┌┴┐ ... ┌───┴┐┌───┴┐┌──┴─┐
│1││2││3│ │NM-3││NM-2││NM-1│ ■
┌┴─┴┴─┴┴─┴─────┴────┴┴────┴┴────┴─┐ │
│ BroadcastExec │ │
│ ┌───────────────┐ │ Stage N-1
│ │ Batch Cache │ │ │
│ │ ┌─┐ ┌─┐ ┌─┐ │ │ │
│ │ │0│ │1│ │2│ │ │ │
│ │ └─┘ └─┘ └─┘ │ │ │
│ └───────────────┘ │ │
└───────────┬─┬─┬─┬─┬─┬───────────┘ │
│0│ │1│ │2│ │
└▲┘ └▲┘ └▲┘ ■
│ │ │
│ │ │
│ │ │
┌┴┐ ┌┴┐ ┌┴┐ ■
│0│ │1│ │2│ │
┌──────┴─┴─┴─┴─┴─┴──────┐ Stage N-2
│Arc<dyn ExecutionPlan> │ │
│ (task 1) │ │
└───────────────────────┘ ■§Many to many
┌────────────────────────┐ ┌────────────────────────┐ ■
│ NetworkBroadcastExec │ │ NetworkBroadcastExec │ │
│ (task 1) │ │ (task M) │ │
│ │ ... │ │ Stage N
│ Populates Caches │ │ Cache Hits │ │
└────────┬─┬┬─┬┬─┬───────┘ └────────┬─┬┬─┬┬─┬───────┘ │
│0││1││2│ │0││1││2│ │
└▲┘└▲┘└▲┘ └▲┘└▲┘└▲┘ ■
│ │ │ │ │ │
┌──────────┴──┼──┼────────────────────────────────┐ │ │ │
│ ┌──────────┴──┼────────────────────────────────┼──┐ │ │ │
│ │ ┌──────────┴────────────────────────────────┼──┼──┐ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ ┌─────────────────────────────────┼──┼──┼────┴──┼─┐│
│ │ │ │ ┌───────────────────────────┼──┼──┼───────┴─┼┼─────┐
│ │ │ │ │ ┌─────────────────────┼──┼──┼─────────┼┴─────┼────┐
│ │ │ │ │ │ │ │ │ │ │ │
┌┴┐┌┴┐┌┴┐ ... ┌──┴─┐┌──┴─┐┌──┴─┐ ┌┴┐┌┴┐┌┴┐ ... ┌──┴─┐┌───┴┐┌──┴─┐ ■
│0││1││2│ │3M-3││3M-2││3M-1│ │0││1││2│ │3M-3││3M-2││3M-1│ │
┌┴─┴┴─┴┴─┴─────┴────┴┴────┴┴────┴┐ ┌┴─┴┴─┴┴─┴─────┴────┴┴────┴┴────┴┐ │
│ BroadcastExec │ │ BroadcastExec │ │
│ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ Batch Cache │ │ │ │ Batch Cache │ │ │
│ │ ┌─┐ ┌─┐ ┌─┐ │ │ ... │ │ ┌─┐ ┌─┐ ┌─┐ │ │ Stage N-1
│ │ │0│ │1│ │2│ │ │ │ │ │0│ │1│ │2│ │ │ │
│ │ └─┘ └─┘ └─┘ │ │ │ │ └─┘ └─┘ └─┘ │ │ │
│ └───────────────┘ │ │ └───────────────┘ │ │
└───────────┬─┬─┬─┬─┬─┬──────────┘ └───────────┬─┬─┬─┬─┬─┬──────────┘ │
│0│ │1│ │2│ │0│ │1│ │2│ │
└▲┘ └▲┘ └▲┘ └▲┘ └▲┘ └▲┘ ■
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ■
│0│ │1│ │2│ │0│ │1│ │2│ │
┌──────┴─┴─┴─┴─┴─┴──────┐ ┌──────┴─┴─┴─┴─┴─┴──────┐ Stage N-2
│Arc<dyn ExecutionPlan> │ ... │Arc<dyn ExecutionPlan> │ │
│ (task 1) │ │ (task N) │ │
└───────────────────────┘ └───────────────────────┘ ■Notice in this diagram that each NetworkBroadcastExec sends a request to fetch data from each BroadcastExec in the stage below per partition. This is because each BroadcastExec has its own cache which contains partial results for the partition. It is the NetworkBroadcastExec’s job to merge these partial partitions to then broadcast complete data to the consumers.
Implementations§
Source§impl NetworkBroadcastExec
impl NetworkBroadcastExec
Sourcepub fn try_new(
input: Arc<dyn ExecutionPlan>,
producer_tasks: usize,
) -> Result<Self>
pub fn try_new( input: Arc<dyn ExecutionPlan>, producer_tasks: usize, ) -> Result<Self>
Creates a new NetworkBroadcastExec fed by the provided BroadcastExec. The input plan
will be executed in a remote worker in producer_tasks number of tasks.
Trait Implementations§
Source§impl Clone for NetworkBroadcastExec
impl Clone for NetworkBroadcastExec
Source§fn clone(&self) -> NetworkBroadcastExec
fn clone(&self) -> NetworkBroadcastExec
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for NetworkBroadcastExec
impl Debug for NetworkBroadcastExec
Source§impl DisplayAs for NetworkBroadcastExec
impl DisplayAs for NetworkBroadcastExec
Source§impl ExecutionPlan for NetworkBroadcastExec
impl ExecutionPlan for NetworkBroadcastExec
Source§fn properties(&self) -> &Arc<PlanProperties> ⓘ
fn properties(&self) -> &Arc<PlanProperties> ⓘ
ExecutionPlan, such as output
ordering(s), partitioning information etc. Read moreSource§fn children(&self) -> Vec<&Arc<dyn ExecutionPlan>>
fn children(&self) -> Vec<&Arc<dyn ExecutionPlan>>
ExecutionPlans that act as inputs to this plan.
The returned list will be empty for leaf nodes such as scans, will contain
a single value for unary nodes, or two values for binary nodes (such as
joins).Source§fn apply_expressions(
&self,
_f: &mut dyn FnMut(&Arc<dyn PhysicalExpr>) -> Result<TreeNodeRecursion>,
) -> Result<TreeNodeRecursion>
fn apply_expressions( &self, _f: &mut dyn FnMut(&Arc<dyn PhysicalExpr>) -> Result<TreeNodeRecursion>, ) -> Result<TreeNodeRecursion>
f to each root expression that this node owns and uses
during execution, either by evaluating it or updating it dynamically. Read moreSource§fn with_new_children(
self: Arc<Self>,
children: Vec<Arc<dyn ExecutionPlan>>,
) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
fn with_new_children( self: Arc<Self>, children: Vec<Arc<dyn ExecutionPlan>>, ) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
Use ExecutionPlan::replace_children with ReplaceChildrenOptions
Source§fn execute(
&self,
partition: usize,
context: Arc<TaskContext>,
) -> Result<SendableRecordBatchStream, DataFusionError>
fn execute( &self, partition: usize, context: Arc<TaskContext>, ) -> Result<SendableRecordBatchStream, DataFusionError>
Source§fn metrics(&self) -> Option<MetricsSet>
fn metrics(&self) -> Option<MetricsSet>
Metrics for this
ExecutionPlan. If no Metrics are available, return None. Read moreSource§fn statistics_from_inputs(
&self,
_input_stats: &[Arc<Statistics>],
args: &StatisticsArgs,
) -> Result<Arc<Statistics>>
fn statistics_from_inputs( &self, _input_stats: &[Arc<Statistics>], args: &StatisticsArgs, ) -> Result<Arc<Statistics>>
ExecutionPlan node,
given pre-computed child statistics. Read moreSource§fn static_name() -> &'static strwhere
Self: Sized,
fn static_name() -> &'static strwhere
Self: Sized,
name but can be called without an instance.Source§fn downcast_delegate(&self) -> Option<&(dyn ExecutionPlan + 'static)>
fn downcast_delegate(&self) -> Option<&(dyn ExecutionPlan + 'static)>
ExecutionPlan downcast identity. Read moreSource§fn check_invariants(&self, check: InvariantLevel) -> Result<(), DataFusionError>
fn check_invariants(&self, check: InvariantLevel) -> Result<(), DataFusionError>
Source§fn dynamic_expressions_produced(&self) -> Vec<Arc<dyn PhysicalExpr>>
fn dynamic_expressions_produced(&self) -> Vec<Arc<dyn PhysicalExpr>>
Source§fn required_input_distribution(&self) -> Vec<Distribution>
fn required_input_distribution(&self) -> Vec<Distribution>
Use input_distribution_requirements
Source§fn input_distribution_requirements(&self) -> InputDistributionRequirements
fn input_distribution_requirements(&self) -> InputDistributionRequirements
Source§fn required_input_ordering(&self) -> Vec<Option<OrderingRequirements>>
fn required_input_ordering(&self) -> Vec<Option<OrderingRequirements>>
ExecutionPlan. Read moreSource§fn maintains_input_order(&self) -> Vec<bool>
fn maintains_input_order(&self) -> Vec<bool>
false if this ExecutionPlan’s implementation may reorder
rows within or between partitions. Read moreSource§fn benefits_from_input_partitioning(&self) -> Vec<bool>
fn benefits_from_input_partitioning(&self) -> Vec<bool>
ExecutionPlan benefits from increased
parallelization at its input for each child. Read moreSource§fn replace_children(
self: Arc<Self>,
children: Vec<Arc<dyn ExecutionPlan>>,
options: ReplaceChildrenOptions,
) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
fn replace_children( self: Arc<Self>, children: Vec<Arc<dyn ExecutionPlan>>, options: ReplaceChildrenOptions, ) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
Source§fn with_new_children_and_same_properties(
self: Arc<Self>,
children: Vec<Arc<dyn ExecutionPlan>>,
) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
fn with_new_children_and_same_properties( self: Arc<Self>, children: Vec<Arc<dyn ExecutionPlan>>, ) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
Use ExecutionPlan::replace_children with ReplaceChildrenOptions
ExecutionPlan::replace_children instead.Source§fn reset_state(
self: Arc<Self>,
) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
fn reset_state( self: Arc<Self>, ) -> Result<Arc<dyn ExecutionPlan>, DataFusionError>
ExecutionPlan. Read moreSource§fn repartitioned(
&self,
_target_partitions: usize,
_config: &ConfigOptions,
) -> Result<Option<Arc<dyn ExecutionPlan>>, DataFusionError>
fn repartitioned( &self, _target_partitions: usize, _config: &ConfigOptions, ) -> Result<Option<Arc<dyn ExecutionPlan>>, DataFusionError>
ExecutionPlan to
produce target_partitions partitions. Read moreSource§fn partition_statistics(
&self,
partition: Option<usize>,
) -> Result<Arc<Statistics>, DataFusionError>
fn partition_statistics( &self, partition: Option<usize>, ) -> Result<Arc<Statistics>, DataFusionError>
Use StatisticsContext::compute instead
ExecutionPlan node. Read moreSource§fn child_stats_requests(&self, _partition: Option<usize>) -> Vec<ChildStats>
fn child_stats_requests(&self, _partition: Option<usize>) -> Vec<ChildStats>
StatisticsContext should resolve
before calling Self::statistics_from_inputs. Read moreSource§fn supports_limit_pushdown(&self) -> bool
fn supports_limit_pushdown(&self) -> bool
Source§fn with_fetch(&self, _limit: Option<usize>) -> Option<Arc<dyn ExecutionPlan>>
fn with_fetch(&self, _limit: Option<usize>) -> Option<Arc<dyn ExecutionPlan>>
ExecutionPlan node, if it supports
fetch limits. Returns None otherwise. Read moreSource§fn fetch(&self) -> Option<usize>
fn fetch(&self) -> Option<usize>
None means there is no fetch.Source§fn cardinality_effect(&self) -> CardinalityEffect
fn cardinality_effect(&self) -> CardinalityEffect
Source§fn try_swapping_with_projection(
&self,
_projection: &ProjectionExec,
) -> Result<Option<Arc<dyn ExecutionPlan>>, DataFusionError>
fn try_swapping_with_projection( &self, _projection: &ProjectionExec, ) -> Result<Option<Arc<dyn ExecutionPlan>>, DataFusionError>
ExecutionPlan. Read moreSource§fn gather_filters_for_pushdown(
&self,
_phase: FilterPushdownPhase,
parent_filters: Vec<Arc<dyn PhysicalExpr>>,
_config: &ConfigOptions,
) -> Result<FilterDescription, DataFusionError>
fn gather_filters_for_pushdown( &self, _phase: FilterPushdownPhase, parent_filters: Vec<Arc<dyn PhysicalExpr>>, _config: &ConfigOptions, ) -> Result<FilterDescription, DataFusionError>
ExecutionPlan::gather_filters_for_pushdown: Read moreSource§fn handle_child_pushdown_result(
&self,
_phase: FilterPushdownPhase,
child_pushdown_result: ChildPushdownResult,
_config: &ConfigOptions,
) -> Result<FilterPushdownPropagation<Arc<dyn ExecutionPlan>>, DataFusionError>
fn handle_child_pushdown_result( &self, _phase: FilterPushdownPhase, child_pushdown_result: ChildPushdownResult, _config: &ConfigOptions, ) -> Result<FilterPushdownPropagation<Arc<dyn ExecutionPlan>>, DataFusionError>
Source§fn with_new_state(
&self,
_state: Arc<dyn Any + Send + Sync>,
) -> Option<Arc<dyn ExecutionPlan>>
fn with_new_state( &self, _state: Arc<dyn Any + Send + Sync>, ) -> Option<Arc<dyn ExecutionPlan>>
Source§fn try_pushdown_sort(
&self,
_order: &[PhysicalSortExpr],
) -> Result<SortOrderPushdownResult<Arc<dyn ExecutionPlan>>, DataFusionError>
fn try_pushdown_sort( &self, _order: &[PhysicalSortExpr], ) -> Result<SortOrderPushdownResult<Arc<dyn ExecutionPlan>>, DataFusionError>
Source§fn with_preserve_order(
&self,
_preserve_order: bool,
) -> Option<Arc<dyn ExecutionPlan>>
fn with_preserve_order( &self, _preserve_order: bool, ) -> Option<Arc<dyn ExecutionPlan>>
ExecutionPlan that is aware of order-sensitivity. Read moreSource§fn try_to_proto(
&self,
_ctx: &ExecutionPlanEncodeCtx<'_>,
) -> Result<Option<PhysicalPlanNode>, DataFusionError>
fn try_to_proto( &self, _ctx: &ExecutionPlanEncodeCtx<'_>, ) -> Result<Option<PhysicalPlanNode>, DataFusionError>
Source§impl NetworkBoundary for NetworkBroadcastExec
impl NetworkBoundary for NetworkBroadcastExec
Source§fn with_input_stage(
&self,
input_stage: Stage,
) -> Result<Arc<dyn NetworkBoundary>>
fn with_input_stage( &self, input_stage: Stage, ) -> Result<Arc<dyn NetworkBoundary>>
Source§fn input_stage(&self) -> &Stage
fn input_stage(&self) -> &Stage
Source§fn producer_head(&self, consumer_task_count: usize) -> Result<ProducerHead>
fn producer_head(&self, consumer_task_count: usize) -> Result<ProducerHead>
Auto Trait Implementations§
impl !RefUnwindSafe for NetworkBroadcastExec
impl !UnwindSafe for NetworkBroadcastExec
impl Freeze for NetworkBroadcastExec
impl Send for NetworkBroadcastExec
impl Sync for NetworkBroadcastExec
impl Unpin for NetworkBroadcastExec
impl UnsafeUnpin for NetworkBroadcastExec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request