Apache spark Spark Streaming:如何向数据流添加更多分区?

Apache spark Spark Streaming:如何向数据流添加更多分区?,apache-spark,yarn,partitioning,spark-streaming,spark-dataframe,Apache Spark,Yarn,Partitioning,Spark Streaming,Spark Dataframe,我有一个spark流媒体应用程序,看起来像这样: val message = KafkaUtils.createStream(...).map(_._2) message.foreachRDD( rdd => { if (!rdd.isEmpty){ val kafkaDF = sqlContext.read.json(rdd) kafkaDF.foreachPartition( i =>{ createConnection()

我有一个spark流媒体应用程序,看起来像这样:

val message = KafkaUtils.createStream(...).map(_._2)

message.foreachRDD( rdd => {

  if (!rdd.isEmpty){
    val kafkaDF = sqlContext.read.json(rdd)

    kafkaDF.foreachPartition(
      i =>{
        createConnection()
        i.foreach(
          row =>{
            connection.sendToTable()
          }
        )
        closeConnection()
      }
    )
然后,我使用

spark-submit --master yarn-cluster --num-executors 3 --driver-memory 2g --executor-memory 2g --executor-cores 5....
当我尝试记录
kafkaDF.rdd.partitions.size
时,结果大部分是“1”或“5”。我很困惑,是否可以控制数据帧的分区数
KafkaUtils.createStream
似乎不接受与我想要的rdd分区数量相关的任何参数。我尝试了
kafkaDF.rdd.repartition(int)
,但它似乎也不起作用


如何在代码中实现更多的并行性?如果我的方法是错误的,那么实现它的正确方法是什么?

在Spark Streaming中,并行性可以在两个方面实现:(a)消费者/接收者(在您的案例中是Kafka消费者)和(b)处理(由Spark完成)

默认情况下,spark streaming将为每个使用者分配一个核心(也称为线程)。因此,如果您需要接收更多数据,则需要创建更多消费者。每个使用者将创建一个数据流。然后可以合并数据流以获得一个大的数据流

// A basic example with two threads for consumers
val messageStream1 = KafkaUtils.createStream(...) // say, reading topic A
val messageStream2 = KafkaUtils.createStream(...) // and this one reading topic B

val combineStream = messageStream1.union(messageStream2)
,可通过重新划分输入流来增加接收器/消费者的数量:

inputStream.repartition(<number of partitions>))
block interval=消费者在将其创建的数据推送到spark块(定义为配置
spark.streaming.blockInterval
)之前等待的时间

始终记住,Spark Streaming有两个不断发生的功能。一组读取当前微批次(使用者)的线程和一组处理前一个微批次(Spark)的线程


有关更多性能调整技巧,请参阅和。

我正在纱线簇上运行我的应用程序。我找不到spark.cores.max属性,但我正在使用spark submit命令设置--executor cores conf。那么,这是否意味着可用的核心总数是(num executors*executor cores)?另外,您能否提供一个示例或参考,用于创建更多消费者并对其进行联合?谢谢!我不是纱线配置方面的专家,因为我主要使用单机版<代码>spark.executor.cores应定义每个执行器的核心。那么
#Executors x spark.executor.cores=总内核数
您尝试过该解决方案吗?对你有用吗?我在Kafka主题中添加了更多的使用者和分区。现在性能更好了。如果您对提高绩效有其他建议,请告诉我
#Partitions =~  #Consumers x (batch duration / block interval)