如何将cassandra群集连接从一个螺栓传递到另一个螺栓

如何将cassandra群集连接从一个螺栓传递到另一个螺栓,cassandra,apache-storm,Cassandra,Apache Storm,Storm Topology从kafka读取数据并写入cassandra表 在Storm中,我用prepare方法创建cassandra集群连接和会话 cassandraCluster = Cluster.builder().withoutJMXReporting().withoutMetrics() .addContactPoints(nodes) .withRetryPolicy(DowngradingConsistencyRetryPolic

Storm Topology从kafka读取数据并写入cassandra表

在Storm中,我用prepare方法创建cassandra集群连接和会话

cassandraCluster = Cluster.builder().withoutJMXReporting().withoutMetrics()
            .addContactPoints(nodes)
            .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
            .withReconnectionPolicy(new ExponentialReconnectionPolicy(100L,
                    TimeUnit.MINUTES.toMillis(5)))
            .withLoadBalancingPolicy(
                    new TokenAwarePolicy(new RoundRobinPolicy()))
            .build();

session = cassandraCluster.connect(keyspace);
在execute方法中,我可以处理元组并将其保存在cassandra表中

假设我想把数据从一个元组写到多个表中 为每个表编写单独的螺栓将是一个不错的选择。但我必须在每个螺栓中创建集群连接和会话表

但是在这个链接中,每个集群的单个连接对于性能来说是个好主意


你们有没有人想到在一个螺栓中创建集群连接,在另一个螺栓中使用此连接?

这取决于storm如何将螺栓和喷嘴分配给工人。您不能假设可以共享螺栓之间的连接,因为它们可能在不同的工作程序(读:JVM)中运行,或者完全在不同的节点上运行

请看我的回答:

可能类似于以下伪代码:

public class CassandraBolt extends BaseRichBolt {
    private static final long serialVersionUID = 1L;
    private static Logger LOG = LoggerFactory.getLogger(CassandraBolt.class);
   OutputCollector _collector;

   // whatever your cassandra session is
   // has to be transient because session is not serializable
   protected transient CassandraSession _session;

    @SuppressWarnings("rawtypes")
    @Override
    public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
        _collector = collector;

      // maybe get properties from stormConf instead of hard coding them
        cassandraCluster = Cluster.builder().withoutJMXReporting().withoutMetrics()
            .addContactPoints(nodes)
            .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
            .withReconnectionPolicy(new ExponentialReconnectionPolicy(100L,
                    TimeUnit.MINUTES.toMillis(5)))
            .withLoadBalancingPolicy(
                    new TokenAwarePolicy(new RoundRobinPolicy()))
            .build();

      _session = cassandraCluster.connect(keyspace);
    }

    @Override
    public void execute(Tuple input) {
        try {
            // use _session to talk to cassandra

        } catch (Exception e) {
            LOG.error("CassandraBolt error", e);
            _collector.reportError(e);
        }   
    }


    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
        // TODO Auto-generated method stub
    }
}

我不知道有多少关于ApacheStorm的信息可以在这里发表评论,但快速查看文档似乎可以看出您在“螺栓”中执行了谨慎的操作。您可能想在问题中向Cassandra的用户和驱动程序解释更多关于这一点的内容。理想情况下,您需要保持一个会话处于打开状态,这是正确的。如果您可以在每个botl之间共享对象,那么您是否可以使会话对象成为跨每个“螺栓”共享的公共对象?@markc实际上不可能跨螺栓共享对象,因为螺栓分布在物理上不同的机器上。这里可以做的最好的事情是每个螺栓维护一个集群/会话,但这似乎与链接中描述的最佳实践相矛盾。“我对卡桑德拉的了解还不够,不能说这是不是可以的。”瑞安沃克:好的,谢谢你澄清这一点。有道理。那么,为每个螺栓创建一个会话可能是有意义的。cassandra集群可以连接多个客户端,但是建议保持一个会话打开的原因只是为了避免建立和中断连接。只要螺栓本身是持久的,会话对象就可以是它的子对象。一旦建立连接,驱动程序将向集群提供一个连接池。请参阅:每个螺栓在不同机器的不同JVM中运行。但它有一种机制可以将数据从一个螺栓发送到另一个螺栓。我搜索的storm有任何拓扑级别的方法,我可以直接从任何bolt访问,这是cassandra中的唯一选项,storm是每个bolt的群集/会话连接。是的,每个bolt可以在不同的JVM中。没有可共享的拓扑级别方法。您应该将连接属性传递给螺栓,并在螺栓的
prepare
方法中创建连接。