elasticsearch-hadoop可以看作是一个connector,使得数据可以在hadoop和elasticsearch之间双向流动。从架构上看,elasticsearch-hadoop集成了两个分布式系统:hadoop和elasticsearch。Hadoop及其相关库具有分布式计算分析能力,elasticsearch具有搜索和聚合能力。elasticsearch-hadoop的目标就是透明地连接这两种组件,并使这两个组件彼此获益。
Map/Reduce and shards
可扩展性(scalability)的关键组件是并行性和能够将任务分成多个小的任务在不同的节点上执行。Hadoop通过splits,elasticsearch通过shard来支持任务的分割,以达到并行性的目的。通俗地讲,分割更多的任务意味着可同时读取数据源不同的部分,更多的shard意味着有更多的桶用于读取索引的数据。因此,elasticsearch-hadoop使用splits和shards作为hadoop和elasticsearch集群上执行任务的主要驱动。
从elasticsearch中读取数据
从elasticsearch中读取数据时,shards扮演着重要角色。由于elasticsearch作为数据源,elasticsearch-hadoop会每个查询的shard创建一个split,也就是说给定一个针对Index I的查询,elasticsearch-hadoop会自动探测elasticsearch中的shard数,对于每个shard,与hadoop的一个input split对应,与spark的一个partition对应。
(实验验证)
读取性能地优化可通过增加elasticsearch的shard数量,因此增加了hadoop/spark的任务数,提高并行度。
向elasticsearch中写数据
向elasticsearch中写数据,是由hadoop中的split任务数或spark中的partitions数所决定的。elasticsearch-hadoop会探测写操作涉及的主(primary)shard数量,以将这些写操作分布在这些shard中,越多split任务数或spark partition数量,越高的并行度。
疑问:spark partitions数量,如何和主shard数对应的?
例如:partitions = 2, primary shard = 3, index = 1; partitions = 2, primary shard = 7, index = 2, index1 = 3, index2 = 4;
Data co-location
无论何时,只要有可能elasticsearch-hadoop都会在hadoop/spark集群和elasticsearh集群之间共享彼此集群的信息,以优化数据的co-location。这意味着每次从elasticsearch中读取数据时,就会将elasticsearch的Ips传送给hadoop/spark以优化任务的执行。如果希望数据co-location或者数据有可能co-location以达到节省网络传输的目的,尽可能的将elasticsearch集群和hadoop/spark集群安排在
同一个rack上(需要更进一步了解rack的概念及作用)
参考:https://www.elastic.co/guide/en/elasticsearch/hadoop/2.3/arch.html