Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么两个spark流媒体作业使用相同的组id从同一个Kafka主题中提取消息,而不是平衡负载,而是获取相同的消息?_Apache Spark_Apache Kafka_Spark Streaming - Fatal编程技术网

Apache spark 为什么两个spark流媒体作业使用相同的组id从同一个Kafka主题中提取消息,而不是平衡负载,而是获取相同的消息?

Apache spark 为什么两个spark流媒体作业使用相同的组id从同一个Kafka主题中提取消息,而不是平衡负载,而是获取相同的消息?,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,卡夫卡0.8官方文件对卡夫卡消费者的描述如下: ... ... HashMap<String, String> kafkaParams = new HashMap<String, String>(); kafkaParams.put("metadata.broker.list", brokerList); kafkaParams.put("group.id", groupId); JavaPairInputDStream<

卡夫卡0.8官方文件对卡夫卡消费者的描述如下:

    ... ...

    HashMap<String, String> kafkaParams = new HashMap<String, String>();
    kafkaParams.put("metadata.broker.list", brokerList);
    kafkaParams.put("group.id", groupId);

    JavaPairInputDStream<String, String> messages = KafkaUtils.createDirectStream(
                jssc,
                String.class,
                String.class,
                StringDecoder.class,
                StringDecoder.class,
                kafkaParams,
                topicsSet
        );

    messages.foreachRDD(new Function<JavaPairRDD<String, String>, Void>() {

        @Override
        public Void call(JavaPairRDD<String, String> rdd) throws Exception {
            long msgNum = strJavaRDD.count();
            System.out.println("There are " + msgNum + " messages read from Kafka.");

        ... ...

        return null;}});
“使用者使用使用者组名称标记自己,发布到主题的每条消息都会传递到每个订阅使用者组中的一个使用者实例。使用者实例可以位于单独的进程中,也可以位于单独的计算机上。 如果所有使用者实例都有相同的使用者组,那么这就像传统的队列平衡使用者的负载一样。”

我使用Kafka 0.8.1.1设置了一个Kafka集群,并使用Spark Streaming job(Spark 1.3)从其主题中提取数据。火花流代码如下所示:

    ... ...

    HashMap<String, String> kafkaParams = new HashMap<String, String>();
    kafkaParams.put("metadata.broker.list", brokerList);
    kafkaParams.put("group.id", groupId);

    JavaPairInputDStream<String, String> messages = KafkaUtils.createDirectStream(
                jssc,
                String.class,
                String.class,
                StringDecoder.class,
                StringDecoder.class,
                kafkaParams,
                topicsSet
        );

    messages.foreachRDD(new Function<JavaPairRDD<String, String>, Void>() {

        @Override
        public Void call(JavaPairRDD<String, String> rdd) throws Exception {
            long msgNum = strJavaRDD.count();
            System.out.println("There are " + msgNum + " messages read from Kafka.");

        ... ...

        return null;}});
。。。
HashMap kafkaParams=新HashMap();
kafkaParams.put(“metadata.broker.list”,brokerList);
kafkaParams.put(“group.id”,groupId);
JavaPairInputStream消息=KafkaUtils.createDirectStream(
jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
卡夫卡帕拉姆斯,
主题集
);
messages.foreachRDD(新函数(){
@凌驾
公共Void调用(JavaPairdd rdd)引发异常{
long msgNum=strjavard.count();
System.out.println(“有从卡夫卡读取的“+msgNum+”消息”);
... ...
返回null;}});
然后我提交了两个Spark流媒体作业,以访问具有相同组id的同一主题。我假设,当我向该主题发送100条消息时,这两个作业总共收到100条消息(例如,job1获得50条,job2获得50条;或者job1获得100条,job2获得0条)。然而,他们分别得到100分。这样的结果似乎与卡夫卡博士所说的有所不同

我的密码有什么问题吗?我是否正确设置了组id配置?这是createDirectStream()的错误还是设计


测试环境:Kafka 0.8.1.1+Spark 1.3.1

组是0.9版之前Kafka高级消费API的一个功能,在简单消费API中不可用
createDirectStream
使用简单的消费者API

一些提示:

  • 使用SimpleConsumer实现的主要原因是您希望对分区使用的控制比消费者组提供的更大。(例如:多次阅读一条消息)

  • createDirectStream:这种方法不使用接收器来接收数据,而是定期查询Kafka以查找每个主题+分区中的最新偏移量,并相应地定义每个批处理中要处理的偏移量范围

  • 参考:



  • Kafka 0.9.0版本添加了一个新的Java使用者,以取代现有的基于ZooKeeper的高级使用者和低级使用者API。然后,您可以同时使用组和提交偏移量手册。

    创建两个不同的spark应用程序来对相同的消息执行相同的操作是没有意义的。将一个应用程序与多个执行者一起使用。

    明白了。我需要使用“createStream”而不是“createDirectStream”在共享单个组id的线程之间共享主题中的消息。