Receiver 分发详解

用 Receiver Wildcards 把 SAP PI Integration Flow 从接收方清单泥潭里解放出来 摘要:在SAP PI/PO集成项目中,当一条集成流的接收方数量从最初的3个逐渐扩展到30个甚至更多时,传统维护方式会陷入频繁修改流程、重复测试的困境。Receiver Wildcards机制通过将接收方配置从集成流程中抽离,利用XPath或ESR上下文对象动态确定接收方,有效解决了"接收方蜘蛛网"问题。该方法特别适用于接收方接口相似、仅通信参数不同的场景,使新增接收方只需维护Receiver Agreement而无需修改集成流程,显著降低了变更风险和运维成本,同时保持了集成设计的清晰性。(149字) 阅读详情

我们前面在 DStream, DStreamGraph 详解 讲到,整个 DStreamGraph 是由 output stream 通过 dependency 引用关系,索引到上游 DStream 节点。而递归的追溯到最上游的 InputDStream 节点时,就没有对其它 DStream节点的依赖了,因为InputDStream 节点本身就代表了最原始的数据集。

image

我们对 模块 3:数据产生与导入 细节的解释,是仅针对 ReceiverInputDStream 及其子类的;其它 InputDStream 子类的讲解,我们在另外的文章中进行。即,本模块的讨论范围是:

- ReceiverInputDStream
  - 子类 SocketInputDStream
  - 子类 TwitterInputDStream
  - 子类 RawInputDStream
  - 子类 FlumePollingInputDStream
  - 子类 MQTTInputDStream
  - 子类 FlumeInputDStream
  - 子类 PluggableInputDStream
  - 子类 KafkaInputDStream

ReceiverTracker 分发 Receiver 过程

我们已经知道,ReceiverTracker 自身运行在 driver 端,是一个管理分布在各个 executor 上的 Receiver 的总指挥者。

在 ssc.start() 时,将隐含地调用 ReceiverTracker.start();而 ReceiverTracker.start() 最重要的任务就是调用自己的 launchReceivers() 方法将 Receiver 分发到多个 executor 上去。然后在每个 executor 上,由 ReceiverSupervisor 来分别启动一个 Receiver 接收数据。这个过程用下图表示:

image

我们将以 1.4.0 和 1.5.0 这两个版本为代表,仔细分析一下 launchReceivers() 的实现。

1.4.0 代表了 1.5.0 以前的版本,如 1.2.x, 1.3.x, 1.4.x

1.5.0 代表了 1.5.0 以来的版本,如 1.5.x, 1.6.x

Spark 1.4.0 的 launchReceivers() 实现

Spark 1.4.0 的 launchReceivers() 的过程如下:

  • (1.a) 构造 Receiver RDD。具体的,是先遍历所有的 ReceiverInputStream,获得将要启动的所有 x 个 Receiver 的实例。然后,把这些实例当做 x 份数据,在 driver 端构造一个 RDD 实例,这个 RDD 分为 x 个 partition,每个 partition 包含一个 Receiver 数据(即 Receiver 实例)。
  • (1.b) 定义计算 func。我们将在多个 executor 上共启动 x 个 Task,每个 Task 负责一个 partition 的数据,即一个Receiver 实例。我们要对这个 Receiver 实例做的计算定义为 func 函数,具体的,func 是:
    • 以这个 Receiver 实例为参数,构造新的 ReceiverSupervisor 实例 supervisor:supervisor = new ReceiverSupervisorImpl(receiver, ...)
    • supervisor.start();这一步将启动新线程启动 Receiver 实例,然后很快返回
    • supervisor.awaitTermination();将一直 block 住当前 Task 的线程
  • (1.c) 分发 RDD(Receiver) 和 func 到具体的 executor。上面 (a)(b) 两步只是在 driver 端定义了 RDD[Receiver] 和 这个RDD 之上将执行的 func,但并没有具体的去做。这一步是将两者的定义分发到 executor 上去,马上就可以实际执行了。
  • (2) 在各个 executor 端,执行(1.b) 中定义的 func。即启动 Receiver 实例,并一直 block 住当前线程。

