架构编辑

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

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

Map/Reduce 和分片编辑

可扩展性的一个关键组件是并行性,或者将任务拆分成多个更小的任务,这些任务同时在集群中的不同节点上执行。这个概念在 Hadoop 中通过其splits(源或输入可以被划分的数量)和 Elasticsearch 中通过shards(索引被划分的数量)体现出来。

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

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

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

Apache Spark 和分片编辑

虽然 Apache Spark 不是建立在 Map/Reduce 之上的,但它共享类似的概念:它具有partition的概念,它是 Elasticsearch shard 或 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 为每个索引使用5primary 分片,这将导致 Hadoop 侧的每个查询具有相同数量的任务。

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

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

写入 Elasticsearch编辑

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

数据共置编辑

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