为什么Spark Stream的微型批次在Windows上可以持续更长的时间?

时间:2018-12-04 17:39:47

标签: windows apache-spark apache-kafka centos7

我在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的支持下使用迷你批处理构建的)。因此,例如,如您在下图中所看到的,执行两批处理需要一分钟:

enter image description here

如下图所示,执行四批处理需要三分钟:

enter image description here

在Linux上速度更快。由于我首先是在Linux上尝试过的,所以我希望在Windows上看到控制台输出的时间更少,然后,因为我什么也没看到,所以我认为它不起作用。

我应该在Linux上对微型批处理进行计时,以便比较其行为。

0 个答案:

没有答案