代码之家  ›  专栏  ›  技术社区  ›  sharon gur

Kafka spark同步流处理作业

  •  1
  • sharon gur  · 技术社区  · 6 年前

    我正在尝试一个简单的测试,我使用卡夫卡连接和spark

    我编写了一个自定义卡夫卡连接来创建此源记录

    SourceRecord sr = new SourceRecord(null,
                        null,
                        destTopic,
                       Schema.STRING_SCHEMA,
                        cleanPath);
    

    在火花中,我收到了这样的信息

    val kafkaConsumerParams = Map[String, String](
          "metadata.broker.list" -> prop.getProperty("kafka_host"),
          "zookeeper.connect" -> prop.getProperty("zookeeper_host"),
          "group.id" -> prop.getProperty("kafka_group_id"),
          "schema.registry.url" -> prop.getProperty("schema_registry_url"),
          "auto.offset.reset" -> prop.getProperty("auto_offset_reset")
        )
    val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaConsumerParams, topicsSet)
    
    val ds = messages.foreachRDD(rdd => {
              val toPrint = rdd.map(t => {
                val file_path = t._2
    
                val startTime = DateTime.now()
    
    
                Thread.sleep(1000 * 60)
                1
          }).sum()
            LogUtils.getLogger(classOf[DeviceManager]).info(" toPrint = " + toPrint +" (number of flows calculated)")
          })
        }
    

    当我使用连接器向所需主题发送多条消息时(在我的测试中,它有6个分区) 睡眠线程获取所有消息,但以同步方式而不是异步方式执行它们。

    当我创建一个简单的测试生成器时,休眠是异步完成的。

    我还创建了两个简单的使用者,并尝试了连接器和生产者,这两个任务都是异步使用的 这意味着我的问题在于spark接收连接器发送的消息的方式。 我无法理解为什么这些任务的执行方式与我从制作人那里发送的任务不一样。

    我甚至打印了spark收到的唱片,它们完全一样

    制作人发送的记录

    1: {partition=2, offset=11, value=something, key=null}
    2: {partition=5, offset=9, value=something2, key=null}
    

    连接发送的记录

    1: {partition=3, offset=9, value=something, key=null}
    

    我的项目中使用的版本是

        <scala.version>2.11.7</scala.version>
        <confluent.version>4.0.0</confluent.version>
        <kafka.version>1.0.0</kafka.version>
        <java.version>1.8</java.version>
        <spark.version>2.0.0</spark.version>
    

    依赖项

     <dependency>
                <groupId>io.confluent</groupId>
                <artifactId>kafka-avro-serializer</artifactId>
                <version>${confluent.version}</version>
            </dependency>
            <dependency>
                <groupId>io.confluent</groupId>
                <artifactId>kafka-schema-registry-client</artifactId>
                <version>${confluent.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro</artifactId>
                <version>1.8.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.11</artifactId>
                <version>${spark.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-sql_2.11</artifactId>
                <version>${spark.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming_2.11</artifactId>
                <version>${spark.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-streaming-kafka_2.11</artifactId>
                <version>1.6.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-graphx_2.11</artifactId>
                <version>${spark.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>com.datastax.spark</groupId>
                <artifactId>spark-cassandra-connector_2.11</artifactId>
                <version>2.0.0-RC1</version>
            </dependency>
            <dependency>
                <groupId>org.scala-lang</groupId>
                <artifactId>scala-library</artifactId>
                <version>2.8.0</version>
            </dependency>
    <dependency>
                <groupId>io.confluent</groupId>
                <artifactId>kafka-avro-serializer</artifactId>
                <version>${confluent.version}</version>
                <scope>${global.scope}</scope>
            </dependency>
            <dependency>
                <groupId>io.confluent</groupId>
                <artifactId>kafka-connect-avro-converter</artifactId>
                <version>${confluent.version}</version>
                <scope>${global.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.kafka</groupId>
                <artifactId>connect-api</artifactId>
                <version>${kafka.version}</version>
            </dependency>
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   himanshuIIITian    6 年前

    我们无法异步运行Spark Kafka流作业。但我们可以像卡夫卡消费者那样并行运行它们。为此,我们需要在中设置以下配置 SparkConf() :

    sparkConf.set("spark.streaming.concurrentJobs","4")
    

    默认情况下,其值为 "1" .但我们可以将其重写为更高的值。

    我希望这有帮助!