云/受限环境

编辑

在理想的设置中,elasticsearch-hadoop 当 Elasticsearch 和 Hadoop 可以完全相互访问时,可以实现最佳性能,即 Hadoop 端的每个节点都可以访问 Elasticsearch 集群中的每个节点。这允许两个系统之间最大程度地并行化,因此,随着集群向扩展,它们之间的通信也会扩展。

但是,并非所有环境都是这样设置的,特别是云平台(例如 Amazon Web Services、Microsoft Azure 或 Google Compute Engine)或像 Cloud 这样的专用 Elasticsearch 服务,这些服务允许根据需要租用计算资源。这里的典型设置是,生成的节点在中启动,位于专用私有网络中,并通过专用地址在 Internet 上提供。这实际上意味着两个系统 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 集群。它不会执行任何发现、忽略数据或客户端节点,而只是通过上述节点进行网络调用。这有效地确保网络访问仅通过声明的网络节点进行。

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