[英]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.