kafka+spark(待整理)

本文介绍如何使用Spark Streaming整合Kafka实现数据流处理。通过具体代码示例展示了配置Spark Streaming应用、设置Kafka参数、订阅主题等步骤,并提供了集群部署及运行方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010._
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
* spark streaming 整合 kafka
*/
object KafkaDirectStream {

def main(args: Array[String]): Unit = {

val sparkConf = new SparkConf().setAppName("KafkaDirectStream").setMaster("local[2]")
val streamingContext = new StreamingContext(sparkConf, Seconds(5)) //5秒一个批次

val kafkaParams = Map[String, Object](
/*
* 指定broker的地址清单,清单里不需要包含所有的broker地址,生产者会从给定的broker里查找其他broker的信息。
* 不过建议至少提供两个broker的信息作为容错。
*/
"bootstrap.servers" -> "test:9091,test:9092,test:9093",
/*键的序列化器*/
"key.deserializer" -> classOf[StringDeserializer],
/*值的序列化器*/
"value.deserializer" -> classOf[StringDeserializer],
/*消费者所在分组的ID*/
"group.id" -> "spark-streaming-group",
/*
* 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
* latest: 在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
* earliest: 在偏移量无效的情况下,消费者将从起始位置读取分区的记录
*/
"auto.offset.reset" -> "latest",
/*是否自动提交*/
"enable.auto.commit" -> (true: java.lang.Boolean)
)

/*可以同时订阅多个主题*/
val topics = Array("abc")
val stream = KafkaUtils.createDirectStream[String, String](
streamingContext,
/*位置策略*/
PreferConsistent,
/*订阅主题*/
Subscribe[String, String](topics, kafkaParams)
)

                   //stream.saveAsTextFiles("D:\\wps\\a")           写入本地文件
            //stream.saveAsTextFiles("hdfs://192.168.0.118:9000/root/eight9/") 写入 hdfs

/*打印输入流*/
stream.map(record => (record.key, record.value)).print()

streamingContext.start()
streamingContext.awaitTermination()
}
}
 
 

 

 下面才是正规的   pom.xml  和 自己集群版本一致

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.produce</groupId>
<artifactId>produce</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>

<dependency>
<groupId>com.thoughtworks.paranamer</groupId>
<artifactId>paranamer</artifactId>
<version>2.8</version>
</dependency>
<dependency> <!-- Spark -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.0</version>

</dependency>
<dependency> <!-- Spark Streaming -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.4.0</version>

</dependency>

<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
<version>2.4.0</version>
</dependency>


<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

 

然后  kafka 部分   (版本为 scala 2.2.* )  kafka 2.2  (2.1 不支持指定broker)

创建生产者
bin/kafka-console-producer.sh --broker-list test:9091,test:9092,test:9093 --topic abc




查看topic list
 bin/kafka-topics.sh --list --bootstrap-server test:9091,test:9092,test:9093     



创建 topic
bin/kafka-console-producer.sh --broker-list test:9091,test:9092,test:9093  --topic abc

 

如果遇到程序代码  卡死在  kafka commit 的情况下,意味着 kafka找不到 broker地址,真他妈煞笔,需要将虚拟机  的  ip  hostname  填写在  
C:\Windows\System32\drivers\etc
上面

kafka就可以找到相应 broker的 topic

 

 

 

 

 

 

集群方式

代码

import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010._
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * spark streaming 整合 kafka
  */
object KafkaDirectStream {

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setAppName("KafkaDirectStream").setMaster("spark://test:7077")
    val streamingContext = new StreamingContext(sparkConf, Seconds(5))             //5秒一个批次

    val kafkaParams = Map[String, Object](
      /*
       * 指定broker的地址清单,清单里不需要包含所有的broker地址,生产者会从给定的broker里查找其他broker的信息。
       * 不过建议至少提供两个broker的信息作为容错。
       */
      "bootstrap.servers" -> "test:9091,test:9092,test:9093",
      /*键的序列化器*/
      "key.deserializer" -> classOf[StringDeserializer],
      /*值的序列化器*/
      "value.deserializer" -> classOf[StringDeserializer],
      /*消费者所在分组的ID*/
      "group.id" -> "spark-streaming-group",
      /*
       * 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
       * latest: 在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
       * earliest: 在偏移量无效的情况下,消费者将从起始位置读取分区的记录
       */
      "auto.offset.reset" -> "latest",
      /*是否自动提交*/
      "enable.auto.commit" -> (true: java.lang.Boolean)
    )

