我正在运行一个Storm拓扑,它从Kafka代理读取数据并写入Cassandra。我的一个Cassandra螺栓执行读写操作。我的键空间总是动态设置。现在我想使用连接池连接到Cassandra?
我的信息流中包含密钥空间名称。我需要动态地将数据插入适当的密钥空间/
1)我尝试使用execute
方法中的连接池方法获取Cassandra连接,以便每个元组都获得Cassandra连接。所以在一段时间后我的连接达到了我的线程1024池连接限制。连接超时错误。
示例:
ExecutorService pool = Executors.newFixedThreadPool(1024);
public void execute(Tuple input) {
if(input.size()>0) {
ConnectionManager cm=new ConnectionManager();
cm.keyspace = "dda400db5ef2d";
statement = cm.poolRun();
cql="select * form columnfamily where id='d78346';
}
}
2)当拓扑初始化worker并获得静态连接时,我尝试使用prepare
方法建立连接
public void prepare(Map stormConf, TopologyContext context,OutputCollector collector) {
_OutputCollector=collector;
ConnectionManager cm=new ConnectionManager();
cm.keyspace ="dda400db5ef2d"; statement = cm.poolRun();
}
public void execute(Tuple input) {
if(input.size()>0) {
cql="select * form columnfamily where id='d78346';
}
}
如果数据属于一个密钥空间,则第二种情况有效。但我的案例数据属于不同的键空间,这里只有一个拓扑,它将识别键空间并写入该键空间。
风暴中是否有可用的哈希方法来保存密钥空间连接?
或
还有其他逻辑吗?
答案 0 :(得分:0)
我对Cassandra并不熟悉,但我认为这就是你想要的:
private ConnectionManager cm = null;
public void prepare(Map stormConf, TopologyContext context,OutputCollector collector) {
_OutputCollector=collector;
cm=new ConnectionManager();
}
public void execute(Tuple input) {
cm.keyspace = "dda400db5ef2d";
statement = cm.poolRun();
cql="select * form columnfamily where id='d78346';
}
prepare方法在拓扑开始时运行一次。您可以使用它来初始化变量/连接并在execute方法中运行它们。查询完成后,您可能希望关闭连接,并在下一个查询中重置连接。希望这有帮助
答案 1 :(得分:0)
执行以下操作-
1)但是,不仅限于Cassandra集群,还可以使用螺栓的prepare方法创建一个会话。 创建会话时请勿使用键空间。
public void prepare(Map stormConf, TopologyContext context,OutputCollector collector) {
CassandraConnector client = new CassandraConnector();
client.connect("127.0.0.1", 9142);
this.session = client.getSession();
}
2)现在,根据您的数据创建查询。在这里,您的键空间名称应该以表名称为前缀。
public void execute(Tuple input) {
if(input.size()>0) {
cql="select * form keyspace.table where id='d78346'";
}
}