当前位置: 首页 > news >正文

3.3.5 VO-O语法- 高级语法

        VO语言还提供了一些个性化的高级语法特性,这些语法特性有别于传统的编程语言。但可以更好的帮助开发者实现高效、稳定的生产级数据流程。

调度运行

        在现行的编程语言中,调度运行不在语法表示范围之内。这属于具体的代码实现逻辑。但在VO语言设计中,调度运行是一种原生的特性。VO语言有别于图灵完备的通用开发语言,其属于面向数据科学的一种领域描述语言,是图灵不完备的,类似SQL语言。从诞生之日起,其就内置了算子调度运行的语义。VO语言解释器缺省为每个算子分配一个独立线程,确保数据流在算子间可并行执行,最大程度的确保程序的运行效率。这种语言设计可大大降低开发者的使用和学习成本,编写出的程序可直接满足数据科学类应用场景的性能需求。是VO语言带给开发者的一种语法糖。

        调度运行是通用容器算子流程算子提供的原生特性,在使用VO语言的开发过程中,你并不能拖拽一个流程算子,但流程算子始终存在。创建数据流程时,缺省会创建一个流程算子用于管理流程逻辑。当流程逻辑比较复杂,拖入了太多算子时,可以选中多个算子进行打包,形成一个内部函数,这个内部函数的容器就是一个流程算子。流程算子的外观如下图:

        通过点击流程算子的运行切换按钮来转换流程内的算子是以并行方式被调度,还是以串行方式被调度。串行方式执行时,容器内的所有算子共享同一个线程。是否选用串行方式运行时一般有2个前提,一是流程非常复杂,拥有几百个算子,如果并行运行势必会占用操作系统过多的线程资源。若同时有多个此类数据流程运行会导致物理机资源紧张,此时可以考虑是否切换为串行运行;二是被设计为串行运行的流程中不存在可能造成性能瓶颈的算子,算子逻辑都比较简单。此时可以考虑是否切换为串行模式,否则无需考虑切换运行方式。

水位线

        水位线是VO语言为数据集打上的数据标记。此概念与Spark、Flink中的水位线的概念基本一致,可以用来标记数据处理的进度。除此外,VO语言中的水位线还有类似事务边界的作用。VO语言中的任何算子在发现水位线变化时,都会从触发输出端口发出一个水位线变更的事件,从而触发后续算子的运行,形成一个类似事务的同步控制。被触发的算子会检查已收到的数据集的水位线是否包含触发事件中的水位线,若包含则触发算子运行。

        在数据流程中,可以通过“添加水位线”(AddWaterMark)算子和“清除水位线”( ClearWaterMark)算子来设置和清除水位线。这两个算子都无需参数配置。开发者在流程中加入“添加水位线”算子后,所有流经该算子的数据集都会被打上一个唯一的水位线标记。后续的算子对数据集的操作不会改变水位线标记。例如一个数据集拆分算子,若带水位线的集合被拆解成多个数据集,则每个数据集都有一个当前水位线的标记;如果是合并数据集,那么最后一个数据集的水位线会被标记在合并后的数据集上。

                        若算子有多个输入端口,需要对多个输入端口的数据集做聚合。VO没有强制语义要求两个数据入口的水位线必须相同才能做聚合。开发者应当自行确保参与计算的水位线的时序是相同的。合并后的数据集的水位线缺省使用的是算子图元最上面的那个数据端口的水位线。

水位线变量

        VO语言提供的开发场景中,目前只有数据集和算子参数。如果数据场景比较复杂,后续算子需要一个位置比较靠前的前置算子中信息时,就必须将这个信息放在数据集中向下传输。尽管这个信息可能对绝大多数算子来说都无用,但仍需耗费一定的存储和CPU时间去传递和复制这些信息。有一些Workflow及数据科学工具就采用了这种方案。但这种方案太过冗余。

        VO语言为解决此类问题,为水位线加入了一个水位线变量的概念。可以通过“添加水位线变量”(AddWaterMarkVariable)算子将数据流中需要的参数信息存入水位线变量,在后续的算子中,通过getWMV(paramName)函数获取水位线对应的参数值。在这里,可以视每个水位线都有一个自己的变量存储空间。当算子调用getWMV(paramName)时,获取的是当前水位线空间内的参数值。

        如上图,设置水位线变量把CSV读取算子输出的文件名(streamName)重新命名为fileName,保存在了水位线空间中,而后流程删除了streamName列,又使用列添加算子添加了streamName列,并用水位线变量中的fileName参数值作为列的缺省值。使用getWMV函数时需要注意,不能直接使用参数名fileName,必须使用'fileName'。因为,在算子的语境中,所有的变量都是指数据集的列名。由于水位线变量会占用一定的存储空间,对于数据量较大的数据流程,可以使用“清除水位线变量”(ClearWaterMarkVariable)算子清除掉不再有用的水位线变量。

数据复制

        VO语言的解释运行被设计为效率优先,即数据集在传输过程中,如果一个算子的输出端口同时接了多个算子的输入端口,那么每个算子收到的数据集是同一个数据集。如果后续算子都只是读取数据集而不对数据集进行维护,则不会有任何问题。否则,当多个算子同时维护同一个数据集时,就会引发数据不一致的问题。此时,开发者需要显示的加入数据集复制算子,确保后续的数据集操作彼此不产生冲突。

数据集复制

        数据集复制算子不需要配置参数,会根据连接的算子数自动为每一个数据集复制数据集,确保每个算子都获得一个独立的数据集。

数据流复制

        VO语言的算子中有一类特殊的数据集,就是数据流集合。这类数据集由于数据流本身的不可重读性,所以输出端口缺省只能有一个合法的数据连接。如果希望一个数据流集合可以同时被多个后续算子访问,需要在流程中加入一个数据流复制算子。该算子无需配置参数,与数据集复制算子一样,其也可根据输出端口连接的算子数量自动复制数据流集合。

相关文章:

  • 大语言模型中Token的输出过程
  • vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】
  • Python 编程题 第八节:字符串变形、压缩字符串、三个数的最大乘积、判定字符是否唯一、IP地址转换
  • KL散度详解与应用
  • FTP 与 TFTP 的详细异同点
  • 信号与系统笔记——第二章 连续系统的时域分析(三)
  • 复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration
  • 【面试】Kafka
  • OpenCV实现图像分割与无缝合并
  • Jenkins实现自动化构建与部署:上手攻略
  • 机器学习 Day03 Numpy基本使用
  • 2025 ubuntu24系统宿主机上在线安装mysql数据库完整演示
  • Python连接SQL SEVER数据库全流程
  • 基于大模型的结节性甲状腺肿诊疗全流程预测与方案研究报告
  • 【原理理解】图像SNR信噪比理解
  • 关于JSONArray转换为JSONObject的问题解决
  • 第四章:表单与交互:打造你的「数据捕手」
  • 攻防世界 file_include【php://filter详解】
  • Reactor中的Flux和Mono的区别
  • 【2025】基于PHP+Vue的电影购票系统(源码+文档+调试+图文修改+答疑)
  • 8000余万元黄金投入研发后“不知去向”,咋回事?
  • 一周观展|一批重量级考古博物馆开馆:从凌家滩看到孙吴大墓
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • 上博东馆常设陈列入选全国博物馆“十大精品”
  • 公示资费套餐、规范营销行为,今年信息通信行业将办好这十件实事
  • 江西4人拟任县(市、区)委书记,其中一人为“80后”