从Cassandra读取数据以便在Flink中进行处理

时间:2017-03-28 10:54:35

标签: scala cassandra apache-flink

我必须使用Flink作为流引擎来处理来自Kafka的数据流。要对数据进行分析,我需要查询Cassandra中的一些表。做这个的最好方式是什么?我一直在寻找Scala中的例子。但是我找不到任何东西。如果使用Scala作为编程语言,可以在Flink中读取来自Cassandra的数据吗? Read & write data into cassandra using apache flink Java API还有另外一个问题。它在答案中提到了多种方法。我想知道在我的情况下最好的方法是什么。此外,大多数可用的示例都是Java。我正在寻找Scala的例子。

1 个答案:

答案 0 :(得分:2)

我目前在flink 1.3中使用asyncIO从cassandra中读取。这是关于它的文档:

https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/asyncio.html(它有DatabaseClient,你将使用com.datastax.drive.core.Cluster)

如果你需要一个更深入的例子来让我知道如何使用它来特别从cassandra中读取,但遗憾的是我只能在java中提供一个例子。

编辑1

以下是我使用flink的Async I / O从Cassandra中读取的代码示例。我仍然在努力识别和修复一个问题,由于某种原因(没有深入研究)单个查询返回的大量数据,异步数据流的超时被触发,即使它看起来像是在超时时间之前,Cassandra已经罚款了。但是假设这只是我正在做的其他事情的一个错误而不是因为这个代码,这对你来说应该没问题(并且对我来说也工作好几个月):

public class GenericCassandraReader extends RichAsyncFunction<CustomInputObject, ResultSet> {

    private final Properties props;
    private Session client;

    public GenericCassandraReader(Properties props) {
        super();
        this.props = props;
    }

    @Override
    public void open(Configuration parameters) throws Exception {
        client = Cluster.builder()
                .addContactPoint(props.cassandraUrl)
                .withPort(props.cassandraPort)
                .build()
                .connect(props.cassandraKeyspace);
    }

    @Override
    public void close() throws Exception {
        client.close();
    }

    @Override
    public void asyncInvoke(final CustomInputObject customInputObject, final AsyncCollector<ResultSet> asyncCollector) throws Exception {

        String queryString = "select * from table where fieldToFilterBy='" + customInputObject.id() + "';";

        ListenableFuture<ResultSet> resultSetFuture = client.executeAsync(queryString);

        Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {

            public void onSuccess(ResultSet resultSet) {
                asyncCollector.collect(Collections.singleton(resultSet));
            }

            public void onFailure(Throwable t) {
                asyncCollector.collect(t);
            }
        });
    }
}

再次,抱歉延误。希望能够解决这个问题,所以我可以肯定,但是在这一点上想到只是有一些参考会比没有更好。

编辑2

因此,我们最终确定问题不在于代码,而在于网络吞吐量。很多字节试图通过一个不足以处理它的管道,东西开始备份,一些开始涓涓细流但是(感谢datastax cassandra驱动程序的QueryLogger我们可以看到这个)它的时间拿到每个查询的结果开始爬升到4秒,然后是6,然后是8等等。

TL; DR,代码很好,请注意,如果您遇到来自Flink的asyncWaitOperator的timeoutExceptions,则可能是网络问题。

编辑2.5

还意识到,由于网络延迟问题,我们最终会转而使用RichMapFunction来保存我们从cassandra状态读取的数据。因此,作业只是跟踪通过它的所有记录,而不是每次新记录通过时都必须从表中读取以获取所有记录。