Я создал тему в kafka под названием «test», в которой есть только один раздел, и он не реплицируется.
Я создал производителя Kafka, который пишет по теме «test» следующую строку: «ABCA "в цикле 100000 итераций.Существует 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 "в приведенном выше коде, таблица печатается быстро на окнах:
-------------------------------------------
Batch: 5
-------------------------------------------
+-----+
|value|
+-----+
| A|
| B|
| C|
| A|
| A|
| B|
| C|
| A|
+-----+
Однако, если я комментирую comment1 и comment2, мини-пакеты кажутся длительными в Windows.
Таким образом, я могу сделать вывод, что поток читает из Kafka в Windows, но группировка по занимает много времени.
Я оставил выполнение этой реализации на Windows больше времени, чем в Linux, вчера вечером в 20:46.Он имеет очень длинные мини-пакеты (потоковая передача в режиме реального времени создается с помощью мини-пакетов под капотом API структурированной потоковой передачи) в Windows.Так, например, как вы можете видеть на следующем рисунке, для выполнения двух пакетов требуется одна минута:
Как видно наНа следующем рисунке выполнение трех пакетов занимает три минуты:
Это быстрее в Linux.Так как я сначала попробовал это в Linux, я ожидал, что на Windows будет меньше времени, чтобы увидеть вывод консоли, затем, так как я ничего не вижу, я подумал, что это не работает.
Я должен рассчитывать мини-партии наLinux для сравнения поведения.