簡體   English   中英

Apache Spark-在流事件中捕獲Kafka數據以觸發工作流

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

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