SparkStreaming对接kafka的两种方式

本文详细介绍了SparkStreaming与Kafka对接的receiver和direct两种方式。receiver方式中,数据存储在Executor内存可能导致丢失,可通过启用WAL解决,但并行度受限。direct方式避免了数据丢失,提供更好的并行性和事务一致性,直接从Kafka读取数据,简化并行读取,提高性能。
摘要由CSDN通过智能技术生成

第一种:receiver方式。

1、receiver不停地从kafka拉取数据,n秒钟(程序设置的)拉取产生一批数据
2、这种方式偏移量zookeeper帮我们管理,灵活性差

这种方式有缺点:
    receiver从Kafka中获取的数据都存储在Spark Executor的内存中,某个时间段内拉去的数据可能会大于某台机器executor分配的内存数量,部分数据会溢出丢失。
    针对这一问题,1.2版本之后提供记log方式(Streaming的预写日志机制)(Write Ahead Log,WAL)。该机制会将从kafka中读取的数据先保存到hdfs或者S3上,然后再去消费数据,WAL是为了防止数据的丢失,可以对数据进行恢复。所以,即使底层节点出现了失败,也可以使用预写日志中的数据进行恢复。
使用时的注意事项:
    1)Kafka中topic的partition与Spark中RDD的partition是没有关系的,因此,在KafkaUtils.createStream()中,提高partition的数量,只会增加Receiver的数量,也就是读取Kafka中topic partition的线程数量,不会增加Spark处理数据的并行度。
    2)可以创建多个Kafka输入DStream,使用不同的consumer group和topic,来通过多个receiver并行接收数据。
    3࿰

可以使用 Apache Spark Streaming 库来从 Apache Kafka 消息队列中读取数据。首先,需要在 pom.xml 文件中添加 Spark StreamingKafka 的依赖: ``` <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>2.4.7</version> </dependency> ``` 然后,在代码中可以使用 KafkaUtils 类的 createDirectStream 方法来创建一个 DStream,该 DStream 会从 Kafka 中读取数据。示例代码如下: ``` // 创建 Spark 上下文 val sparkConf = new SparkConf().setAppName("KafkaStreaming").setMaster("local[*]") val ssc = new StreamingContext(sparkConf, Seconds(10)) // Kafka 配置信息 val kafkaParams = Map[String, Object]( "bootstrap.servers" -> "localhost:9092", "key.deserializer" -> classOf[StringDeserializer], "value.deserializer" -> classOf[StringDeserializer], "group.id" -> "spark-streaming-group", "auto.offset.reset" -> "latest", "enable.auto.commit" -> (false: java.lang.Boolean) ) // 要从哪些主题中读取数据 val topics = Array("test") // 创建 DStream val stream = KafkaUtils.createDirectStream[String, String]( ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParams) ) // 处理数据 val lines = stream.map(record => (record.key, record.value)) lines.print() // 启动流处理程序 ssc.start() ssc.awaitTermination() ``` 在这段代码中,Kafka 的配置信息存储在 kafkaParams 变量中,包括 Kafka 服务器地址、序列化器类型、消费组 ID 等。topics 变量则存储了要从哪些主题中读取数据。最后
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值