架构
编辑架构
编辑核心上,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 之上的,但它共享类似的概念:它具有 partition
的概念,大致相当于 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 检测写入将发生的(主)分片数量,并在它们之间分配写入。可用的分割/分区越多,映射器/reducer 可以并行写入 Elasticsearch 的数据就越多。
数据共置
编辑在可能的情况下,elasticsearch-hadoop 与 Hadoop 和 Spark 共享 Elasticsearch 集群信息,以促进数据共置。实际上,这意味着每当从 Elasticsearch 读取数据时,源节点的 IP 都会传递给 Hadoop 和 Spark,以优化任务执行。如果需要/可能进行共置,则在同一机架中托管 Elasticsearch 和 Hadoop 和 Spark 集群将显著节省网络开销。