云/受限环境编辑

在理想情况下,elasticsearch-hadoop 在 Elasticsearch 和 Hadoop 可以从彼此完全访问时,可以实现最佳性能,也就是说 Hadoop 端的每个节点都可以访问 Elasticsearch 集群中的每个节点。这允许两个系统之间最大程度的并行性,因此,随着集群的扩展,它们之间的通信也随之扩展

但是,并非所有环境都是这样设置的,特别是云平台,例如 Amazon Web Services、Microsoft Azure 或 Google Compute Engine,或者像 这样的专用 Elasticsearch 服务,这些服务允许在需要时租用计算资源。这里典型的设置是,生成的节点在中启动,在专用私有网络内,并通过专用地址在互联网上提供。这实际上意味着两个系统,Elasticsearch 和 Hadoop/Spark,运行在两个独立的网络上,它们彼此之间无法完全看到(如果有的话);相反,所有对它的访问都通过公开的网关进行。

针对这样的 Elasticsearch 实例运行 elasticsearch-hadoop 会很快遇到问题,因为连接器一旦连接,就会发现集群节点、它们的 IP 并尝试连接到它们以读取和/或写入。但是,由于 Elasticsearch 节点使用的是不可路由的私有 IP,并且无法从外部云基础设施访问,因此对节点的连接将失败。

这个问题有几种可能的解决方法

将两个集群合并编辑

显而易见的解决方案是在同一个网络上运行这两个系统。这将消除所有网络物流跳跃,提高安全性(无需打开端口),最重要的是,由于一切都将位于同一个位置,因此将带来巨大的性能优势。即使您的数据不在云中,将一部分数据移动到云中以快速迭代也可以带来很大的好处。数据很可能在两个网络之间来回传递,因此您最好直接批量进行。

使集群可访问编辑

由于节点无法从外部访问,因此通过为它们分配公共 IP 来解决问题。这意味着至少一个集群(可能是 Elasticsearch)将完全可以从外部访问,这在物流(需要大量公共 IP)和安全性方面通常是一个挑战。

使用专用的一系列代理/网关编辑

如果无法公开集群,可以选择使用代理或 VPN,以便 Hadoop 集群可以透明地访问不同网络中的 Elasticsearch 集群。通过使用间接层,两个网络可以透明地相互通信。请注意,这通常意味着两个网络将知道如何正确地将 IP 从一个路由到另一个。如果代理/VPN 解决方案没有自动处理此问题,Elasticsearch 可能会通过其 网络设置 来提供帮助,特别是 network.hostnetwork.publish_host,它们控制节点绑定以及特别是发布通告给其客户端的 IP。这允许将某个公共可访问的 IP 广播给客户端,以允许访问节点,即使节点本身不在该 IP 上运行。

配置连接器以 WAN 模式运行编辑

在 2.2 中引入,elasticsearch-hadoop 可以配置为以 WAN 模式运行,即限制或完全减少其连接到 Elasticsearch 时的并行性。通过设置 es.nodes.wan.only,连接器将限制其网络使用,并且不会直接连接到目标资源分片,而是仅通过 es.nodes 设置中声明的节点连接到 Elasticsearch 集群。它不会执行任何发现,忽略数据或客户端节点,并且只通过上述节点进行网络调用。这有效地确保网络访问仅通过声明的网络节点进行。

最后但并非最不重要的一点是,集群越远,它们之间需要传递的数据越多,性能就越低,因为每个网络调用都非常昂贵。