我有一个非常简单的Spark Streaming代码,可以从Kafka读取并输出到S3文件:
KafkaUtils.createDirectStream(jssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.Subscribe(topics, kafkaParams))
.map(...)
.filter(...)
.map(...)
.window(Durations.seconds(windowDuration), Durations.seconds(slideDuration))
.flatMap(...)
.map(x -> "") // so that it writes empty strings to mimimize disk writing
.dstream(...)
.saveAsTextFiles(...);
我在Amazon EMR上测试了这个,m3.xlarge
个实例,每个实例有4个vCPU和15GB内存,所有这些都配置了maximizeResourceAllocation
,因此他们将使用所有8个YARN核心。批处理间隔,窗口大小和幻灯片持续时间都设置为8秒。下表总结了每种配置的吞吐量:
------------------------------------------------------------------------------------------
| # slaves | # vpus | # YARN cores | # Kafka partitions | maxRatePerPartition | events/s |
------------------------------------------------------------------------------------------
| 2 | 8 | 16 | 64 | 790 | 50560 |
------------------------------------------------------------------------------------------
| 4 | 16 | 32 | 64 | 1570 | 100480 |
------------------------------------------------------------------------------------------
| 8 | 32 | 64 | 64 | 2850 | 182400 |
------------------------------------------------------------------------------------------
| 16 | 64 | 128 | 128 | 1680 | 215040 |
------------------------------------------------------------------------------------------
正如您所看到的,一切看起来都很好,最多可达8个节点。我为16节点配置将Kafka分区的数量更改为128,以便为每个执行程序分配1个Kafka接收器(重新创建了Kafka主题)。 16个节点的吞吐量仅略高于8个节点的吞吐量。我不知道什么是错的,因为代码不包含改组或重新分区。