我正在尝试使用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。
答案 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)”解决了这个问题。
错误现在是否仍然存在?