在画布上编织数据流:HuggingFists的努力与追求
摘要:HuggingFists是一款面向全结构数据处理的低代码Workflow工具,通过可视化界面实现高效的数据流程编织。该系统提供组件区、设计区和属性区三大功能模块,支持算子拖拽、端口连接、变量设置等操作,并具备调试、断点检测、性能优化等功能。其创新性地采用流程树和容器算子设计,支持复杂数据处理逻辑的可视化构建,同时通过批处理、死锁检测等机制保障运行稳定性。该工具旨在降低数据处理门槛,提升开发效
自第一台电子计算机启动之日起,如何处理数据、释放数据的价值,便成为贯穿其进化史的永恒命题。从数据库、数据仓库、大数据到人工智能,技术不断迭代发展,但其底层驱动力始终如一:“利用并发现数据的价值”。
我们所在的宇宙和社会,已经被我们通过各种形式投影为计算机中的各类数据。数据的多样、复杂性是我们始终面临的问题。每当我们在技术上进步到一个新的阶段,伴随着该类技术应用的不断成熟,必然会寻求更高效的运用手段来解决面向复杂数据应用的成本问题。而低代码的Workflow技术就是面向该类问题中最常见的一种方案。从开源到商业,我们见证了太多这类优秀的工具,比如:Kettle,StreamSet,KNIME,RapidMiner,SPSS,SAS Workflow,Palantir AIP等等,等等,不胜枚举。而此类工具如果想被使用者接受,并流行开来,其界面必须拥有良好的交互性及易用性,且在相同工作目标下,必须比编程有一个数量级的效率优势。
HuggingFists是一款拥有全结构数据处理能力的低代码Workflow工具。其在非结构化数据处理方面的能力与目前国内众多厂商极力效仿的Palantir AIP系统类似。HuggingFists为支持这种在画布上编织全结构数据处理流的能力,进行了大量,细致的界面布局及交互设计工作。只为给使用者带来更高效、便捷的使用体验。HuggingFists的流程编织界面如下:
从密密麻麻的功能标注可以看到,其为数据流程的编制提供了大量辅助功能。这些辅助功能可以帮助流程编织者快速编写数据流程,并方便的验证流程的逻辑正确性。
使用时,使用者从系统左侧组件区选择合适的算子或子流程,将其拖拽到设计区的设计面板上。每个算子或子流程在设计面板中被表示为一个算子图元。每个算子图元基于自身的功能特点会带有[0,n]个输入端口及[0,n]个输出端口。使用者根据流程逻辑,建立算子的输出端口与输入端口间的连线,表示数据流向。点击算子图元,系统会在界面右侧的属性区展示算子的可配置属性,使用者可参考帮助区的算子帮助,正确设定算子的属性。使用者依次拖拽算子或子流程到设计面板,直到构建完流程。构建完流程后,点击“保存”按钮保存流程。保存流程后,可调试或试运行流程,判断流程的逻辑正确性。在流程的逻辑得到充分验证后,可以点击发布按钮,发布流程,并为流程安排合适的执行调度作业。
下面我们介绍一下HuggingFists在流程编织方面的努力与追求的成果,更多的细节可参看:https://datayoo-doc.feishu.cn/wiki/JwKiwuBJWi9XfqkU7fqckoZonZf:
组件区
算子库
算子库以树形方式展示,它提供了编辑流程所需的基本功能。使用时,用户在树上选中算子,将其拖拽到流程设计面板。设计面板上会出现算子对应的算子图元,可以可视化与算子图元进行交互,完成配置和控制。
子流程
系统以流程树的形式返回所有流程。选中任意流程将其拖拽到设计面板,系统会为流程自动创建一个“流程引用”算子,算子输入、输出端口与流程的定义一致。流程中定义的变量会作为“流程引用”算子的参数。如下图:
设计区
输入端口
当使用者设计一个子流程,且流程可以接收前置算子的数据输入时,流程内部能够接收输入数据的算子需要连接该输入端口表明可以从外部向其输入数据。这类似于编写函数时,设定的函数的入参。每个流程可以支持多个输入端口,每当有算子与输入端口相连,系统会在设计面板中自动扩展一个可连接的输入端口。每个输入端口支持后续对接多个内部算子。如下图:
与编写函数一样,如果希望定义流程可以接受的数据集结构。可以在右侧的控制面板中编辑数据集的结构。点中要定义结构的输入端口,在右侧控制面板中编辑数据集结构。有些情况下,若与该端口连接的算子端口有固定的数据集结构要求,该结构会成为输入端口缺省的结构定义。即输入到流程的数据集结构必须满足内部算子的数据集结构要求。上图中的“列添加”算子由于没有特定列集结构的要求,因此,其含义为可以接受任意结构的数据集。
输出端口
当使用者设计一个子流程,且流程可以向后置算子输出数据时,流程内部能够输出数据的算子需要连接该输出端口,表明可以向外部输出数据。这类似于编写函数时,函数的返回值。每个流程可以支持多个输出端口,每当有算子与输出端口相连,系统会在设计面板中自动扩展一个可连接的输出端口。允许多个内部算子将结果从一个输出端口输出,但要求多个内部算子的输出数据集的结构必须相同。如上图。
结果端口
除API流程外,结果端口不是真实意义上的数据结果端口。其本质是为方便使用者调试流程,通过查看结果,快速验证流程逻辑是否正确的。系统中,流程每次运行都会产生一个任务,写出到结果端口的数据都会被持久化并与该任务绑定。使用者可随时回溯任务,查看任务结果,并基于此调整流程逻辑。由于写出到结果端口的数据会被保留一段时间,因此,不能存放太大的数据结果,占用系统太多的资源。结果端口缺省允许存放的最大数据条数为1000条,即写出到结果端口的前1000条数据。该数值可以修改,参见配置计算资源中的最大输出结果条数的参数。结果端口也支持同时与多个相同数据集结构的算子端口相连,但建议每个算子端口单独连接。这样的连接更便于发现流程的逻辑问题。
运行流程
系统调度运行当前正在设计的流程。若流程未保存,系统提示先对流程进行保存。流程被调度运行后,会产生一个任务,可通过该任务回溯流程的运行状态。采用“运行”模式运行的流程,会忽略流程中的断点。
调试流程
系统以调试模式调度运行当前正在设计的流程。若流程未保存,系统提示先对流程进行保存。流程被调度运行后,会产生一个任务,可通过该任务回溯流程的运行状态。调试模式运行的流程会在碰到断点时中断算子的运行,等待使用者的控制命令。
运行到指定算子
在设计面板中选中一个算子,点击“运行到指定算子”按钮。系统会动态计算出要执行的子流程,子流程以选中的算子作为流程的最后一个算子。“运行到指定算子”的功能可以方便使用者对流程进行分段测试运行,而不必全流程运行,占据更多的计算资源和运行时间。
调试到指定算子
“调试到指定算子”的功能与“运行到指定算子”的功能基本一致,最大的不同是它可以响应流程中设置的断点。
配置计算资源

