风暴螺栓中的动态cassandra连接

时间:2014-07-11 13:12:01

标签: java cassandra apache-storm cassandra-jdbc

我正在运行一个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';
  }
}

如果数据属于一个密钥空间,则第二种情况有效。但我的案例数据属于不同的键空间,这里只有一个拓扑,它将识别键空间并写入该键空间。

风暴中是否有可用的哈希方法来保存密钥空间连接?

还有其他逻辑吗?

2 个答案:

答案 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'";
  }
}