Как awaitTermination () помогает для writeStream? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть задание Spark Structured Streaming, оно считывает смещения из темы Kafka и записывает ее в базу данных aerospike.В настоящее время я готовлю эту работу к производству и внедряю SparkListener.Просматривая документацию, я наткнулся на этот пример:

    StreamingQuery query = wordCounts.writeStream()
      .outputMode("complete")
      .format("console")
      .start();
query.awaitTermination();

После выполнения этого кода потоковые вычисления начнутся в фоновом режиме.Объект запроса является дескриптором этого активного потокового запроса, и мы решили дождаться завершения запроса с помощью awaitTermination (), чтобы предотвратить завершение процесса, пока запрос активен.

Iпонять, что он ожидает завершения запроса, прежде чем завершить процесс.Что это значит точно?Это помогает избежать потери данных, записанных запросом.

Чем полезно, когда запрос записывает миллионы записей каждый день?

Хотя мой код выглядит довольно просто:

dataset
        .writeStream()
        .option("startingOffsets", "earliest")
        .outputMode(OutputMode.Append())
        .format("console")
        .foreach(sink)
        .trigger(Trigger.ProcessingTime(triggerInterval))
        .option("checkpointLocation", checkpointLocation)
        .start();

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Здесь довольно много вопросов, но ответ только на один из приведенных ниже должен ответить на все.

Я понимаю, что он ожидает завершения запроса, прежде чем завершить процесс.Что именно это означает?

Потоковый запрос выполняется в отдельном потоке демона.В Java потоки демона используются для параллельной обработки до тех пор, пока не завершится основной поток приложения Spark ( dies ).Сразу после завершения последнего потока, не являющегося демоном, JVM завершает свою работу и завершает работу всего приложения Spark.

Именно поэтому вам нужно держать основной поток, не являющийся демоном, ожидающим другие потоки демона, чтобы они могли выполнять своиработа.

Читайте о потоках демона в Что такое поток демона в Java?

0 голосов
/ 28 ноября 2018

Я понимаю, что он ожидает завершения запроса, прежде чем завершить процесс.Что это значит точно

Не больше, не меньше.Поскольку запрос запускается в фоновом режиме, без явной инструкции по блокировке ваш код просто достигнет конца функции main и немедленно завершится.

Чем полезно, когда запрос записывает миллионы записей каждый день?

Это действительно не так.Вместо этого он гарантирует, что запрос выполняется вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...