Java 从ElasticsearchIO等待[10000]毫秒后获取侦听器超时
我试图测试一个简单的Apache Beam代码,源代码为Elasticsearch。我从中找到了ElasticsearchIO源类 我修改了Beam的MinimalWordCount示例,将源代码作为Elasticsearch而不是TextIO。以下是要点,Java 从ElasticsearchIO等待[10000]毫秒后获取侦听器超时,java,
elasticsearch,google-cloud-dataflow,apache-beam,Java,
elasticsearch,Google Cloud Dataflow,Apache Beam,我试图测试一个简单的Apache Beam代码,源代码为Elasticsearch。我从中找到了ElasticsearchIO源类 我修改了Beam的MinimalWordCount示例,将源代码作为Elasticsearch而不是TextIO。以下是要点, String[] hosts = new String[1]; hosts[0]="http://localhost:9200"; PipelineOptions options = PipelineOptionsFactory.creat
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();
我犯了一个错误
执行Java类时发生异常。无效的:
InvocationTargetException:java.io.IOException:侦听器超时
等待[10000]毫秒
我进行了调试,可以看到一切正常,Elasicsearch客户端已经构建&代码正在检索索引中的数据。但读取转换后的ParDo函数根本不会执行。Elasticsearch客户端一直在等待,最后出现超时错误
我知道用于Beam的Elasicsearch连接器仍在开发中。但是有人能帮我找出我做错了什么吗
PS:我正在本地运行Elasticsearch 5.2.1。您能否运行mvn-X以获得详细说明? 我在弹性论坛上找到了这个
您可能应该通过超时进行更多的调查问题在于代码执行删除滚动。如果我在ElasticsearchIO.java中对代码进行注释,管道运行良好
restClient.performRequest(
"DELETE",
"/_search/scroll",
Collections.<String, String>emptyMap(),
entity,
new BasicHeader("", ""));
restClient.performRequest(
“删除”,
“/\u搜索/滚动”,
Collections.emptyMap(),
实体,
新BasicHeader(“,”);
当前版本的ElasticsearchIO(beam-0.6.0 2017/03)尚不支持版本5的Elasticsearch。超时问题确实是由于当前Elasticsearch IO与ES v5.x不兼容造成的。但不清除滚动在ES端有一个代价:段合并过程(从较小的段中创建较大的段并删除较小的段)被搁置,因为ES无法在滚动上下文使用旧段时删除旧段
此外,还有一件事:IO.read以Json的形式返回文档,因此split ParDo可能也会根据字段名而不仅仅是字段值进行拆分。直接涉及接收到的异常的问题,标题为“”,最近以消息“通过添加ES 5.x支持()”结束 这个错误现在是否仍然表现出来
restClient.performRequest(
"DELETE",
"/_search/scroll",
Collections.<String, String>emptyMap(),
entity,
new BasicHeader("", ""));