我的Apache Storm应用程序有问题,我是初学者。 特别是,当我尝试将一个螺栓连接到MongoDB后,在提交拓扑之后。 我有一个喷口发出随机值(只是为了测试)和一个螺栓将它们插入MongoDB中。问题是当喷口开始发出MongoDB-Bolt时执行失败。 我抓住了螺栓的这个异常运行时间:
java.lang.NoClassDefFoundError: com/mongodb/MongoClient at bolts.MongoInsertBolt.prepare(MongoInsertBolt.java:29) at backtype.storm.daemon.executor$fn__5694$fn__5707.invoke(executor.clj:757) at backtype.storm.util$async_loop$fn__545.invoke(util.clj:477) at clojure.lang.AFn.run(AFn.java:22) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: com.mongodb.MongoClient at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) [...]
此问题仅在群集模式中持续。 在本地模式下,它可以很好地工作,我可以访问MongoDB,提交查询等。 这是我的螺栓实现。
提前致谢。
private MongoClient mongoClient;
private DBCollection table;
public void prepare(Map stormConf, TopologyContext context,OutputCollector collector) {
this.collector = collector;
this.mongoClient = new MongoClient("xxx.yyy.zzz.www",27020);
mongoClient.setWriteConcern(WriteConcern.SAFE);
DB db = mongoClient.getDB("DB_Storm");
this.table = db.getCollection("storm_netflow");
}
public void execute(Tuple input) {
String netflow = input.getStringByField("netpack");
BasicDBObject document = new BasicDBObject();
document.put("id", netflow);
this.table.insert(document);
[...]
this.mongoClient.close();
}