故障排除编辑

不幸的是,有时事情并不像预期的那样进行,你的 elasticsearch-hadoop 作业执行可能会出现问题:可能读取或写入错误的数据,作业可能比预期花费的时间长得多,或者你可能会遇到一些异常。本节试图提供帮助和技巧,帮助你进行自己的诊断,识别问题并希望能够解决问题。

EsHadoopNoNodesLeftException编辑

测试 Elasticsearch 是否可以从运行作业的 Spark/Hadoop 集群访问。你的机器可能可以访问它,但那不是实际运行代码的地方。如果 ES 可访问,请最小化任务数量及其批量大小;如果 Elasticsearch 过载,它将不断落后,GC 将启动,最终它的节点将变得无响应,导致客户端认为机器已死。有关更多详细信息,请参阅性能注意事项部分。

测试你的网络编辑

太多次,人们在生产环境中使用他们的本地开发设置。仔细检查 Elasticsearch 是否可以从你的生产环境访问,检查主机地址和端口,以及运行 Hadoop/Spark 作业的机器是否可以访问 Elasticsearch(使用 curltelnet 或你拥有的任何可用工具)。

在生产环境中使用 localhost(即默认值)仅仅是错误配置。

仔细检查类路径编辑

确保在你的类路径中只使用一个版本的 elasticsearch-hadoop。虽然可能不明显,但 Hadoop/Spark 中的类路径是从多个文件夹组装的;此外,JVM 将首先选择哪个版本没有保证。为了避免模糊的问题,仔细检查你的类路径,并确保其中只有一个版本的库,即你感兴趣的那个。

隔离问题编辑

遇到问题时,尽力隔离它。这可能很棘手,很多时候,这是最难的部分,所以要花时间处理它。逐步进行,尝试以小块的形式消除不必要的代码或设置,直到你最终得到一个小的、微小的示例,它会暴露你的问题。

使用快速、本地环境编辑

许多 Hadoop 作业本质上是批处理作业,这意味着它们需要很长时间才能执行。为了更快地追踪问题,请使用任何可能的方法来加快反馈循环:使用小型/微型数据集(无需加载数百万条记录,几十条就足够了),并在你的开发机器上运行的 Elasticsearch 节点旁边使用本地/伪分布式 Hadoop 集群。

检查你的设置编辑

仔细检查你的设置,并在可能的情况下使用常量或复制配置。很容易打错字,因此尝试通过使用属性文件或常量接口/类来减少手动配置。如果你不确定某个设置的作用,请将其删除或更改其值,然后查看它是否会影响你的作业输出。

验证输入和输出编辑

仔细查看你的输入和输出;这通常更容易在 Elasticsearch 中完成(服务比作业/脚本存活时间长,是实时的,并且可以以灵活的方式立即访问,包括命令行)。如果你的数据没有持久化(在 Hadoop 或 Elasticsearch 中),请考虑暂时这样做以验证你的工作流程的每个步骤。

监控编辑

虽然日志记录有助于解决错误和错误,但对于运行时行为,我们强烈建议对你的 Hadoop 和 Elasticsearch 集群进行适当的监控。两者都超出了本章的范围,但是有一些流行的免费解决方案值得研究。对于 Elasticsearch,我们推荐Marvel,这是由 Elasticsearch 背后的团队创建的免费监控工具(用于开发)。监控可以洞察集群的实际行为,并帮助你关联行为。如果无法使用监控解决方案,请使用 Hadoop、Elasticsearch 和 elasticsearch-hadoop 提供的指标来评估运行时行为。

增加日志记录编辑

日志记录可以让你深入了解正在发生的事情。Hadoop、Spark 和 Elasticsearch 具有广泛的日志记录机制,就像 elasticsearch-hadoop 一样,但是要明智地使用它:过多的日志记录可能会隐藏实际问题,因此再次,要逐步进行。

测量,不要假设编辑

遇到性能问题时,请先进行一些基准测试,尽可能地进行隔离。不要仅仅假设某个组件很慢;确保/证明它确实是。否则,很多时候,人们可能会发现自己正在“修复”错误的问题(并且通常会创建一个新的问题)。

找到基线编辑

索引性能严重依赖于目标数据的类型及其映射。搜索也是如此,但将查询定义添加到混合中。如前所述,请尝试并测量数据集的各个部分,以找到环境的最佳点,然后再导入/搜索大量数据。

获取帮助编辑

如果你需要帮助,论坛IRC上有一个强大的、乐于助人的用户社区,他们很乐意提供帮助。

如果某些东西不起作用,则有两种可能性

  • 存在错误
  • 你做错了什么

无论哪种情况,清晰的描述问题将有助于其他用户帮助你。你的报告越完整,你越快就能从用户那里获得帮助!

哪些信息有用?编辑

  • 操作系统和 JVM 版本
  • Hadoop/Spark 版本/发行版
  • 如果使用某个库(Hive),则使用该版本
  • elasticsearch-hadoop 版本
  • 导致问题的作业或脚本
  • Hadoop/Spark 集群大小
  • Elasticsearch 集群大小
  • 数据集的大小及其原始格式的片段(CSV、TSV 等)

如果你没有提供所有信息,那么其他人可能难以找出问题所在。

我在哪里发布我的信息?编辑

请不要在邮件列表或 IRC 中粘贴长代码行——很难阅读,人们不太可能花时间提供帮助。

使用众多“粘贴”网站之一,例如pastebingist(我们推荐)。

“Gist 是一种与他人共享代码片段和粘贴内容的简单方法。所有 Gist 都是 git 存储库,因此它们会自动进行版本控制,可以分叉,并且可以用作 git 存储库。”
-- http://gist.github.com/gists

请参阅 Elasticsearch 帮助页面,了解有关如何快速轻松地创建详细用户报告的提示。