簡體   English   中英

Spark Streaming作業如何在Kafka主題上發送數據並將其保存在Elastic中

[英]Spark Streaming job how to send data on Kafka topic and saving it in Elastic

我正在研究一個數據分析項目,其中我正在從CSV文件中讀取數據,在Kafka主題上遍歷該數據並使用Spark Streaming來使用該Kafka主題數據。 我在一個項目中使用的所有組件。

現在使用Spark Streaming消耗數據后,我必須對它進行一些計算,我必須將數據保存到彈性搜索中,我必須將該數據發送到另一個主題上。 所以我正在從Spark Streaming做這些事情(將數據保存為彈性數據並將數據發送到主題)。

以下是我的代碼

@Component
public class RawEventSparkConsumer implements Serializable {

    @Autowired
    private ElasticSearchServiceImpl dataModelServiceImpl;

    @Autowired
    private EventKafkaProducer enrichEventKafkaProducer;

    Collection<String> topics = Arrays.asList("rawTopic");

    public void sparkRawEventConsumer(JavaStreamingContext streamingContext) {

        Map<String, Object> kafkaParams = new HashedMap();
        kafkaParams.put("bootstrap.servers", "localhost:9092");
        kafkaParams.put("key.deserializer", StringDeserializer.class);
        kafkaParams.put("value.deserializer", StringDeserializer.class);
        kafkaParams.put("group.id", "group1");
        kafkaParams.put("auto.offset.reset", "latest");
        kafkaParams.put("enable.auto.commit", true);

        JavaInputDStream<ConsumerRecord<String, String>> rawEventRDD = KafkaUtils.createDirectStream(streamingContext,
                LocationStrategies.PreferConsistent(),
                ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams));

        JavaDStream<String> dStream = rawEventRDD.map((x) -> x.value());

        JavaDStream<BaseDataModel> baseDataModelDStream = dStream.map(convertIntoBaseModel);
        baseDataModelDStream.foreachRDD(rdd1 -> {
            saveDataToElasticSearch(rdd1.collect());
        });

        JavaDStream<EnrichEventDataModel> enrichEventRdd = baseDataModelDStream.map(convertIntoEnrichModel);

        enrichEventRdd.foreachRDD(rdd -> {
            System.out.println("Inside rawEventRDD.foreachRDD = = = " + rdd.count());
            sendEnrichEventToKafkaTopic(rdd.collect());
        });

        streamingContext.start();

        try {
            streamingContext.awaitTermination();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    static Function convertIntoBaseModel = new Function<String, BaseDataModel>() {

        @Override
        public BaseDataModel call(String record) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            BaseDataModel csvDataModel = mapper.readValue(record, BaseDataModel.class);
            return csvDataModel;
        }
    };

    static Function convertIntoEnrichModel = new Function<BaseDataModel, EnrichEventDataModel>() {

        @Override
        public EnrichEventDataModel call(BaseDataModel csvDataModel) throws Exception {

            EnrichEventDataModel enrichEventDataModel = new EnrichEventDataModel(csvDataModel);
            enrichEventDataModel.setEnrichedUserName("Enriched User");
            User user = new User();
            user.setU_email("Nitin.Tyagi");
            enrichEventDataModel.setUser(user);
            return enrichEventDataModel;
        }
    };

    private void sendEnrichEventToKafkaTopic(List<EnrichEventDataModel> enrichEventDataModels) {
        if (enrichEventKafkaProducer != null && enrichEventDataModels != null && enrichEventDataModels.size() > 0)
            try {
                enrichEventKafkaProducer.sendEnrichEvent(enrichEventDataModels);
            } catch (JsonProcessingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    private void saveDataToElasticSearch(List<BaseDataModel> baseDataModelList) {
        if(!baseDataModelList.isEmpty())
            dataModelServiceImpl.saveAllBaseModel(baseDataModelList);
    }
}

現在我幾乎沒有問題

1)我的方法是否正常,即在Elastic Search中保存數據並從Spark Streaming上發送主題?

2)我在一個項目中使用app組件(Kafka,Spark Streaming),並且有多個Spark Streaming類。 我在本地系統中通過CommandLineRunner運行這些類。 那么現在如何將Spark Streaming作為一個火花工作提交?

對於Spark Submit,我是否需要使用Spark Streaming類創建單獨的項目?

我的方法是否正常,即在Elastic Search中保存數據並從Spark Streaming上發送主題?

我想我會考慮使用ES-Hadoop Spark庫。 看起來您剛剛直接使用了Elastic Java API(假設您正在收集RDD分區)

雖然它可能會起作用,但它是高度耦合的......當Elasticsearch因維護或其他高度潛伏而失敗時會發生什么? 整個應用程序是否停止了?

另一種方法是將Kafka處理邏輯拆分為自己的部署。 這樣,您也可以使用Elasticsearch Kafka Connect進程從主題加載數據,而無需自己編寫代碼(Connect API可能已經是您正在運行的Kafka集群的一部分)

有多個Spark Streaming類

多個主要課程? 那應該不是問題。 您需要為Spark提交提供單個JAR和單個類名。 您可以在一個jar中包含多個“入口點”/主要方法。

如何將Spark Streaming作為Spark工作提交?

我不確定我是否理解這個問題。 spark-submit適用於流媒體作業

注意:如果您計划更改數據類型或其順序,CSV是您可以放入Kafka的最糟糕的格式之一,並且您還希望除了您自己以外的任何人都可以使用該主題。 即使Elasticsearch更喜歡你有json編碼的有效載荷

暫無
暫無

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

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