安全软件亚搏在线博客
作者:
爱尔兰马克

谷歌
获取博客时事通讯

交付通过FeedBurner

关于FME|1月22日2019|爱尔兰马克

并行处理和FME: 2019年的重新设计

就性能而言,并行处理是一个大问题。现代计算机有多个核心,在这些核心上扩展的过程充分利用了可用的计算能力。

FME通过定义多个流程的参数发挥优势。另外,并联过程的变压器也有一个“输入顺序”参数,这是另一个性能增强工具。

除了…我们看到支持案例和测试结果表明我们应该重新设计并行处理设置;所以对于FME 2019,我们就是这么做的!

2019年并行处理发生了什么变化

简而言之,我们删除了FME 2019中所有变压器的并行处理选项:

注意,没有并行处理参数(加上输入命令现在是组的模式)。但别担心!并行处理仍然可用。直到现在,它还只能作为定制转换器的一个选项使用。

如果你不感兴趣的话为什么我们做出了改变,然后跳到下面的“FME 2019和并行处理”。

但如果你想知道原因,继续阅读…

并行处理的问题

并行处理很复杂。也许比我们的界面看起来更复杂。用户需要计划要创建多少进程,以及每个进程要处理多少特性。另外还有一些复杂的问题,比如特征的顺序(当并行处理时可能会改变)。

简而言之,有了FME2018,我们觉得用户更有可能放慢他们的工作空间,而不是加速。这有几个原因…

界面设计

在设计方面,并行处理的复杂性是由其参数的显著性所决定的。我们很晚才意识到功能应该出现在每个转换器对话框的顶部!这很令人困惑,而且与转换器的核心用途无关。

2018并行处理参数

想象一下,如果电视遥控器上最大的按钮是用来微调画面颜色的!这就是为什么要把并行处理转移到不那么明显的地方。复杂性和显著性的混合鼓励了并行处理的错误使用。最常见的错误是进程的数量……

多个并行处理

你们可能知道,启动和停止FME进程都有开销。在将数据从一个进程传递到另一个进程的过程中也存在开销。所以过度的过程减慢了翻译。理想的情况是流程更少,开发更多特性。当有很多小工作的时候,额外开销大于并行处理的增益。整体翻译比较慢,而不是更快。

以FM2018中的工作区为例:

让我们从打破神话开始。你可能会想,因为这三个转换器都被设置为并行处理数据,它们可能同时启动多个进程,让电脑瘫痪。事实并非如此。直到所有的AreaBuilder进程都完成之后,分解器才会启动任何进程。所以过程的数量不会失控。

这很好。

然而,三台变压器按相同属性分组!

假设有8个邻域。每个转换器将创建8个进程。我们知道工作区不会同时运行24个进程。然而,它总共运行24个进程。不需要,不过,因为每个transformer的组都是相同的!它可以在8个过程中完成相同的工作。

我稍后会演示,如果作者将其做成自定义变压器并应用并行处理,这样就会有更少的过程。所以,这是我们改变的另一个原因。新设计鼓励正确的行为,因此作者更有可能做正确的事情,即使他们不知道!

非变形金刚

使用自定义转换器进行并行处理的另一个好处是,它是平行的吗所有变形金刚,是否基于组。作为一个例子,让我们在前面的示例中放入一个测试变压器:

在这种布局下,8个AreaBuilder进程然后收敛到测试人员的单个进程。然后它们又被分解成8个过程。除了停止/启动过程外,测试人员效率低下,因为它是一个单独的过程。

如果这是在自定义转换器中创建的,然后并行处理也适用于测试器,这使得它更有效率。

输入有序并行处理

输入命令参数很有趣,因为它与并行处理直接相关,无论是在我们的代码中,还是由于在参数对话框中相邻:

因为它在同一块参数中,看起来肯定是相关的。事实上并非如此。至少,两者都与绩效有关;但是没有理由你的数据必须被排序才能使用并行处理,或者必须并行处理排序的数据。