这样,通过 1 个 RDD 实例包含 x 个 Receiver,对应启动 1 个 Job 包含 x 个 Task,就可以完成 Receiver 的分发和部署了。上述 (1.a)(1.b)(1.c)(2) 的过程示意如下图:

image

这里 Spark Streaming 下层的 Spark Core 对 Receiver 分发是毫无感知的,它只是执行了“应用层面” — 对 Spark Core 来讲,Spark Streaming 就是“应用层面”– 的一个普通 Job;但 Spark Streaming 只通过这个普通 Job 即可完“特殊功能”的Receiver 分发,可谓巧妙巧妙。

上述逻辑实现的源码请到 Spark 1.4.0 的 ReceiverTracker 查看。

Spark 1.5.0 的 launchReceivers() 实现

其实上面这个实现,这个长时运行的分发 Job 还存在一些问题:

  • 如果某个 Task 失败超过 spark.task.maxFailures(默认=4) 次的话,整个 Job 就会失败。这个在长时运行的 Spark Streaming 程序里,Executor 多失效几次就有可能导致 Task 失败达到上限次数了。
  • 如果某个 Task 失效一下,Spark Core 的 TaskScheduler 会将其重新部署到另一个 executor 上去重跑。但这里的问题在于,负责重跑的 executor 可能是在下发重跑的那一刻是正在执行 Task 数较少的,但不一定能够将 Receiver 分布的最均衡的。
  • 有个用户 code 可能会想自定义一个 Receiver 的分布策略,比如所有的 Receiver 都部署到同一个节点上去。

从 1.5.0 开始,Spark Streaming 添加了增强的 Receiver 分发策略。对比之前的版本,主要的变更在于:

  1. 添加可插拔的 ReceiverSchedulingPolicy
  2. 把 1 个 Job(包含 x 个 Task),改为 x 个 Job(每个 Job 只包含 1 个 Task)
  3. 添加对 Receiver 的监控重启机制

我们一个一个看一看。

(1) 可插拔的 ReceiverSchedulingPolicy

ReceiverSchedulingPolicy 的主要目的,是在 Spark Streaming 层面添加对 Receiver 的分发目的地的计算,相对于之前版本依赖 Spark Core 的 TaskScheduler 进行通用分发,新的 ReceiverSchedulingPolicy 会对 Streaming 应用的更好的语义理解,也能计算出更好的分发策略。

ReceiverSchedulingPolicy 有两个方法,分别用于:

  • 在 Streaming 程序首次启动时:
    • 收集所有 InputDStream 包含的所有 Receiver 实例 —— receivers
    • 收集所有的 executor —— executors —— 作为候选目的地
    • 然后就调用 ReceiverSchedulingPolicy.scheduleReceivers(receivers, executors) 来计算每个 Receiver 的目的地 executor 列表
  • 在 Streaming 程序运行过程中,如果需要重启某个 Receiver:
    • 将首先看一看之前计算过的目的地 executor 还没有还 alive 的
    • 如果没有,就需要 ReceiverSchedulingPolicy.rescheduleReceiver(receiver, ...) 来重新计算这个 Receiver 的目的地 executor 列表

默认的 ReceiverSchedulingPolicy 是实现为 round-robin 式的了。我们举例说明下这两个方法:

image

其中,在 Receiver y 失效时,以前的 Spark Streaming 有可能会在 executor 1 上重启 Recever y,而 1.5.0 以来,将在 executor 2 上重启 Receiver y。

(2) 每个 Receiver 分发有单独的 Job 负责

1.5.0 版本以来的 Spark Streaming,是为每个 Receiver 都分配单独的只有 1 个 Task 的 Job 来尝试分发,这与以前版本将x 个 Receiver 都放到一个有 x 个 Task 的 Job 里分发是很不一样的。

而且,对于这仅有个一个 Task,只在第 1 次执行时,才尝试启动 Receiver;如果该 Task 因为失效而被调度到其它 executor 执行时,就不再尝试启动 Receiver、只做一个空操作,从而导致本 Job 的状态是成功执行已完成。ReceiverTracker 会另外调起一个 Job —— 有可能会重新计算 Receiver 的目的地 —— 来继续尝试 Receiver 分发……如此直到成功为止。

