[英]Apache Spark - capturing Kafka data on streaming event to trigger workflow
簡而言之,我是一名嘗試使用Spark將數據從一個系統移動到另一個系統的開發人員。 在一個系統中將原始數據整理,匯總成一個本地分析系統。
我是Spark的新手-我的知識僅限於過去一兩周我能夠挖掘和嘗試的知識。
我在想的是 使用Spark監視來自Kafka的事件作為觸發。 在消費者事件中捕獲該實體/數據,並使用它來告訴我在分析系統中需要更新的內容。 然后,我將對原始Cassandra數據運行相關的Spark查詢,並將結果寫入分析側的另一張表,儀表板指標將其稱為數據源。
我有一個簡單的Kafka結構化流查詢工作。 雖然我可以看到消耗的對象已輸出到控制台,但是當使用者事件發生時,我無法檢索Kafka記錄:
try {
SparkSession spark = SparkSession
.builder()
.master(this.sparkMasterAddress)
.appName("StreamingTest2")
.getOrCreate();
//THIS -> None of these events seem to give me the data consumed?
//...thinking I'd trigger the Cassandra write from here?
spark.streams().addListener(new StreamingQueryListener() {
@Override
public void onQueryStarted(QueryStartedEvent queryStarted) {
System.out.println("Query started: " + queryStarted.id());
}
@Override
public void onQueryTerminated(QueryTerminatedEvent queryTerminated) {
System.out.println("Query terminated: " + queryTerminated.id());
}
@Override
public void onQueryProgress(QueryProgressEvent queryProgress) {
System.out.println("Query made progress: " + queryProgress.progress());
}
});
Dataset<Row> reader = spark
.readStream()
.format("kafka")
.option("startingOffsets", "latest")
.option("kafka.bootstrap.servers", "...etc...")
.option("subscribe", "my_topic")
.load();
Dataset<String> lines = reader
.selectExpr("cast(value as string)")
.as(Encoders.STRING());
StreamingQuery query = lines
.writeStream()
.format("console")
.start();
query.awaitTermination();
} catch (Exception e) {
e.printStackTrace();
}
我也可以用Spark SQL查詢Cassandra:
try {
SparkSession spark = SparkSession.builder()
.appName("SparkSqlCassandraTest")
.master("local[2]")
.getOrCreate();
Dataset<Row> reader = spark
.read()
.format("org.apache.spark.sql.cassandra")
.option("host", this.cassandraAddress)
.option("port", this.cassandraPort)
.option("keyspace", "my_keyspace")
.option("table", "my_table")
.load();
reader.printSchema();
reader.show();
spark.stop();
} catch (Exception e) {
e.printStackTrace();
}
我的想法是; 使用前者觸發后者,將其捆綁為Spark應用程序/程序包/任何東西,並將其部署到spark中。 到那時,我希望它能夠不斷將更新推送到指標表。
這將是我需要的可行,可擴展,合理的解決方案嗎? 我在正確的道路上嗎? 如果某種程度上更輕松或更佳,則不反對使用Scala。
謝謝!
編輯 :這是我要面對的圖。
得到它了。 了解了有關ForeachWriter的信息。 效果很好:
StreamingQuery query = lines
.writeStream()
.format("foreach")
.foreach(new ForeachWriter<String>() {
@Override
public void process(String value) {
System.out.println("process() value = " + value);
}
@Override
public void close(Throwable errorOrNull) {}
@Override
public boolean open(long partitionId, long version) {
return true;
}
})
.start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.