StormCrawler自定义元数据字段无法持久化至Elasticsearch状态索引的问题咨询
StormCrawler自定义元数据字段无法持久化至Elasticsearch状态索引的问题咨询
你好,结合你使用的Storm 2.4.0和StormCrawler 2.8版本特性,我整理了几个最可能导致自定义元数据(比如crawler字段)无法写入Elasticsearch状态索引的原因及解决办法:
1. 未明确配置要持久化的自定义元数据字段
StormCrawler的StatusUpdaterBolt默认只会将预定义的核心元数据字段写入ES状态索引,自定义字段需要通过配置显式声明。你需要在拓扑配置中添加status.metadata.fields参数,列出需要持久化的自定义字段:
# 在你的配置文件中补充以下配置 status.metadata.fields: ["crawler"]
这个配置会告诉StatusUpdaterBolt,将crawler字段从Metadata对象中提取并写入ES索引。
2. Spout发射的Tuple字段结构与Bolt预期不匹配
StatusUpdaterBolt对"status"流的输入Tuple有固定字段要求:它期望Tuple包含url、status(Status枚举类型)和metadata三个字段。但你的代码只发射了url和metadata两个字段,这会导致Bolt无法正确解析Tuple,自然无法获取到自定义元数据。
解决办法是调整Spout代码:
- 首先在
declareOutputFields方法中声明正确的字段列表:
@Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declareStream("status", new Fields("url", "status", "metadata")); }
- 然后在发射Tuple时补充
status字段(根据业务场景选择合适的Status枚举值,比如Status.DISCOVERED):
// 示例:使用DISCOVERED状态发射Tuple collector.emit("status", new Values(url, Status.DISCOVERED, metadata));
3. Elasticsearch索引映射限制(动态映射关闭)
如果你的Elasticsearch状态索引手动关闭了动态映射,即使StormCrawler尝试写入crawler字段,ES也会忽略这个未在映射中定义的字段。你可以:
- 检查状态索引的映射配置,确认是否开启了动态映射(默认是开启的);
- 如果动态映射关闭,需要手动在索引映射中添加
metadata.crawler字段的定义,示例如下:
{ "properties": { "metadata": { "properties": { "crawler": { "type": "keyword" } } } } }
备注:内容来源于stack exchange,提问作者ndtreviv
相关产品推荐
相关产品推荐

