架构

编辑

核心而言,elasticsearch-hadoop 集成了两个分布式系统:Hadoop,一个分布式计算平台,以及Elasticsearch,一个实时搜索和分析引擎。从高层次来看,两者都提供计算组件:一方面,Hadoop 通过 Map/Reduce 或最新的库,例如 Apache Spark;另一方面,Elasticsearch 通过其搜索和聚合功能。

elasticsearch-hadoop 的目标是连接这两个实体,以便它们能够透明地相互受益。

Map/Reduce 和分片

编辑

可扩展性的一个关键组件是并行性,即将任务分解成多个更小的任务,这些任务可以同时在集群的不同节点上执行。这个概念同时存在于 Hadoop 的splits(源或输入可以划分的部件数量)和 Elasticsearch 的分片(索引划分的部件数量)中。

简而言之,大致来说,更多的输入分片意味着可以同时读取源的不同部分的更多任务。更多的分片意味着有更多的可以从中读取索引内容(同时)。

因此,elasticsearch-hadoop 使用分片和分片作为 Hadoop 和 Elasticsearch 集群中执行的任务数量的主要驱动因素,因为它们对并行性有直接的影响。

Hadoop 的splits以及 Elasticsearch 的分片在系统行为方面起着重要作用——我们建议您熟悉这两个概念,以便更好地理解您的系统运行时语义。

Apache Spark 和分片

编辑

虽然 Apache Spark 不是建立在 Map/Reduce 之上的,但它共享类似的概念:它具有分区的概念,这大致相当于 Elasticsearch 的分片或 Map/Reduce 的split。因此,上面的类比也适用于此——更多的分片和/或更多的分区增加了并行性的数量,从而使这两个系统都能更好地扩展。

由于概念的相似性,在整个文档中,您可以互换地考虑 Hadoop 的InputSplit和 Spark 的Partition

从 Elasticsearch 读取数据

编辑

在从 Elasticsearch 读取信息时,分片起着关键作用。由于它充当数据源,elasticsearch-hadoop 将为每个 Elasticsearch 分片创建一个 Hadoop InputSplit,或者在 Apache Spark 的情况下创建一个Partition,该分片针对索引I执行查询。elasticsearch-hadoop 将动态发现支持I的分片数量,然后为每个分片创建(在 Hadoop 的情况下为输入分片(这将决定要执行的 Hadoop 任务的最大数量),在 Spark 的情况下为分区,这将决定RDD的最大并行性)。

使用默认设置,Elasticsearch 每个索引使用5主分片,这将导致 Hadoop 端每个查询的任务数量相同。

elasticsearch-hadoop 不会查询相同的分片——它使用循环法迭代所有分片(主分片和副本)。为了避免数据重复,每个分片组(主分片和副本)只使用一个分片。

一个常见的(读取优化)性能改进问题是增加分片数量,从而增加 Hadoop 端的任务数量。除非通过基准测试证明了这种收益,否则我们建议不要采取这种措施,因为在大多数情况下,Elasticsearch 分片可以轻松处理向 Hadoop 或 Spark 任务的数据流。

写入 Elasticsearch

编辑

写入 Elasticsearch 由可用的 Hadoop 输入分片(或任务)或 Spark 分区数量驱动。elasticsearch-hadoop 检测写入将发生在哪些(主)分片上,并在这些分片之间分配写入操作。可用的分片/分区越多,可以并行写入数据的映射器/化简器就越多。

数据共置

编辑

只要有可能,elasticsearch-hadoop 就与 Hadoop 和 Spark 共享 Elasticsearch 集群信息,以促进数据共置。实际上,这意味着每当从 Elasticsearch 读取数据时,源节点的 IP 地址就会传递给 Hadoop 和 Spark 以优化任务执行。如果需要/可以进行共置,则在同一机架内托管 Elasticsearch 和 Hadoop 和 Spark 集群将节省大量的网络资源。