【转载】精讲Spark Streaming集成读取kafka0.10及以上版本

【Spark实战系列】sparkstreaming 消费 kafka0.10 中的 LocationStrategies 和 ConsumerStrategies 代表的是什么含义? LocationStrategies 新的Kafka使用者API将预先获取消息到缓冲区。因此,出于性能原因,Spark集成将缓存的消费者保留在执行程序上(而不是为每个批处理重新创建它们),并且更喜欢在具有适当使用者的主机位置上安排分区,这一点很重要。 在大多数情况下,您应该使用LocationStrategies.PreferConsistent,如上所示。这将在可用执行程序之间均匀分配分区。... 阅读详情

前言

转载于https://blog.youkuaiyun.com/daerzei/article/details/80085121,十分感谢作者大大。

Spark版本:2.1.2
JDK版本:1.8
Scala版本:2.11.8
Linux版本:CentOS6.9
IDEA版本:2017.3
Kafka连接jar包:spark-streaming-kafka-0-10_2.11 (2.1.2)
每次重新搭建环境都或多或少地去网上搜一下,这次终于狠下心把它写出来。
仔细阅读了英文官方文档,又参考了好多博客,花了二天时间才写完。
真没有想到要用这么久,看来会用与写出来形成自己的东西还是有很大差距的啊。

博客以官方文档的意思为主,加上自己的理解和实践,形成此文
想看原汁原味的可以点下面的链接:
http://spark.apache.org/docs/2.1.2/streaming-kafka-0-10-integration.html

添加Kafka依赖
首先Spark添加kafka依赖(Maven):

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

Spark2.2.X一样用,Spark2.3没有试

Direct Approach方式读取Kafka数据

在实际的应用中,Direct Approach方式可以很好地满足需要,与Receiver-based方式相比,有以下几方面的优势:

1. 降低资源

Direct不需要Receivers,其申请的Executors全部参与到计算任务中;而Receiver-based则需要专门的Receivers来读取Kafka数据且不参与计算。因此相同的资源申请,Direct 能够支持更大的业务。

2. 降低内存

Receiver-based的Receiver与其他Exectuor是异步的,并持续不断接收数据,对于小业务量的场景还好,如果遇到大业务量时,需要提高Receiver的内存,但是参与计算的Executor并无那么多的内存。而Direct 因为没有Receiver,而是在计算时读取数据,然后直接计算,所以对内存的要求很低。实际应用中我们可以把原先的10G降至现在的2-4G左右。

3. 稳定性更好
Receiver-based方法需要Receivers来异步持续不断的读取数据,因此遇到网络、存储负载等因素,导致实时任务出现堆积,但Receivers却还在持续读取数据,此种情况很容易导致计算崩溃。Direct 则没有这种顾虑,其Driver在触发batch 计算任务时,才会读取数据并计算。队列出现堆积并不会引起程序的失败。

4. 其他方面的优势
比如 简化并行(Simplified Parallelism)、高效(Efficiency)以及强一致性语义(Exactly-once semantics)。
虽然Direct 有以上这些优势,但是也存在一些不足,具体如下:

5. 提高成本
Direct需要用户采用checkpoint或者第三方存储来维护offsets,而不像Receiver-based那样,通过ZooKeeper来维护Offsets,此提高了用户的开发成本。一个完整的Demo

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka010.ConsumerStrategies;
import org.apache.spark.streaming.kafka010.KafkaUtils;
import org.apache.spark.streaming.kafka010.LocationStrategies;
import scala.Tuple2;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;


public final class test {