另外,由于 Spark Core 的 Task 下发时只会参考并大部分时候尊重 Spark Streaming 设置的 preferredLocation 目的地信息,还是有一定可能该分发 Receiver 的 Job 并没有在我们想要调度的 executor 上运行。此时,在第 1 次执行 Task 时,会首先向 ReceiverTracker 发送 RegisterReceiver 消息,只有得到肯定的答复时,才真正启动 Receiver,否则就继续做一个空操作,导致本 Job 的状态是成功执行已完成。当然,ReceiverTracker 也会另外调起一个 Job,来继续尝试 Receiver分发……如此直到成功为止。

我们用图示来表达这个改动:

image

所以通过上面可以看到,一个 Receiver 的分发 Job 是有可能没有完成分发 Receiver 的目的的,所以 ReceiverTracker会继续再起一个 Job 来尝试 Receiver 分发。这个机制保证了,如果一次 Receiver 如果没有抵达预先计算好的 executor,就有机会再次进行分发,从而实现在 Spark Streaming 层面对 Receiver 所在位置更好的控制。

(3) 对 Receiver 的监控重启机制

上面分析了每个 Receiver 都有专门的 Job 来保证分发后,我们发现这样一来,Receiver 的失效重启就不受spark.task.maxFailures(默认=4) 次的限制了。

因为现在的 Receiver 重试不是在 Task 级别,而是在 Job 级别;并且 Receiver 失效后并不会导致前一次 Job 失败,而是前一次 Job 成功、并新起一个 Job 再次进行分发。这样一来,不管 Spark Streaming 运行多长时间,Receiver 总是保持活性的,不会随着 executor 的丢失而导致 Receiver 死去。

总结

我们再简单对比一下 1.4.0 和 1.5.0 版本在 Receiver 分发上的区别:

imageimage

通过以上分析,我们总结:

  Spark Streaming 1.4.0 Spark Streaming 1.5.0
Receiver 活性 不保证永活 无限重试、保证永活
Receiver 均衡分发 无保证 round-robin 策略
自定义 Receiver 分发 很 tricky 方便

 

转自:GitHub

https://github.com/proflin/CoolplaySpark/blob/master/Spark Streaming 源码解析系列/3.1 Receiver 分发详解.md

转载请注明:人人都是数据咖 » Receiver 分发详解

从 Sender 到 Receiver,读懂 SAP Cloud Integration 里 Integration Flow 的核心元素 文章摘要:SAP Cloud Integration中的Integration Flow不是简单的流程图,而是一个可执行的集成处理模型。它由sender、receiver、adapter和step等核心元素组成,共同定义消息在租户环境中的完整处理流程。Integration Flow关注的是消息如何被转换、路由和处理,而不仅是从A到B的数据传输。adapter决定系统连接方式,step实现具体处理逻辑,整个模型清晰地展现了消息的生命周期。理解这些基础元素对后续学习映射、路由等高级功能至关重要。 阅读详情

相关推荐

Android 12.0 禁止第三方应用开机自启动功能实现

在12.0的系统rom定制化开发过程中,在某些场景下对于注册了接收开机广播后,会自启动的应用, 在某些时候不希望第三方应用启动,接下来分析下接收开机广播流程,然后实现相关功能

安卓兼职framework和app工程师的博客 93

SparkStreaming随笔之Receivcer