所以我们将这两个参数解耦,以减少混淆,并防止用户错误地应用它们。特别是,输入有序参数也可以控制什么在一个组中处理,所以特别重要的是不要误用它。它还被重新命名和新的选项名,使它更清楚它是什么:

这就是我们做出这些改变的原因。现在让我们看看在FME 2019中并行处理是什么样子的…

FME 2019和并行处理

FME 2019中的并行处理现在仅限于自定义变压器。这不是什么新功能。以这种方式并行处理数据总是可能的。但是,由于上面提到的原因,这是现在只有并行处理数据的方法。

我们来看前面的例子,现在2019年:

显然,不再有并行处理选项。所以,我将其转换成自定义转换器,并在其参数中设置并行处理:

2019年定制变压器并行处理

请注意,启用并行处理会自动添加一个Group by Published参数(如果没有将数据除以的组,则不能进行并行处理)。回到主画布,打开参数对话框,并将Group By parameter设置为NeighborhoodName:

当工作区运行时,每个组有一个单独的进程。但是,重要的是,每个过程包括所有三个变压器,所以启动的过程更少。

此外,如果我们增加一个额外的变压器-像这个测试仪…

…它也平行运行,这是一个额外的好处。

当然,您不需要非常仔细地观察,就可以注意到NeighborhoodName在transformer对话框中出现了两次:

这是为什么呢?

不必要的用户参数

回想一下,FME会自动发布自定义转换器中使用的所有属性。这使得变压器可以在多个地方使用,其中(在本例中)“neighhoodName”可能不可用。所以FME在创建自定义转换器时自动生成第一个发布参数,第二次激活并行处理。

我们两者都需要吗?好吧,这取决于我在哪里使用NeighborhoodName。我可以从Group-By参数中删除对它的任何引用,因为整个定制转换器现在是一个大型Group-By。如果我不在其他地方使用NeighborhoodName,是的,我可以删除第一个发布的参数。我不需要用它。

但是,例如,如果我在测试变压器中使用neighhoodName,然后我可能想保留第一个已发布的参数。第一个提示我要测试的属性,第二个提示我输入group by的属性。

在这里,我将删除使用自定义转换器创建的参数。

因此,首先我在每个单独的变压器中取消按参数分组。然后删除user参数;不是通过删除参数本身,但是通过从输入端口取消该属性:

这将隐藏属性,并且(不再需要)还将自动删除已发布的参数。

如果我这样删除一个属性引用,然后我一定要检查自定义转换器,看看是否有任何参数被标记为不完整(变成红色)。这将表明我在尚未处理的地方使用了该属性。

常见问题解答

Q)如果我只想对单个转换器应用并行处理,该怎么办?
a)将并行处理应用于单个变压器,您需要将其包装在一个定制的转换器中。有点不方便,但我们认为总体布局更好。
Q)如果我想对自定义变压器中的单个变压器应用并行处理,该怎么办?
a)要对自定义变压器内的单个变压器应用并行处理,您可以将其封装在它自己的定制转换器中。请记住,您可以将自定义转换程序嵌套在彼此内部。
Q)如果多台变压器需要并行处理,但是不同的群体呢?
a)如果多个变压器需要并行处理,但是对于不同的群体,然后将每个部分包装在一个单独的自定义转换器中。
Q)我发现一个单独的变压器,其并行处理参数仍然存在。为什么它还在那里?
a)我们的更新比从GUI中删除参数要复杂一些,还有一些变压器我们还没有更新。以后的FME版本可能会排除该参数,因此我们仍然建议在所有情况下使用定制transformer方法。

总结

简而言之,这里的重要问题是性能。工作区作者总是希望获得性能优势,使用并行处理是一种显而易见的方法。不幸的是,这有点太明显了。我们认为,新用户在试图加快翻译速度时,实际上会放慢速度。

这就是为什么我们将并行处理参数移动到一个自然性能更好的地方。

顺便说一下,你可能注意到了上面FME 2019的截图是在“dark mode”。这只是我们希望您在即将发布的版本中能够喜欢的其他有用更新之一。