从ElasticsearchIO等待[10000] ms后获取侦听器超时

时间:2017-03-10 14:33:52

标签: java elasticsearch google-cloud-dataflow apache-beam

我正在尝试使用source作为Elasticsearch测试一个简单的Apache Beam代码。我从git repo找到了ElasticsearchIO源类。

我修改了Beam的MinimalWordCount示例,将源包含为Elasticsearch而不是TextIO。以下是要点,

String[] hosts = new String[1];
hosts[0]="http://localhost:9200";
PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
p.apply(
      ElasticsearchIO.read().withConnectionConfiguration(
        ElasticsearchIO.ConnectionConfiguration.create(hosts, "test_index", "users").withUsername("esuser").withPassword("password")
      )
 )
.apply("ExtractWords", ParDo.of(new DoFn<String, String>() {
      @ProcessElement
      public void processElement(ProcessContext c) {
         for (String word : c.element().split("[^a-zA-Z']+")) { 
           if (!word.isEmpty()) {
             c.output(word);
           }
         }
      }
}));
p.run().waitUntilFinish();

如果我运行代码,

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.MinimalWordCount \
 -Pdirect-runner

我收到错误

  

执行Java类时发生异常。空值:   InvocationTargetException:java.io.IOException:之后的侦听器超时   等待[10000] ms

我调试了ElasticsearchIO.java并且可以看到一切正常,Elasicsearch客户端已经构建完成了代码正在检索索引中的数据。但是读取变换后的ParDo功能根本没有执行。 Elasticsearch客户端一直在等待,最终得到超时错误。

我知道Beam的Elasicsearch连接器仍处于开发阶段。但是,任何人都可以帮忙找到我做错的事吗?

PS:我在本地运行Elasticsearch 5.2.1。

5 个答案:

答案 0 :(得分:1)

当前版本的ElasticsearchIO(beam-0.6.0 2017/03)尚不支持Elasticsearch的第5版。 https://issues.apache.org/jira/browse/BEAM-1637

跟踪了这方面的进展

答案 1 :(得分:1)

超时问题确实是由于当前Elasticsearch IO与ES v5.x不兼容。但是不清除滚动在ES方面有成本:段合并过程(从较小的段创建更大的段并删除较小的段)是保持的,因为ES在滚动上下文使用时无法删除旧段。

此外,另一件事:IO.read将文档作为Json返回,因此拆分ParDo也可能在字段名称上拆分而不仅仅是字段值。

答案 2 :(得分:0)

你能运行mvn -X来获得详细描述吗? 我在弹性论坛上找到了这个 https://discuss.elastic.co/t/es5-indexing-performance-seems-slow/65084/22 https://discuss.elastic.co/t/es5-correct-restclient-failurelistener-behaviour-retry-logic/68211/3

你应该通过超时调查更多

答案 3 :(得分:0)

问题在于执行删除滚动的代码。如果我在ElasticsearchIO.java中注释该代码,那么管道运行正常。

restClient.performRequest(
             "DELETE",
             "/_search/scroll",
             Collections.<String, String>emptyMap(),
             entity,
             new BasicHeader("", ""));

答案 4 :(得分:0)

直接涵盖所收到的异常的问题,标题为“Getting listener timeout after waiting for [10000] ms from ElasticsearchIO”,最近已关闭,并显示消息:“通过添加ES 5.x支持(https://github.com/apache/beam/pull/3703)”解决了这个问题。

错误现在是否仍然存在?