使用elasticsearch hadoop库将元组从storm索引到elasticsearch不起作用

使用elasticsearch hadoop库将元组从storm索引到elasticsearch不起作用,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我想从Storm中将文档索引到Elasticsearch,但我无法将任何文档索引到Elasticsearch 在我的拓扑结构中,我有一个KafkaSpout,它向一个EsBolt发出一个类似于{“tweetId”:1,“text”:“hello”}的json,这个EsBolt是elasticsearch hadoop库中的本机bolt,它将风暴元组写入elasticsearch(doc在这里:)。 以下是my EsBolt的配置: Map conf = new HashMap(); conf.p

我想从Storm中将文档索引到Elasticsearch,但我无法将任何文档索引到Elasticsearch

在我的拓扑结构中,我有一个KafkaSpout,它向一个EsBolt发出一个类似于{“tweetId”:1,“text”:“hello”}的json,这个EsBolt是elasticsearch hadoop库中的本机bolt,它将风暴元组写入elasticsearch(doc在这里:)。 以下是my EsBolt的配置:

Map conf = new HashMap();
conf.put("es.nodes","127.0.0.1");
conf.put("es.port","9200");
conf.put("es.resource","twitter/tweet");
conf.put("es.index.auto.create","no");
conf.put("es.input.json", "true");
conf.put("es.mapping.id", "tweetId");
EsBolt elasticsearchBolt = new EsBolt("twitter/tweet", conf);
前两个配置默认具有这些值,但我选择显式设置它们。我也尝试过不用它们,得到同样的结果

这就是我构建拓扑的方式:

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout(TWEETS_DATA_KAFKA_SPOUT_ID, kafkaSpout, kafkaSpoutParallelism)
        .setNumTasks(kafkaSpoutNumberOfTasks);


builder.setBolt(ELASTICSEARCH_BOLT_ID, elasticsearchBolt, elasticsearchBoltParallelism)
        .setNumTasks(elasticsearchBoltNumberOfTasks)
        .shuffleGrouping(TWEETS_DATA_KAFKA_SPOUT_ID);

return builder.createTopology();
在本地运行拓扑之前,我在Elasticsearch中创建“twitter”索引,并为该索引创建映射“tweet”。 如果检索新创建的类型(curl-XGET“”)的映射,就会得到以下结果:

我在本地运行拓扑,这是我在控制台处理元组时得到的结果:

Processing received message FOR 6 TUPLE: source: tweets-data-kafka-spout:9, stream: default, id: {-8010897758788654352=-6240339405307942979}, [{"tweetId":"1","text":"hello"}]

Emitting: elasticsearch-bolt __ack_ack [-8010897758788654352 -6240339405307942979]

TRANSFERING tuple TASK: 2 TUPLE: source: elasticsearch-bolt:6, stream: __ack_ack, id: {}, [-8010897758788654352 -6240339405307942979]

BOLT ack TASK: 6 TIME:  TUPLE: source: tweets-data-kafka-spout:9, stream: default, id: {-8010897758788654352=-6240339405307942979}, [{"tweetId":"1","text":"hello"}]

Execute done TUPLE source: tweets-data-kafka-spout:9, stream: default, id: {-8010897758788654352=-6240339405307942979}, [{"tweetId":"1","text":"hello"}] TASK: 6 DELTA:
所以元组似乎被处理了。但是,我没有在Elasticsearch中索引任何文档


我想我在设置EsBolt的配置时做错了什么,可能是缺少配置或其他东西。

只有当您达到指定的刷新大小时,文档才会被索引

或者,您可以设置触发队列刷新的勾号频率

config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 5);

默认情况下,es hadoop会根据参数在刻度上刷新。

我也遇到了同样的问题,但当我查找es hadoop文档时,我发现因为我未设置触发队列刷新的频率。然后我将配置添加到我的存储拓扑(es.storm.bolt.flush.entries.size),这很好。但是当我们设置Config.TOPOLOGY\u TICK\u TUPLE\u FREQ\u SECS的值时,会在执行函数中抛出一个异常:java.lang.RuntimeException:java.lang.NullPointerException。然后我们使用调试模式来测试我的拓扑,我发现bolt execute中的输入元组不包含任何条目,但是这个空元组被触发了。 这就是我感到困惑的地方。不要,元组将根据设置的时间发出,即使在我们设置Config.TOPOLOGY\u TICK\u tuple\u FREQ\u SECS之后这个元组是空的。我认为这是一个bug。

您可以查看更多信息:

config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 5);