云/受限环境
编辑云/受限环境
编辑在理想的设置中,当 Elasticsearch 和 Hadoop 可以相互完全访问时,即 Hadoop 端的每个节点都可以访问 Elasticsearch 集群内的每个节点时,elasticsearch-hadoop 可实现最佳性能。 这允许两个系统之间实现最大程度的并行性,因此,随着集群规模的 *扩大*,它们之间的通信也会随之扩大。
但是,并非所有环境都像这样设置,特别是云平台(例如 Amazon Web Services、Microsoft Azure 或 Google Compute Engine)或专用 Elasticsearch 服务(例如 Cloud),这些服务允许在需要时租用计算资源。 这里的典型设置是将生成的节点在 *云* 中、在专用的私有网络中启动,并通过专用地址在 Internet 上可用。 这实际上意味着 Elasticsearch 和 Hadoop/Spark 这两个系统在两个 *独立* 的网络上运行,这两个网络不能完全相互看到(如果可以的话); 而是对它的所有访问都通过公开的 *网关*。
针对这样的 Elasticsearch 实例运行 elasticsearch-hadoop 会很快遇到问题,原因很简单,连接器一旦连接,就会发现集群节点及其 IP,并尝试连接到它们以进行读取和/或写入。 但是,由于 Elasticsearch 节点使用不可路由的私有 IP,并且无法从云基础架构的 *外部* 访问,因此与节点的连接将失败。
针对此问题有几种可能的解决方法
将两个集群并置
编辑显而易见的解决方案是在同一网络上运行这两个系统。 这将消除所有网络逻辑跳,提高安全性(无需打开端口),最重要的是,由于所有内容都位于同一位置,因此具有巨大的性能优势。 即使您的数据不在云中,将一部分数据移至云中以快速迭代也可以带来巨大的好处。 数据无论如何都可能会在两个网络之间来回传输,因此您不妨直接批量执行此操作。
使集群可访问
编辑由于无法从外部访问节点,因此可以通过为它们分配公共 IP 来解决此问题。 这意味着至少一个集群(可能是 Elasticsearch)将可以从外部完全访问,这通常在逻辑(需要大量公共 IP)和安全方面都是一个挑战。
使用一系列专用代理/网关
编辑如果无法公开集群,则可以选择使用代理或 VPN,以便 Hadoop 集群可以透明地访问不同网络中的 Elasticsearch 集群。 通过使用间接层,两个网络可以 *透明地* 相互通信。 请注意,通常这意味着两个网络都知道如何将 IP 从一个网络正确路由到另一个网络。 如果代理/VPN 解决方案未自动处理此问题,则 Elasticsearch 可能会通过其 网络设置 来提供帮助,特别是 network.host
和 network.publish_host
,它们控制节点绑定以及特别是 *发布* 或 *通告* 给其客户端的 IP。 这允许将某个可公开访问的 IP 广播给客户端,以允许访问节点,即使节点本身未在该 IP 上运行也是如此。
配置连接器以在 WAN 模式下运行
编辑从 2.2 版本开始引入,可以将 elasticsearch-hadoop 配置为在 WAN 模式下运行,即在连接到 Elasticsearch 时限制或完全减少其并行性。 通过设置 es.nodes.wan.only
,连接器将限制其网络使用量,并且不会直接连接到目标资源分片,而是 仅 通过 es.nodes
设置中声明的节点连接到 Elasticsearch 集群。 它将 不 执行任何发现,忽略数据或客户端节点,而只是通过上述节点进行网络调用。 这有效地确保了网络访问仅通过声明的网络节点进行。
最后但并非最不重要的一点是,集群之间的距离越远,需要在它们之间传输的数据越多,性能就越低,因为每次网络调用都非常昂贵。