Storm集成ES异常——Cannot flush non-initialized write operation

Storm集成ES异常——Cannot flush non-initialized write operation

——记一次排查异常经历:Cannot flush non-initialized write operation

背景:
在使用ElasticSearch6.6版本时,采用Storm流式处理框架从Kafka中获取数据,经过处理后写入ES。
写入方式采用了ES官方提供的hodoop体系的框架,部署项目后,碰到如下图所示的异常信息
storm集成es异常
其中主要的提示信息为:“Cannot flush non-initialized write operation”

解决流程:

  1. 首先跑到Google上去搜索,唯一有些关联的信息就是Github上的ES的源代码,又跑到百度上搜索,也没有什么结果,心想这问题这么了不起,网友们居然都没看到?又或者是太低级了?/(ㄒoㄒ)/~~

  2. 跑回去查看打印的堆栈信息,定位出错的类、方法、行号:

public void flush() {
        Assert.isTrue(writeInitialized, "Cannot flush non-initialized write operation");
        bulkProcessor.flush();
    }

原来是一个标识位校验失败,直接抛出的问题,然后查看源代码中在何处更新的这个状态。原来在EsBolt中调用RestRepository.writeToIndex()时更新的状态位。
再看ExBolt的execute方法,如果storm程序部署后,一直没有数据流过时,是执行不到writeToIndex()的,然后再定时flush的时候,状态标识位是不会更新为true的。因此,向storm程序中写入一些测试数据,使得每个Bolt节点的execute方法都执行过调用writeToIndex后,这个异常就没有了。

这个问题定位出来还是不难的,但自己中间也绕了一些弯路,其主要原始是想偷懒,不愿意去跟一下源码,先是从网上找资料,然后是检查自己的配置,没有直面问题。最终导致在这个问题上花了些时间才搞明白。本想偷懒直接找答案,但是耍了小聪明,反而浪费了挺多时间。在此记录下,纠正自己的查错态度。

发布了159 篇原创文章 · 获赞 225 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/lyg673770712/article/details/88047634