我对这两个参数完全感到困惑,
es.scroll.size
es.scroll.limit
我做了一些测试,还是没搞清楚。
es.scroll.limit = es.scroll.size * num_of_scrolls ???
es.scroll.size
和es.scroll.limit
都是在从分布式集群发出请求时传递给elasticsearch.hadoop
的配置参数,例如Apache Spark for exmaple。
在阅读这两个参数之前,从文档中了解elasticsearch.hadoop
是很重要的:
碎片在正在阅读Elasticsearch的信息。由于其充当源,elasticsearch hadoop将为Elasticsearch shard,或者在Apache Spark的情况下是一个Partition,即给定一个针对索引I的查询。elasticsearch hadoop将动态发现支持I的碎片数量,然后为每个在Hadoop的情况下,shard将创建一个输入拆分(确定要执行的Hadoop任务的最大数量)或Spark的情况将决定RDD最大值的分区相似
因此,我们了解到碎片的数量会影响运行的查询数量。ES团队成员james.baiera在这里也说过:
ES Hadoop使用滚动端点来收集Spark中的处理。ES Hadoop执行多重滚动请求自行处理。。。
所以集群为每个分区创建了一个滚动请求,而这个请求又是为每个碎片创建的!这些滚动中的每一个都受到上述limit
和size
参数的影响。
同样,根据文件:
es.scroll.size(默认50)
每个返回的结果/项目数每个请求的个人。
es.scroll.limit(默认值-1)
返回的结果/项目总数每个单独的卷轴。负值表示所有文档那根火柴应该归还。请注意,这适用于每个滚动其通常绑定到作业任务之一。因此返回的文档数为LIMIT*number_of_SCROLLS(OR TASKS)
Size
表示滚动条的每个调用请求的文档数,而不是整个滚动条。
Limit
指定滚动API调用的所有调用中要检索的最大文档数(还记得滚动API调用的数量与索引中的碎片数量一样多吗?)
所以现在这个计算是有意义的:
整个集群检索的文档总数=每个滚动API调用的限制(es.scroll.limit
)*滚动调用的数量(索引中每个碎片一个)
当我自己尝试时,我得到了合理的结果,我查询了一个有14个碎片的索引,limit
是1
,实际上集群提取了14个文档。
正如nefo_x在回答中所说,实际上limit
也会限制size
,这是唯一合理的——整个滚动API调用中的每个调用都不应该大于该滚动API调用的所有调用的整个限制,对吧?