我在kafka中创建了一个名为“ test”的主题,该主题只有一个分区,并且没有被复制。
我创建了一个Kafka生产者,它以100000次迭代的周期在主题“ test”上编写以下字符串:“ A B C A”。两次迭代之间有1000毫秒的睡眠时间(Thread.sleep)。关键是每个循环的迭代索引。
我已经在Centos 7和Windows上运行了以下代码。我通常使用maven程序集插件构建一个胖子罐,并通过spark-submit运行它。提交jar时,我总是必须指定软件包:--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0
public class StreamFromKafka {
public static void es() throws StreamingQueryException {
SparkSession session = SparkSession.builder().appName("streamFromKafka").master("local[*]").getOrCreate();
String columnName = "value";
Dataset<Row> df = session.readStream().format("kafka")
.option("group.id","test-consumer-group")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "test").load();
Dataset<Row> df1 = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)").select(columnName);
Dataset<String> words = df1.as(Encoders.STRING()).flatMap(line -> Arrays.asList(line.split(" ")).iterator(), Encoders.STRING());
//comment1 --> StreamingQuery query0 = words.writeStream().outputMode("update").format("console").start();
//comment2 --> query0.awaitTermination();
Dataset<Row> wordCount = words.groupBy("value").count();
StreamingQuery query = wordCount.writeStream().outputMode("update").format("console").start();
query.awaitTermination();
}
}
如果我在上面的代码中对“ comment1”和“ comment2”进行分解,则该表将在Windows上快速打印:
-------------------------------------------
Batch: 5
-------------------------------------------
+-----+
|value|
+-----+
| A|
| B|
| C|
| A|
| A|
| B|
| C|
| A|
+-----+
但是,如果我评论comment1和comment2,则迷你批处理在Windows上似乎很持久。
所以我可以得出结论,该流确实是在Windows上从Kafka读取的,但是分组需要花费很多时间。
昨天晚上20:46,我在Windows上比在Linux上运行该实现的时间更长。它在Windows上具有更长的迷你批处理(实时批处理是在结构化流API的支持下使用迷你批处理构建的)。因此,例如,如您在下图中所看到的,执行两批处理需要一分钟:
如下图所示,执行四批处理需要三分钟:
在Linux上速度更快。由于我首先是在Linux上尝试过的,所以我希望在Windows上看到控制台输出的时间更少,然后,因为我什么也没看到,所以我认为它不起作用。
我应该在Linux上对微型批处理进行计时,以便比较其行为。