作业节点
选择流程在哪个计算节点上运行,“.*”代表任意计算节点都可以。也可以通过下拉单选取某个具体的计算节点,在指定的计算节点上运行。
数据集批大小
HuggingFists系统运行时采用批处理的计算方式。每一批数据用数据集描述,数据集的大小缺省为100。使用者可以通过调整数据集大小实现数据性能调整。当该值调整为1时,表示每条数据都是被单独处理的。
最大输出结果条数
设置结果端口最大的数据输出条数。缺省值为1000,该值不宜设置的过大。所有输出结果会被存储,并于产生结果的任务的生命周期一致。极端情况下,若输出结果过大,会导致系统无法有效存储而引发任务的状态异常。某些情况下,单条数据过大,也会引发此类问题。
线程阻塞等待时间
HuggingFists系统会在运行时对流程进行死锁检测。当系统监测到某个算子非健康状态的长期占用线程时,系统会抛出线程阻塞的异常,中断流程运行。“线程阻塞等待时间”即用来判断算子是否死锁的线程占用时长参数,该值缺省为3600秒。若某业务确实会让算子长期占用计算线程,则可以合理的设置该值,以确保流程能够正常运行。如:某个聚类算法,其对10万条数据计算需要2小时才能计算完成,则该值应该适当的增大。
运行检测为死循环的最大阈值
HuggingFists系统会对使用了Loop算子的流程进行死循环检测。当一个数据集在Loop中循环了指定次数还没有退出时,系统认为其进入了死循环状态,会抛出死循环异常并中断流程。该属性缺省值为10000。
忽略执行错误次数
在数据处理过程中总会碰到异常数据,这些数据会引发算子运行报错,从而中断流程运行。HuggingFists系统支持设定错误的容错次数以确保个别异常数据不会中断整个数据的处理流程。若设定数值为3表示数据处理过程中允许3条异常数据存在,当算子运行失败后,不中断流程运行,继续处理后续数据。当有第四条异常数据时,算子抛出异常,中断流程运行。该值缺省为0.
数据流最大速率
由于流程中各个算子的处理性能不同,运行较慢的算子会导致数据的积压。若要处理的数据规模很大,这种积压很可能导致系统内存占用过大,从而引发内存溢出,流程运行失败。为防止在处理海量数据时,这种生产、消费速度不均引起的内存积压。可以设定一个系统每秒可处理的数据集最大速率来平衡算子间的性能差异。若该值为10,表示流程的算子间每秒最大流转10个数据集,性能高的算子受此限制,无法向下游算子生产超过10个数据集的数据,从而可以缓解数据流下游算子的计算压力。该属性缺省值为-1,表示不对最大速率做限制。该值往往需要与“数据流最大缓存”属性配合使用,以达到海量数据处理的最佳控制性能。
数据流最大缓存
该属性用于设定算子可缓存的最大数据集数量。当算子因为处理性能不够,积压的数据集数量达到该阈值时,系统会降低该算子的所有前置算子的处理速度,缓解当前算子的数据积压问题。该参数采用延长数据的处理时间来缓解内存占用而可能导致的内存溢出问题,为处理海量数据可能的内存溢出问题提供运行健壮性的选择。该属性缺省值为-1,表示不做最大缓冲限制,数据处理速度优先。
检查点缓存周期
对于可持续运行的算子,如:Kafka输入算子、邮件输入算子、数据库日志采集算子等,需要定期向服务器同步检查点,记录数据读取的位置,以免重复读区。该属性描述了每隔多长时间,算子向服务器同步一次检查点信息。同步频率高,容错性强,但服务器的压力也会比较大。该属性的缺省值为:10秒。
记录血缘信息
缺省为记录血缘信息,即流程运行时记录流程中设计的输入/输出实体信息。若流程要处理的数据实体很多,且没有必要记录留存,可关闭此项,减少流程运行期间的数据传输及存储。
打包算子
在设计面板中选中多个算子,点击“打包为容器算子”按钮
多个算子被打包为一个容器算子,容器算子会根据连接状况动态产生容器端口。
容器算子内部为选中的多个算子,如下图
拆包算子
选中一个容器算子,点击“拆分为单个算子”按钮
算子被复原回原来的样子

