簡體   English   中英

Flink 1.11.1 Cassandra 存在時間戳時 Sink 不保存

[英]Flink 1.11.1 Cassandra Sink does not save when a timestamp is present

我不確定根本問題是什么,但這是我能解決的最基本問題。 當我通過 kafka 運行某些東西時,我的流媒體作業將它撿起來,它會運行整個過程,直到將它保存到 Cassandra 為止,此時它掛起。 感謝任何和所有的幫助,我已經反對這個太久了

顯示以下基本問題的片段。

StreamingJob.java:

final DataStream<Pojo> stream = env.addSource(source)
    .process(new MyProcess());
CassandraSink.addSink(stream).setClusterBuilder(new ClusterBuilder() {
    @Override
    protected Cluster buildCluster(Cluster.Builder builder) {
        return builder.withCredentials("","")
            .addContactPoint("127.0.0.1").withPort(9042).build();
        }
    })
    .setMapperOptions(() -> new Mapper.Option[]{Mapper.Option.saveNullFields(false)})
    .setDefaultKeyspace("my_keyspace").build();

env.execute(jobConfig.getName());

我的流程.java

@Override
Pojo myPojo = doSomethingtoMyInput();
out.collect(myPojo);
//Debugging this proves it works to this point

MyPojo.java

@Table(keyspace = "my_keyspace", name="my_table")
public class MyPojo {
    @PartitionKey(0)
    @Column
    String user_id;
    @PartitionKey(1)
    @Column
    String other_id;
    @ClusteringColumn
    @Column
    java.util.Date time_id;

    //Getters and setters using standard notation
}

我的 cassandra 架構

CREATE TABLE my_table (user_id text,
    other_id text,
    time_idtimestamp,
    PRIMARY KEY ((user_id, other_id), time_id)
) WITH CLUSTERING ORDER BY (time_id DESC)

您需要驗證源中time_id的格式,因為它可能與 CQL 列不兼容。

在您的 POJO 中,您已將其映射到java.util.Date並且如果來自源的字段確實包含日期,那么這可能是它不起作用的原因。

CQL timestamp是一個 64 位有符號整數,表示自 Unix 紀元以來的毫秒數。 源字段的值可以是 (a) integer,或 (b) 看起來像yyyy-mm-dd HH:mm的文字字符串。 此處提供了有效 ISO 8601 格式的列表 - CQL 時間戳 干杯!

經過多次斗爭找到了答案。 Flink 和 Cassandra 是一個非常嚴格和脆弱的連接。 一切都必須完美對齊,Cassandra 中的十進制需要 Java 中的十進制,更令人困惑的是,Cassandra 中的時間戳只能與 Java 中的長值一起使用。

希望這可以幫助遇到同樣問題的其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM