Flink:如何在连接到Cassandra失败时处理异常?

时间:2018-04-04 08:50:19

标签: java cassandra apache-flink

我的Cassandra接收器配置如下:

    ClusterBuilder secureCassandraSinkClusterBuilder = new ClusterBuilder() {
        @Override
        protected Cluster buildCluster(Cluster.Builder builder) {
            return builder.addContactPoints(props.getCassandraClusterUrlAll().split(","))
                    .withPort(props.getCassandraPort())
                    .withAuthProvider(new DseGSSAPIAuthProvider("HTTP"))
                    .build();
    };

    CassandraSink
            .addSink(cassandraObjectStream)
            .setClusterBuilder(secureCassandraSinkClusterBuilder)
            .build()
            .name("Cassandra-Sink");

现在当没有正确配置与Cassandra的连接时,我得到一个 NoHostAvailableException ,或者当连接意外丢失时,我得到一个 ConnectionTimeOutException ,或者有时一个 WriteTimeoutException 。这最终会触发 JobExecutionException ,整个Flink作业终止。

我在哪里可以捕获这些Cassandra例外情况?这些被抛出的地方?我尝试在CassandraSink周围放置一个try-catch块但是没有做到。我希望捕获这些异常,并在连接超时的情况下重试连接到Cassandra,或者在写入超时的情况下重试写入Cassandra。

1 个答案:

答案 0 :(得分:2)

AFAIK,您不能尝试使用BrowserModule来捕获这些例外。

捕获像TimeoutException这样的异常的一种方法是为Cassandra实现自己的接收器,但这可能需要很长时间......

另一种方法是,如果您运行流式传输作业,则可以将任务重试设置为大于1到CassandraSink,并启用检查点,以便流式传输作业可以根据最后一个检查点继续工作。 StreamingExecutionEnvironment.setRestartStrategy支持WAL,因此可以在启用检查点的情况下实现CassandraSink