发布流程
若流程已经设计编写完成,需要将其发布成接口或定义成作业。需要点击“发布”按钮,将流程从草稿态发布为正式版本。系统其它模块在使用流程时,只能选择流程的正式版使用。
添加注释
可以为流程或算子添加注释,帮助使用者更好的编写流程。可以改变注释大小,为注释设定颜色以及为注释设定文字及文字的位置。
属性区-流程信息
点击设计面板的空白处,属性区展示流程的基本信息。
属性区-属性
放大属性框
点击“放大属性配置面板”按钮,系统会将属性区中的属性以弹出窗口的方式进行展示。弹出窗口放大了属性区的大小,更容易进行系统交互。
定位属性帮助
使用算子时,使用者可能会存在不知道如何填充属性的情况,可以通过点击该按钮迅速定位到属性的相关帮助。帮助使用者更快速的了解属性的含义和填充策略,快速掌握算子的用法。
属性区-端口
选中算子,点击算子的任意端口。可以展示出算子端口输入/输出的数据集结构。若算子没有数据连接时点击算子,获得的是端口声明的输入/输出数据集结构。对于输入端口而言,其表示连接到该端口的数据连接的数据集结构必须与输入端口的数据集结构兼容。通过了解算子端口的数据集结构,使用者可以清晰了解流程中每一步的上下文数据结构。这相当于使用编程语言编程时需要了解每个函数的输入参数与返回结果一样,是非常重要的。
很多时候,使用者并不清晰一个输出端口或一个输入端口能接哪些算子?此时,选中算子端口,点击“可连接算子”TAB页,可以看到能够与当前端口连接的所有算子
可以从可连接算子中选一个希望使用的算子,将其从右侧面板拖拽到流程设计面板。
帮助区
在流程设计面板中选中一个算子,在系统的帮助区会展示该算子的帮助信息,包括:算子名,算子描述,输入/输出端口信息以及属性信息。使用者可以通过算子帮助了解算子的功能及各属性的用法。
辅助区
在辅助区里点击对应的TAB按钮,辅助区会从界面下方动态滑出辅助窗口。当需要隐藏窗口时,二次点击TAB按钮即可。
变量
变量辅助区内管理了流程相关的所有变量。主要为占位符变量和控件变量两种。
若希望流程中的某个算子参数在流程运行时才被指定,则可以将该参数设置为变量。一种方法是将其设置为控件变量,可参见添加为控件变量;一种方法是将参数设置为占位符变量,即将参数值设置为${var}格式。系统会自动提取占位符信息填充变量窗口,如上图所示。需要为每个变量设置缺省值,否则流程无法正常保存。流程中若多个参数被设置为同一个变量名,则视为定义了一个复用的变量。
变量之间可以设置引用关系,即可以为一个变量赋值时,使用另一个变量作为其值的一部分。变量值设置时支持常数,表达式以及函数等形式。变量窗口也支持删除一个不再使用的变量。
版本信息
版本辅助区内管理了流程的所有版本,界面如下:
流程的相关流程
相关流程辅助区管理了与当前流程相关的所有流程。包括其在流程中使用了哪些流程,以及哪些流程使用了当前流程。通过相关流程可以了解,当前流程如果删除或修改会影响到哪些相关流程。界面如下:

断点
断点辅助区管理了当前流程中设置的所有断点。在断点列表中可以看到断点对应的算子名,端口名。可以为断点设置触发条件,触发条件采用MOQL语法描述。比如前置数据输入a,b,c三个整数列,断点希望在a列数值为1时触发断点,则设置触发条件为: a = 1; 另外,通过断点列表可以禁用/启用断点以及删除断点。

更多推荐
所有评论(0)