Kafka Spark-Streaming抵消问题

时间:2017-02-05 16:16:36

标签: java maven apache-kafka spark-streaming kafka-producer-api

使用Kafka Spark-Streaming。能够读取和处理从Producer发送的数据。我有一个场景,让我们假设Producer正在生成消息,而Consumer被关闭了一段时间并打开了。现在Conumser只读取实时数据。相反,它应该也保留了它停止阅读的数据。 这是我一直在使用的pom.xml。

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spark.version>2.0.1</spark.version>
        <kafka.version>0.8.2.2</kafka.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka_2.10 -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka_2.11</artifactId>
            <version>1.6.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka_2.11 -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.11</artifactId>
            <version>${kafka.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>${kafka.version}</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json4s/json4s-ast_2.11 -->
        <dependency>
            <groupId>org.json4s</groupId>
            <artifactId>json4s-ast_2.11</artifactId>
            <version>3.2.11</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.2.0</version>
        </dependency>

我尝试过使用Kafka-v0.10.1.0 Producer和Conumser。行为与预期一致(消费者从​​其离开的位置读取数据)。因此,在此版本中,可以正确地拾取偏移量。

尝试过使用上面pom.xml中的相同版本,但是java.lang.ClassCastException: kafka.cluster.BrokerEndPoint cannot be cast to kafka.cluster.Broker失败了。

我理解版本的兼容性,但我也在寻找连续的流。

1 个答案:

答案 0 :(得分:0)

不同的行为可能源于卡夫卡在版本0.8和0.10之间经历了一些相当大的变化。

除非您必须使用旧版本,否则我建议您切换到新版本。

看一下这个链接:

https://spark.apache.org/docs/latest/streaming-kafka-integration.html

  

Kafka项目在版本0.8和0.10之间引入了一个新的消费者api,因此有2个独立的相应Spark Streaming软件包可用。

如果您想使用Kafka v0.10.1.0,则必须指定一些kafka spark流集成依赖关系 https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-10_2.11

例如:

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-10_2.11 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.11</artifactId>
        <version>0.10.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>

附加说明:您使用的是2013年10月发布的hadoop 2.2.0,因此在Hadoop方面非常古老,您应该考虑将其更改为更新的版本。

如果有帮助,请告诉我。