[英]Write to Mongodb from Apache storm
I am trying to write a custom stream grouping which writes to Mongodb.我正在尝试编写一个写入 Mongodb 的自定义流分组。 I am running a local cluster for now.
我现在正在运行本地集群。 I have a custom stream class and a mongo object.
我有一个自定义流类和一个 mongo 对象。 I write to mongodb in both the prepare() and chooseTask().
我在 prepare() 和 chooseTask() 中都写入了 mongodb。 It writes to mongodb but the supervisors cannot start.
它写入 mongodb,但主管无法启动。 I see this error in the supervisor log:
我在主管日志中看到此错误:
b.s.d.worker [ERROR] Error on initialization of server mk-worker
java.lang.NoClassDefFoundError: com/mongodb/MongoClient
at storm.starter.MongoMonitorObject.<init>(MongoMonitorObject.java:23) ~[stormjar.jar:0.10.0]
at storm.starter.ModStreamGrouping.prepare(ModStreamGrouping.java:94)
~[stormjar.jar:0.10.0]
I am making changes in the storm starter project for now.我现在正在对 Storm 启动项目进行更改。
public class ModStreamGrouping implements CustomStreamGrouping, Serializable{
java.util.List<java.lang.Integer> targetTasks = new ArrayList();
@Override
public List<Integer> chooseTasks(int taskId,List<Object> values) {
System.out.println("taskiD = " + taskId);
System.out.println("values = " + values);
return numTasks[0];
}
@Override
public void prepare(WorkerTopologyContext context, GlobalStreamId stream, java.util.List<java.lang.Integer> targetTasks) {
MongoMonitorObject mmo = new
System.out.println(" in prep() ");
System.out.println("targetTasks = " + targetTasks);
numTasks = targetTasks.size();
}
}
public class MongoMonitorObject {
private static final Logger LOG = LoggerFactory.getLogger(MongoMonitorObject.class);
public MongoMonitorObject(java.util.List<java.lang.Integer> targetTasks){
try{
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB( "loadDB" );
DBCollection collection = db.getCollection("testCollection");
for (Integer task : targetTasks) {
BasicDBObject document = new BasicDBObject();
document.put("tid", task);
collection.insert(document);
}
}
catch (UnknownHostException e) {
System.out.println(" in UnknownHostException ");
LOG.info(" in UnknownHostException ");
}
catch (Exception e) {
System.out.println(" in Exception ");
LOG.info(" in Exception ");
}
}
}
The stream grouping is defined in a ModStreamGrouping.java and mongo connection is defined in MongoMonitorObject.java.流分组在 ModStreamGrouping.java 中定义,mongo 连接在 MongoMonitorObject.java 中定义。 Both belong to the package storm.starter.
两者都属于storm.starter 包。
I can upload the topology but the supervisors cannot spawn workers.我可以上传拓扑,但主管不能产生工人。 There's a small link I'm missing somewhere but I don't know where exactly.
我在某处遗漏了一个小链接,但我不知道具体在哪里。 I added the following in storm starter's pom.xml to include mongodb connectivity:
我在 Storm starter 的 pom.xml 中添加了以下内容以包含 mongodb 连接:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>2.13.3</version>
</dependency>
Edit: I read it here: https://github.com/mongodb/mongo-java-driver编辑:我在这里阅读: https : //github.com/mongodb/mongo-java-driver
mongodb-java-driver is a all-in-one jar, it contains bson and core mongodb-java-driver 是一个多合一的 jar,它包含 bson 和 core
Therefore dependency mongodb-java-driver
is enough.因此依赖
mongodb-java-driver
就足够了。
If use dependency mongodb-driver
, dependencies bson
and core
are needed.如果使用依赖
mongodb-driver
,则需要依赖bson
和core
。
Original post:原帖:
Try add mongodb-driver-core
and use the newer version dependencies尝试添加
mongodb-driver-core
并使用较新版本的依赖项
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-core</artifactId>
<version>3.2.2</version>
</dependency>
The MongoDB Java Driver uber-artifact, containing mongodb-driver, mongodb-driver-core, and bson MongoDB Java Driver uber-artifact,包含 mongodb-driver、mongodb-driver-core 和 bson
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.