    public static void main(String[] args) throws Exception {
        SparkConf conf = new SparkConf().setAppName("demo").setMaster("local[4]");
        JavaStreamingContext streamingContext = new JavaStreamingContext(conf, Durations.seconds(8));

        Map<String, Object> kafkaParams = new HashMap<>();
        //Kafka服务监听端口
        kafkaParams.put("bootstrap.servers", "cm02.spark.com:9092");
        //指定kafka输出key的数据类型及编码格式(默认为字符串类型编码格式为uft-8)
        kafkaParams.put("key.deserializer", StringDeserializer.class);
        //指定kafka输出value的数据类型及编码格式(默认为字符串类型编码格式为uft-8)
        kafkaParams.put("value.deserializer", StringDeserializer.class);
        //消费者ID,随意指定
        kafkaParams.put("group.id", "jis");
        //指定从latest(最新,其他版本的是largest这里不行)还是smallest(最早)处开始读取数据
        kafkaParams.put("auto.offset.reset", "latest");
        //如果true,consumer定期地往zookeeper写入每个分区的offset
        kafkaParams.put("enable.auto.commit", false);

        //要监听的Topic,可以同时监听多个
        Collection<String> topics = Arrays.asList("test");

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

        stream.mapToPair(
                new PairFunction<ConsumerRecord<String, String>, String, String>() {
                    @Override
                    public Tuple2<String, String> call(ConsumerRecord<String, String> record) {
                        return new Tuple2<>(record.key(), record.value());
                    }
                });
        stream.print();

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


这里默认Spark、Kafka已经安装好了
在Kafka根目录下执行以下命令
启动Kafka

bin/kafka-server-start.sh config/server.properties


启动生产者,Topic命名为test

bin/kafka-console-producer.sh --broker-list cm02.spark.com:9092 --topic test

OK,到这里实现已经实现了,Direct 方式有什么优点,有什么不同,程序中各个参数是什么意思相信你大致都明白了,做一个Demo,或者解决问题应该都没有问题吧有问题可以留言哈。

上面讲的基本使用加面试已经就够用了, 有时间就继续看,赶项目就去Coding吧。
下面讲的都是一些参数啊,原理啊什么的,更深入些。

LocationStrategies(本地策略)


新版本的Kafka消费者API会将预先获取的消息写入缓存。因此,Spark在Executor端缓存消费者(而不是每次都重建)对于性能非常重要 ,并且系统会自动为分区分配在同一主机上的消费者进程(如果有的话)
一般来讲,你最好像上面的Demo一样使用LocationStrategies的PreferConsistent方法。
它会将分区数据尽可能均匀地分配给所有可用的Executor。
题外话:本地化策略看到这里就行了,下面讲的是一些特殊情况。

  1. 情况一:如果你的Executor和kafka broker在同一台机器上,可以用PreferBrokers,这将优先将分区调度到kafka分区leader所在的主机上。题外话:废话,Executor是随机分布的,我怎么知道是不是在同一台服务器上?除非是单机版的are you明白?
  2. 情况二:分区之间的负荷有明显的倾斜,可以用PreferFixed。这个允许你指定一个明确的分区到主机的映射(没有指定的分区将会使用连续的地址)。题外话:就是出现了数据倾斜了呗

Kafka的最大分区数

消费者缓存的数目默认最大值是64。如果你希望处理超过(64*excutor数目)kafka分区,配置参数:spark.streaming.kafka.consumer.cache.maxCapacity

是否禁止Kafka消费者缓存

如果你想禁止kafka消费者缓存,可以将spark.streaming.kafka.consumer.cache.enabled修改为false。禁止缓存缓存可能需要解决SPARK-19185描述的问题。一旦这个bug解决,这个属性将会在后期的spark版本中移除(Spark2.2.1的Bug)。

缓存的唯一性

Cache是根据topic的partition和groupid来唯一标识的,所以每次调用createDirectStream的时候要单独设置group.id。

消费者策略

新的Kafka消费者API有许多不同的方式来指定主题。它们相当多的是在对象实例化后进行设置的。ConsumerStrategies提供了一种抽象,它允许Spark即使在checkpoint重启之后(也就是Spark重启)也能获得配置好的消费者。

  1. ConsumerStrategies允许订阅确切指定的一组Topic。
  2. ConsumerStrategies的Subscribe方法通过一个确定的集合来指定Topic
  3. ConsumerStrategies的SubscribePattern方法允许你使用正则表达式来指定Topic,

注意,与0.8集成不同,在SparkStreaming运行期间使用Subscribe或SubscribePattern,应该响应添加分区。
最后,ConsumerStrategies.Assign()方法允许指定固定的分区集合。
所有三个策略(Subscribe,SubscribePattern,Assign)都有重载的构造函数,允许您指定特定分区的起始偏移量。

如果上述不满足您的特定需求,可以对ConsumerStrategy进行扩展、重写

到这里Direct方式参数和原理也讲完了,下面bibi了一堆其他的没用的,至少不常用,如果你还有耐心的话可以留着看其他更重要的部分,如果你还有心情的话想看还可以看看(博客写到这里我真是没有心情了,太难翻译了,休息一下再写吧)

创建一个RDD(Creating an RDD)

这部分官网罗里罗嗦一大堆,没看明白什么意思,看了好多博客,又跑了几次程序才明白是怎么回事。
意思就是原来是通过时间来取数据的,比如说一次取个5秒的数据什么的,这个方法是根据条数来取的,比如说一次取个100条,但是没有看明白的是:这不是SparkStreaming吗?怎么成RDD了?RDD怎么进行流式数据处理啊?然后下面又给出了一个例子

OffsetRange[] offsetRanges = {
  // topic, partition, inclusive starting offset, exclusive ending offset
  //参数依次是Topic名称,Kafka哪个分区,开始位置(偏移),结束位置
  OffsetRange.create("test", 0, 0, 100),
  OffsetRange.create("test", 1, 0, 100)
};

//注意,这里返回的是一个RDD
JavaRDD<ConsumerRecord<String, String>> rdd = KafkaUtils.createRDD(
  sparkContext,
  kafkaParams,
  offsetRanges,
  LocationStrategies.PreferConsistent()
);

获取偏移

在进行流式批处理的时候根据条数取数据还是有点用的,官网给出了一个例子

stream.foreachRDD(new VoidFunction<JavaRDD<ConsumerRecord<String, String>>>() {
  @Override
  public void call(JavaRDD<ConsumerRecord<String, String>> rdd) {
    //获取偏移
    final OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
    rdd.foreachPartition(new VoidFunction<Iterator<ConsumerRecord<String, String>>>() {
      @Override
      public void call(Iterator<ConsumerRecord<String, String>> consumerRecords) {
        OffsetRange o = offsetRanges[TaskContext.get().partitionId()];
        //获取Topic,Partition,起始偏移量,结束偏移量
        System.out.println(
          o.topic() + " " + o.partition() + " " + o.fromOffset() + " " + o.untilOffset());
      }
    });
  }
});

存储偏移

不按官方的翻译了,这段的大致意思是:要想在任何情况下(注意是任何情况)都保证Kafka的数据都只被消费一次你还需要存储一下Kafka的偏移量,有三种方式来存储Kafka的偏移量。

 

  • 第一种方式:Checkpoint(Spark的一个持久化机制)这种方式很容易做到,
    但是有以下的缺点:
    1. 多次输出,结果必须满足幂等性(什么意思自己Google)
    2. 事务性不可选
    3. 如果代码变更不能从Checkpoint恢复,不过你可以同时运行新任务和旧任务,因为输出结果具有等幂性
  • 二种方式:Kafka自身
    Kafka提供的有api,可以将offset提交到指定的kafkatopic。默认情况下,新的消费者会周期性的自动提交offset到kafka。但是有些情况下,这也会有些问题,因为消息可能已经被消费者从kafka拉去出来,但是spark还没处理,这种情况下会导致一些错误。这也是为什么例子中stream将enable.auto.commit设置为了false。然而在已经提交spark输出结果之后,你可以手动提交偏移到kafka。相对于checkpoint,offset存储到kafka的好处是:kafka既是一个容错的存储系统,也是可以避免代码变更带来的麻烦。然而,Kafka不是事务性的,所以你的输出必须仍然是幂等的。
stream.foreachRDD(new VoidFunction<JavaRDD<ConsumerRecord<String, String>>>() {
  @Override
  public void call(JavaRDD<ConsumerRecord<String, String>> rdd) {
    OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();

    // some time later, after outputs have completed
    ((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
  }
});
  • 第三种方式:自定义存储位置
    对于支持事务的数据存储,即使在故障情况下,也可以在同一事务中保存偏移量作为结果,以保持两者同步。如果您仔细检查重复或跳过的偏移范围,则回滚事务可防止重复或丢失的邮件影响结果。这给出了恰好一次语义的等价物。也可以使用这种策略甚至对于聚合产生的输出,聚合通常很难使幂等。
// The details depend on your data store, but the general idea looks like this

// begin from the the offsets committed to the databaseMap<TopicPartition, Long> fromOffsets = new HashMap<>();for (resultSet : selectOffsetsFromYourDatabase)
fromOffsets.put(new TopicPartition(resultSet.string("topic"), resultSet.int("partition")), resultSet.long("offset"));}

JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(
streamingContext,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Assign(fromOffsets.keySet(), kafkaParams, fromOffsets));

stream.foreachRDD(new VoidFunction<JavaRDD<ConsumerRecord<String, String>>>() {
@Override
public void call(JavaRDD<ConsumerRecord<String, String>> rdd) {
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
Object results = yourCalculation(rdd);

// begin your transaction

// update results
// update offsets where the end of existing offsets matches the beginning of this batch of offsets
// assert that offsets were updated correctly

// end your transaction
}});

有什么问题欢迎评论啊
辛苦写了这么多如果觉得有用就点个赞吧,您解决问题我,我增加积分哈

spark-streaming-kafka-0-10_2.12-3.0.0.jar spark3.0.0版本对接kafka数据源需要的jar包,最新的版本导致maven的阿里云仓库不能直接下载下来,所以需要手动导入jar包进行操作,有需要的朋友可以免费下载 立即下载

相关推荐

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 345

Kafka+Spark-Streaming实现流式计算(WordCount)

Kafka+Spark-Streaming实现流式计算(WordCount)

qq_53578487的博客 477

LCD工程师必看:Pixelclock、Mipi Clk计算全解析(附实用公式)

本文为LCD工程师详细解析了像素时钟(Pixelclock)与MIPI时钟(Mipi Clk)的核心计算方法。文章从时序参数构成入手,通过实战公式推导,系统阐述了从屏幕分辨率、刷新率到最终MIPI速率的高效计算链路,并提供了实用的调试思路与排查清单,帮助工程师快速解决画面撕裂、闪烁等常见问题。

weixin_29266679的博客 385

使用Pyspark库读取kafka流数据

这是 Spark SQL 与 Kafka 集成的 JAR 包。它提供了与 Kafka 版本集成所需的类和方法,可用于将 Spark SQL 与 Kafka 进行无缝集成,通过 SQL 查询和处理 Kafka 中的数据。:这是 Kafka 客户端库的 JAR 包,用于与 Kafka 集群进行通信。:它提供了与 Kafka 集成所需的类和方法,可以从 Kafka 主题中以低延迟、高吞吐量的方式读取和处理数据。首先我们需要准备5个连接和读取kafka的jar包,放入到 spark 目录的 jars 文件夹中。

adamconan的博客 2347

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 187

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

用Kafka和Spark-streaming实现流式计算

kafka和spark-streaming实现流式计算

m0_66279156的博客 787

YOLO11改进-注意力-引入级联组注意力机制(Cascaded Group Attention, CGA)

输入特征拆分:输入特征进入 CGA 模块后,被均匀拆分为个部分,每个部分作为一个注意力头的输入,这样每个头关注输入特征的不同部分,实现特征的并行处理,同时为提高注意力多样性奠定基础。注意力头计算单元:每个注意力头包含三个线性投影层、、用于将输入特征映射到不同子空间,以及计算自注意力的单元。在计算过程中,通过注意力头之间的级联操作,前一个头的输出会累加到下一个头的输入上,实现特征的逐步细化。

qq_64693987的博客 2489

kafka+spark

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、安装kafka二、spark安装kakfa依赖库三、1.引入库2.读入数据总结 一、安装kafka 官方下载地址: https://kafka.apache.org/downloads $cd ~/下载 sudo tar -zxf kafka_2.11-0.10.1.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.11-0.10.1.0/ .

weixin_44209550的博客 2584

【020】C++ 动态内存管理解析:new 和 delete 的正确使用

C++中的动态内存分配是在程序运行时根据需要进行内存空间的分配和释放,与静态内存分配相比,具有更大的灵活性和适应性。动态内存分配可以通过new和delete或者malloc()和free()等函数实现。在程序运行时无法确定所需的内存大小。需要在多个函数之间共享数据,并且数据可能被频繁地创建和销毁。静态数组无法满足需求,例如需要支持可变长度数组。如果在动态分配内存后忘记了释放它,则会导致内存泄漏。为避免内存泄漏,可以使用智能指针或手动管理内存的方式来释放动态分配的内存。

Lion_Long的博客 1470

YOLOv13有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv13改进专栏重磅更新》推出500+创新改进方案,涵盖卷积、主干网络、注意力机制、检测头等核心模块优化。专栏提供完整项目代码及答疑服务,包含YOLOv13网络结构解析、环境配置、模型训练全流程指导。内容分为八大模块:卷积优化、注意力机制、细节涨点、主干网络改进、特征融合、检测头优化、小目标检测及Mamba联合改进等,支持多种创新点组合应用,助力科研论文发表。现开放限时订阅,提供试读章节和详细技术解析。

Ai缝合怪、助力小伙伴高效发论文 3368

spark-streaming-kafka-0-10_2.12 api

因为更新了scala 2.12 版本 老的kafka api 会报错,翻了半天博客记录一下 package com.sq.sparkstreaming import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.TopicPartition import org.apache.k...

Geek_SQ 1324

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决

Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。

奶爸的编程之路,也就一周冷个三天 1957

精讲Spark Streaming集成读取kafka0.10及以上版本

前言 Spark版本:2.1.2 JDK版本:1.8 Scala版本:2.11.8 Linux版本:CentOS6.9 IDEA版本:2017.3 Kafka连接jar包:spark-streaming-kafka-0-10_2.11 (2.1.2) 每次重新搭建环境都或多或少地去网上搜一下,这次终于狠下心把它写出来。 仔细阅读了英文官方文档,又参考了好多博客,花了二天时间才...

荒野雄兵的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蔚来汽车技术笔试深度复盘:算法、系统设计与Java并发考点解析

数据结构与算法是计算机科学的核心基础,其原理在于通过高效组织数据与设计计算步骤来解决复杂问题。掌握经典算法模型(如图论、动态规划)和数据结构(如哈希表、优先队列)能极大提升程序性能,技术价值体现在应对海量数据处理、高并发场景等实际工程挑战。在智能汽车、车联网等应用场景中,算法常用于车辆调度、路径规划、状态监控等业务。本文以一次大厂技术笔试为例,深入解析了**动态规划**和**Java并发**等热点的考察方式,从问题抽象、模型转化到编码实现,为开发者备战面试提供了系统性的解题思路和实操要点。

weixin_33724659的博客 558

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于Sqoop+Hive+MySQL构建离线日志分析平台实战指南

数据仓库作为企业数据资产的核心载体,其构建通常遵循ETL(抽取、转换、加载)这一经典范式,旨在将分散的业务数据整合为统一、规范的分析模型。其核心原理在于通过数据集成工具,将来自OLTP系统(如MySQL)的数据,高效、可靠地迁移至OLAP系统(如Hive),以支持海量历史数据的复杂聚合与深度挖掘。这一过程的技术价值在于,它实现了数据存储与计算能力的解耦,使得分析查询不再影响在线业务性能,同时为数据驱动决策提供了稳定基础。在应用场景上,网站日志分析、用户行为洞察、业务报表生成等都是典型用例。本文聚焦于使用Sq

weixin_33850015的博客 498

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Spark】SparkStreaming入门解析(二)

(图片来源于网络,侵删) 一、Spark Streaming整合Kafka 【1】 概述 开发中我们经常会利用SparkStreaming实时地读取kafka中的数据然后进行处理,在spark1.3版本后,kafkaUtils里面提供了两种创建DStream的方法: 1)Receiver接收方式: KafkaUtils.createDstream(开发中不用) Receiver作为常驻的Tas...

Together 3011

SparkStreaming kafka整合 源码解析

另外一个比较详细的博主链接https://blog.csdn.net/dax1n/article/details/61917718 这是真大佬! Spark Streaming 和kafka 连接 利用的是kafkaUtil 首先准备一部分初始代码: //创建SparkStreaming 对象 val conf: SparkConf = new SparkConf().setA...

qq_41733481的博客 817

Spark Streaming

Spark Streaming Spark Streaming是一个基于Spark Core之上的实时计算框架 SparkStreaming特点 易用:可以像编写离线批处理一样去编写流式程序,支持java/scala/python语言。 容错:SparkStreaming在没有额外代码和配置的情况下可以恢复丢失的工作。 易整合到Spark体系:流式处理与批处理和交互式查询相结合。 SparkStr...

weixin_44524441的博客 317

spark-streaming 消费kafka数据

首先安装hadoop spark集群。接下来是代码:     String brokers = "***:9098,***:9098";        String topics = "mail_send_click_test";        SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("streaming ...

xyz的博客 721

【大数据开发】Kafka——Spark2.x中消费者LocationStrategies、ConsumerStrategies的几种方式

一、LocationStrategy 大多数情况下,需要使用LocationStrategies.PreferConsistent,这会把partition平均分配到可用的executor上。如果executor和kafka的broker在同一台机器上,就要使用PreferBrokers,这样which will prefer to schedule partitions on the Kafka leader for that partition。最后,如果在partition中又严重的倾斜,使用Pref

白色风车 1293

sparkstreaming多consumer消费kafka报错问题

  版权声明:本文为博主原创文章,未经博主允许不得转载!! 欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80428047 交流QQ: 824203453   版本: sparkstreaming 2.2      kafka  0.10 sparkstreaming 集成kafka后(Direct模式),同一个groupi...

qq_824203453_的博客 6883

使用spark-streaming-kafka-0-10_2.11-2.0.0依赖包创建kafka输入流

object DirectStream { def main(args: Array[String]): Unit = { //创建SparkConf,如果将任务提交到集群中,那么要去掉.setMaster("local[2]") val conf = new SparkConf().setAppName("DirectStream").setMaster("...

学海无涯 6822

SparkStreaming创建DirectStream连接kafka时策略详解

SparkKafka直接流(createDirectStream)和kafka分区 每个kafka主题分区对应一个RDD分区。 spark可以通过spark.streaming.kafka.maxRatePerPartition 配置,对每个分区每秒接受的消息树进行控制。 LocationStrategies 位置策略, 控制特定的主题分区在哪个执行器上消费的。 在executor针对主题分区如...

虾哔哔的博客 1238

第八篇:《Kafka Connect 与 Kafka Streams:数据集成与流处理的两种路径》

还有 exactly.once.source.support 只覆盖 Source 侧的精确一次,Sink 侧的重复仍然要靠目标系统的幂等或 DLQ 兜底——这和第七篇的结论完全一致:框架不解决语义正确性,只解决工程效率。KRaft 和 EOS 让 Kafka 内部更可靠,但 Connect 和 Streams 的分工不会因此模糊:Connect 把数据搬进来搬出去,Streams 在 Kafka 内部算,算到边界之外仍然要自己兜底一致性。判断标准只有一句话:你是在“搬数据”,还是在“算数据”。

qq_45239623的博客 341
上一篇: Hadoop-lzo的安装和配置,亲测可用。
下一篇: Kafka的Lag计算误区及正确实现
codeforces
博客等级 码龄12年 45粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值