在某些情况下,我需要获取Elasticsearch文档计数。这是我下面考虑的代码。
// way 1
conditionsCountRDD = conditionRDD.map( condition=> /* ES count query with condition */)
// way 2
ESDataDF = /* get es data as DF */
conditionsCountRDD = conditionRDD.map( condition=> /* DF.filter with condition */)
哪种方法更适合获取“ conditionCountRDD”?
答案 0 :(得分:0)
我假设您知道如何从ES查询文档并将其导入SparkContext。
如果您认为Elasticsearch
集群和Spark Cluster
都具有或多或少相似的集群配置,我想认为允许Elasticsearch查询并为您提供结果是有效的。
对于像文档数量这样简单的基本搜索查询,除非计划运行某些其他迭代算法/计算,否则将所有文档都存储在Spark中并在那里执行计算是没有意义的。
当涉及Elasticsearch的{{3}}时,它也使用map reduce的概念。
如果您尝试在SparkContext中从Elasticsearch中获取较大的文档,然后使用Spark代码执行度量标准聚合,则将有大量的IO,Elasticsearch不必这样做,但是同样,您需要验证并查看合适的文档最好。
您可能还想知道Spark计算专门用于计算基于指标的聚合/计数所需的费用;预留了进行IO操作的时间(我敢肯定,这要比RDD概念的ES计算速度快得多,因为RDD概念中的所有数据都可以立即存储在内存中以执行计算)。
话虽如此,您没有提到/指定Elasticsearch
集群以及Spark
集群的硬件配置。也许您可能还需要采用启发式方法,看看两种方式都做时是否发现计算上有任何显着差异。
请记住,Elasticsearch是水平扩展的,这意味着它具有执行某些类型的分布式计算的能力,并且如果它可以执行某些操作,为什么还要重做并在其他地方执行。
希望有帮助!