    /*可以同时订阅多个主题*/
    val topics = Array("abc")
    val stream = KafkaUtils.createDirectStream[String, String](
      streamingContext,
      /*位置策略*/
      PreferConsistent,
      /*订阅主题*/
      Subscribe[String, String](topics, kafkaParams)
    )

//stream.saveAsTextFiles("hdfs://192.168.0.118:9000/root/hello/")      //写入 hdfs
/*打印输入流*/ stream.map(record => (record.key, record.value)).print() streamingContext.start() streamingContext.awaitTermination() } }
maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.produce</groupId>
    <artifactId>produce</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>com.thoughtworks.paranamer</groupId>
            <artifactId>paranamer</artifactId>
            <version>2.8</version>
        </dependency>
        <dependency> <!-- Spark -->
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.4.0</version>

        </dependency>
        <dependency> <!-- Spark Streaming -->
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>2.4.0</version>

        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
            <version>2.4.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

 

集群提交方式

./bin/spark-submit --class KafkaDirectStream --num-executors 4 --driver-memory 1G --executor-memory 1g --executor-cores 1 --conf spark.default.parallelism=1000 produce.jar

 

组件版本

JDK    8
scala  2.11.*
kafka  kafka_2.11-2.2.0
spark  spark-2.4.0-bin-hadoop2.7

版本不对  会报 method not found  (版本信息)

 

转载于:https://www.cnblogs.com/tangsonghuai/p/11204247.html

### Spring Boot 整合 Flume, KafkaSpark Streaming 架构设计 #### 1. 数据流概述 在该架构中,Flume 被用于收集来自不同源头的日志数据并将其传输到 Kafka 中。Kafka 则作为一个高吞吐量的消息队列来存储这些日志消息直到被处理。而 Spark Streaming 扮演着消费者的角色,它会订阅特定主题下的消息来进行实时分析工作[^1]。 #### 2. 组件间交互流程描述 - **Flume Agent**: 配置好 source、channel 及 sink 后启动 agent 实例;source 接收应用程序产生的原始日志文件或其他形式输入的数据,并通过 channel 发送到指定位置即 Kafka 的 topic 上。 - **Kafka Broker**: 创建相应的 topics 来接收由 flume 发送过来的信息片段,在此期间可以设置副本因子以及分区数量以提高系统的可靠性和性能表现[^5]。 - **Spring Boot Application with Embedded Consumer Logic**: - 使用 `@KafkaListener` 注解监听目标 Topic 并消费其中的内容; - 对获取到的消息执行初步过滤或转换操作以便后续传递给 spark streaming 进行更深入地加工处理。 - **Spark Streaming Job Submission via REST API Provided by Spring Boot App** - 开发者可以在 spring boot 应用程序内部定义一套 restful api ,允许外部调用来提交新的 spark job 或管理现有作业的状态 (start/stop/retrieve logs etc.) ; - 当收到请求时,则按照预设参数构建命令字符串并通过 ProcessBuilder 类型对象去运行实际的 shell 命令完成任务部署过程[^3]。 ```bash # Example of submitting a Spark Streaming application through command line which could be invoked programmatically within the Spring Boot app. ./spark-submit \ --class com.example.SparkJobClass \ --master yarn-client \ --num-executors 4 \ --executor-memory 2G \ --total-executor-cores 8 \ /path/to/application-jar-file.jar \ <args> ``` #### 3. 技术选型考量因素 为了确保整个体系结构具备良好的扩展能力与维护便利性,在技术栈的选择方面需综合考虑如下几个维度: - **兼容性**:所选用的技术组件之间是否存在良好协作关系?比如版本匹配度如何? - **社区支持程度**:是否有活跃开发者群体提供帮助文档和技术指导资源? - **成本效益比**:硬件设施投入产出比例是否合理? ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值