如何根据数据大小

时间:2018-06-01 18:09:47

标签: apache-spark hadoop apache-kafka spark-streaming rdd

我正在研究火花流项目,该项目从Kafka获取数据应用了一些规则并在Hive中保存数据。我的问题是数据的摄取率不固定。 60秒可能是100万条消息或者可能是1.我想在Dstream上添加重新分区。因为Dstream只有3个分区,无法在一分钟内处理数百万条记录。重新分配在少于20条记录时给出问题。它在Hive中创建多个小文件。

dataStream.map(_._2).repartition(20)

我的问题是我如何根据rdd尺寸进行重新分区。这样它就可以处理单个消息或100万条消息。

1 个答案:

答案 0 :(得分:3)

你不能以任何有用的方式做到这一点。即使您决定使用transform

 stream.transform { rdd => {
   val n = rdd.count
   rdd.repartition(getNumParttitions(n))
 }}

这超出了操作的整个目的,因为您必须在重新分区之前扫描所有数据,并且初始分发将仍然是瓶颈。

相反,我建议根据spark.streaming.kafka.maxRatePerPartition(旧API)或配置背压(spark.streaming.backpressure.enabledspark.streaming.backpressure.initialRate,更新的API)进行正确配置