首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性脚本度量聚合中的并发性?

弹性脚本度量聚合中的并发性?
EN

Stack Overflow用户
提问于 2019-10-08 15:38:05
回答 2查看 649关注 0票数 1

我正试图在Elasticsearch中将平均值作为一个脚本度量聚合来实现。这就是我想出来的:

代码语言:javascript
复制
{
  "scripted_metric": {
    "init_script": {
      "source": "state.sum = 0.0; state.count = 0.0;",
      "lang": "painless"
    },
    "map_script": {
      "source": " if (doc.TradedValue.size() > 0) {   state.sum += doc.TradedValue.value;   state.count++; }",
      "lang": "painless"
    },
    "combine_script": {
      "source": "return state;",
      "lang": "painless"
    },
    "reduce_script": {
      "source": " double avg = 0; double c = 0; for (s in states) { avg += s.sum; c += s.count; }  if (c == 0) { return 0.0; }  return avg / c;",
      "lang": "painless"
    }
  }
}

这似乎有效,并产生与标准avg度量相同的结果。

然而,我担心map_script中的部分可能不正确。在我看到的所有示例中,这个脚本正在执行某种状态的.add方法,并且求和是在combine_script中完成的。

我认为这可能是由于并发问题造成的,这使得+=map_script中不安全。是这种情况吗?还是我的剧本是对的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-11 09:33:47

当有疑问的时候,到源头去!在Elastic的github上,有一些scripted_metric的例子。

如果您检查这一个,您会注意到它们的处理方式与您的完全相同,即它们在map_script中直接执行增量值。

可悲的是,只允许将字符串和原语类型存储在内部状态,否则您可以使用java.util.concurrent.atomic.DoubleAccumulator交换双原语,并在map_script中调用accumulate()而不是+=

除非你真的有见证了真正的问题来支持你的怀疑,否则在这一点上我并不担心。

票数 1
EN

Stack Overflow用户

发布于 2019-10-08 16:31:13

我找到了一些推荐信。

  1. 基于脚本度量聚合文档的

脚本化的度量聚合在其执行的4个阶段使用脚本: init_script在任何文档收集之前执行 map_script在每个收集的文档中执行一次。这是必需的脚本。 在完成文档收集之后,combine_script在每个碎片上执行一次 在所有碎片返回结果之后,reduce_script在协调节点上执行一次

  1. 基于度量聚合映射上下文

使用此Map在组合脚本中添加用于处理的值。其他值必须是Map、List、String或基元类型。在给定碎片上的所有聚合文档之间共享相同的状态映射。

  1. 看看这个工作实例关于脚本在文档、碎片和节点级别上的实际工作方式。

我认为你的案子很简单,很简单,应该很好。

但是,在复杂的场景中,我认为最好只在map上下文[2]中进行映射,并使用在每个碎片上工作的combine上下文来完成计算,因为映射状态可以在所有碎片中使用。

这是无痛源,如果有兴趣深入研究的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58289685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档