如何 运行 成员组中分区区域上的数据相关函数?

How do I run a data-dependent function on a partitioned region in a member group?

我的团队使用 Geode 作为临时分析引擎。我们在 Geode 中存储了大量原始数据对象(每个 200MB+),但这些对象从未直接 returned 到客户端。相反,我们严重依赖自定义函数执行来处理 Geode 内部的这些数据集,并且只有 return 分析结果集。

我们有一个新的要求来实现两层数据分析精度。高精度分析将需要更大的原始数据集和更多 CPU 时间。这些高精度分析必须不以任何方式抑制低精度分析性能。因此,我正在寻找一种将这些数据集隔离到不同服务器的解决方案。

我构建了一个 POC,将每个数据集保存在自己的区域中(均已分区)。这些区域被配置为属于单独的成员组,然后每个服务器被配置为加入两个组之一。我能够毫无问题地在本地建立这个集群,并且 gfsh 表明一切看起来都是正确的:describe member 显示每个成员托管预期的区域。

我的客户端代码配置了一个指向集群的单个定位器的 ClientCache。我的函数执行命令一般如下所示:

FunctionService
  .onRegion(highPrecisionRegion)
  .setArguments(inputObject)
  .filter(keySet)
  .execute(function);

当我只有运行高精度服务器时,我可以针对高精度区域执行该功能。当我只有 运行 低精度服务器时,我能够针对低精度区域执行该功能。但是,当我 运行 两个服务器并一个接一个地执行功能时,我总是得到一个异常,指出 一个 区域找不到。有关我的代码示例和异常,请参阅以下要点。 https://gist.github.com/dLoewy/c9f695d67f77ec18a7e60a25c4e62b01

TLDR 关键点:

  1. 使用成员组,区域 A 在服务器 1 上,区域 B 在服务器 2 上。
  2. 这些区域必须在生产中进行分区。
  3. 我需要运行一个data-dependent函数在其中一个区域;客户端代码选择哪个。
  4. 按原样,我的客户端代码总是找不到 一个 区域。

有人可以帮助我走上正轨吗?我应该考虑使用完全不同的集群架构吗?很乐意根据要求提供更多详细信息。

非常感谢您的宝贵时间!

大卫

仅供参考,以下文档页面提到了成员组的功能执行,但提供的细节很少。第一个 link 描述了 运行ning data-independent 成员组的功能,但没有说明如何,也没有说明任何关于 运行ning data-dependent 对成员组起作用。 https://gemfire.docs.pivotal.io/99/geode/developing/function_exec/how_function_execution_works.html https://gemfire.docs.pivotal.io/99/geode/developing/function_exec/function_execution.html

由于区域数据未跨服务器复制,因此您似乎需要定位 onMembers 或 onServers 方法以及 onRegion。

您是否尝试过在客户端上创建两个不同的池,每个池都针对特定的 server-group,并像往常一样使用 onRegion 执行函数?我相信这应该可以解决问题。有关详细信息,请查看 Organizing Servers Into Logical Member Groups.

希望这对您有所帮助。干杯。