1.sparkstreaming的receiver启动流程。      首先是:StreamingContext的start方法。     然后到JobScheduler的start方法,这个时候已经产生了ReceiverTracker对象。   ReceiverTracker对象调用了start方法。start方法中核心代码如下:          if (!receiverInputS...

u014733604的博客 276

QUARTUS II 编译报错Error: Run Generate Functional Simulation Netlist的解决方案

QUARTUS II 编译报错Error: Run Generate Functional Simulation Netlist (...) to generate functional simulation netlist for top level entity bmg_control before running the Simulator (quartus_sim)的解决方案

史上最详细!那些你不知道的WorkManager流程分析和源码解析

WorkManager的使用方法简单,但是在使用时还是要分清场景,适用于可延迟,周期性,必须执行完成的任务。通过对源码的分析,WorkManager会针对不同Android版本的选择适当的策略。细致阅读代码,会发现针对指定的系统版本还有一些小的优化点。WorkManager目前已经比较稳定,所以如果在场景适合的情况下,推荐使用WorkManager来代替原有的任务管理方案。**千里之行始于足下。

2401_85730312的博客 1311

ZEMAX学习第7天-手机镜头光学系统设计全过程案例

接下来对系统微调,依次缩小CRA和畸变,首先对CRA进行依次递减(39°、38°、37°、36°、35°),目前CRA角度40度,每次下降一度进行优化,利用MAXX加OPLT一起控制,控制小于35°。可以看出在标注的三个地方镜头曲率变化,导致PY=1的光线走向奇特,因此需要对矢高进行调整,按照标注的地方依次调整(从右到左)至传函变好,越靠近右边对其余视场影响越小。3.圆锥系数值较大,透镜形状怪异;一、第1,3镜子偏厚,第4镜子偏薄,45镜子间隔边缘偏小,第5片镜子中心厚度与边缘厚度相差较大,需要控制;

liningliwei的博客 1065

AUTOSAR BswM配置实战:手把手教你用Vector Davinci Configurator搭建第一个模式管理规则

本文详细介绍了如何使用Vector Davinci Configurator工具配置AUTOSAR BswM模块,实现车身控制ECU的模式管理规则。通过实战案例,从环境准备、核心概念梳理到具体配置步骤,包括ModeRequestPort、ModeCondition、Logical Expression和Rules的构建,帮助工程师快速掌握BswM配置技巧,提升汽车电子软件开发效率。

weixin_28678831的博客 351

WorkManager流程分析和源码解析

本文字数:2830字预计阅读时间:20分钟01 前言WorkManager统一了对于Android后台任务的管理。在此之前,从6.0开始Google引入了Doze机制,并且在之后的几个版...

SOHU_TECH的博客 1285

基于拟蒙特卡洛模拟法的随机潮流计算matlab程序

由式(4-11)可知,蒙特卡洛模拟法的计算量不受电力系统规模大小影响,因此该方法在一些复杂的电力系统中可以得到应用,包括处理电力系统中有多个间歇性新能源接入的问题,解决系统中多个节点之间相关性问题等等。本章在此基础上提出了基于拟蒙特卡洛模拟的随机潮流计算方法,并且对拟蒙特卡洛法中的拟随机数序列进行了改进,大大提高了随机潮流的计算效率。模拟法的具体思路如下:基于实际工程问题的求解需要,建立与之相对应的随机模拟过程和随机概率模型,使得它们的参数,包括概率分布或者数学期望,能够等于问题的实际解;

weixin_47365903的博客 1793

2024年安卓最新史上最详细!那些你不知道的WorkManager流程分析和源码解析,嵌入式软件开发面试题库

*要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2301_82242990的博客 445

ROS阿克曼小车避坑指南:TEB Local Planner参数调优实战(附完整配置文件)

本文针对ROS阿克曼底盘机器人,提供了TEB Local Planner参数调优的实战指南。文章深入剖析了阿克曼模型与TEB的协同工作原理,重点讲解了`min_turning_radius`、`cmd_angle_instead_rotvel`等关键参数的设置与调试方法,并分享了性能优化、避障行为调整的实用技巧,旨在帮助开发者避开常见陷阱,实现小车在复杂环境中的稳定、高效导航。

ik6789012的博客 500

基于STM32的工业设备状态监测系统

工业设备的预测性维护需求日益增长,本文设计了一款基于STM32的智能监测终端,可实时采集设备振动、温度、电流等关键参数,通过边缘计算分析设备健康状态,实现故障预警与能效优化。系统支持4G/LoRa远程通信,适用于工厂、发电站等工业场景。本系统实现了工业设备关键参数的实时监测,故障识别准确率达到92%。:STM32F429(带FPU,支持浮点运算)多参数联合判据(振动+温度+电流突变检测)ACS712电流检测模块(0-30A)FFT频谱分析(识别轴承故障特征频率)故障代码生成(支持16种预设故障类型)

stm32d1219的博客 1321

receiver分发

[酷玩 Spark] Spark Streaming 源码解析系列 ,返回目录请 猛戳这里 「腾讯·广点通」技术团队荣誉出品 本系列内容适用范围: * 2016.12.28 update, Spark 2.1 全系列 √ (2.1.0) * 2016.11.14 update, Spark 2.0 全系列 √ (2.0.0, 2.0.1, 2.0.2) * 2016.11.07 upda

433

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 396

Spark Streaming之Receive分发

以Socket为例,SocketInputDStream对应的流数据接收器为SocketReceiver,在SocketInputDStream中通过getReceiver方法获取该流数据接收器: 在StreamingContext启动过程中,ReceiverTracker会把流数据接收器Receiver分发到Executor上,在每个Executor上,由ReceiverSuper...

wql_zero的博客 523

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 937

OpenClaw-遇到的问题-Health check failed: gateway closed (1006 abnormal closure (no close frame)): no clos

OpenClaw网关服务安装成功但运行异常,显示健康检查失败(错误代码1006)。系统提供了Web控制界面(http://127.0.0.1:18789/)和带令牌的安全访问链接。文档建议参考故障排除指南,并提供了可选应用扩展功能(包括移动端支持)。注意运行本地代理存在安全风险,建议加固系统配置。若需启用网络搜索功能,需配置Brave搜索API密钥。安装完成后会自动打开仪表盘,需保持浏览器标签页以控制OpenClaw服务。

直到世界的尽头 1万+

CC Switch v3.9.0 深度解析:本地 API 代理、自动故障转移与 Universal Provider 的实现原理

CC Switch v3.9.0 是 v3.9 系列预发布版(`3.9.0-1`、`3.9.0-2`、`3.9.0-3`)之后的正式稳定版,于 2026-01-07 发布。该版本的核心主题是:在本地启动一个 Axum 高性能 HTTP 代理服务,统一接管 Claude Code / Codex / Gemini CLI 的 API 请求,并在此基础上叠加自动故障转移(熔断器 + 应用级故障转移队列

gitblog_00880的博客 651

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android系统MotionEvent处理Receiver端基本原理总结

android

fisher_2005的专栏 3988

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Kafka整合Spark Streaming —— Receiver模式

Kafka整合Spark Streaming的两种模式:Receiver模式和Direct直连模式。本篇先来介绍Receiver模式,讲述Receiver模式的原理,以及Receiver模式存在的问题和相关的解决办法。虽然在生产中,一般都会选择Direct直连模式来进行Kafka和Spark Streaming的整合,甚至在新版中已经将Receiver模式拿掉了,但了解一下总归是没有坏处的。如果想直接了解Direct模式,请看下篇 Kafka整合Spark Streaming之Direct模式

分享AI工具/AI副业玩法 589

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

BroadcastReceiver源码分析,android实战项目健身

1 mRegisteredReceivers是个HashMap<IBinder, ReceiverList>,这个Binder就是IIntentReceiver,ReceiverList记录了所有的这个与IIntentReceiver对应的接收者,将注册接收者添加到Map中 二、普通广播发送后的动态接收 ============================================================================ 2.1 调用Context的sendBr

m0_64604042的博客 743

Android广播发送过程分析

该文章主要分析Android广播发送的顺序 1、既然分析Broadcast的发送过程,那么先从sendBroadcast(intent)源码为入口。 这里可以直接看(https://my.oschina.net/winHerson/blog/91150) 该博客。从该博客一路跟下来发现以下代...

chengjiang6065的博客 231

Spark Streaming的接收KAFKA的数据

https://github.com/lw-lin/CoolplaySpark/blob/master/Spark%20Streaming%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%B3%BB%E5%88%97/3.1%20Receiver%20%E5%88%86%E5%8F%91%E8%AF%A6%E8%A7%A3.md https://github....

weixin_34357267的博客 250

Android SensorService源码分析(二)

继续上一篇文章,继续分析关于SensorService的第三和第四部分: 三: 应用注册Sensor数据监听的过程 四: sensor数据分发的过程三 应用注册Sensor数据监听的过程。1 SystemSensorManager 的 registerListenerImpl 函数 protected boolean registerListenerImpl(SensorEventList

zhangyawen1i的专栏 4518
上一篇: JobScheduler, Job, JobSet 详解
下一篇: Linux下统计当前文件夹下的文件个数、目录个数
Next__One
博客等级 码龄9年 14粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值