В настоящее время я работаю над конвейером потоков данных, который читает потоковые данные из Pub / Sub с помощью Apache Beam Java SDK 2.8.0.Конвейер - это просто шаблон PubsubToText.java от Google.
https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/PubsubToText.java
Хотя развертывание в облаке с DataflowRunner работает, как и ожидалось, оно не работает правильно с DirectRunner, а именно, когда я работаюв локальной среде, что усложняет разработку конвейеров.
Когда я устанавливаю частоту FixedWindows равной 30 с, например, Dataflow Runner в облаке генерирует файлы каждые 30 секунд, что ожидается.
Когда я устанавливаю ту же скорость для DirectRunner в локальной среде, он не будет генерировать файлы каждые 30 секунд.Вместо этого он генерирует файлы нестабильным образом.
Например, он генерирует первые данные через 4 минуты и создает 8 файлов, которые, как предполагается, были созданы, фактически генерируются сразу, а затем через 5 минут, затемчерез 3 минуты ... и т. д., что делает процесс локальной разработки чрезвычайно трудоемким и разочаровывающим.
Почему я наблюдаю это?
Переключение Java SDK с 8 на 11,Beam SDK от 2.8.0 до 2.9.0 или 2.10.0, среда от локального до экземпляра GCE, ни конвейерный вывод из GCS в локальный не помогли.
Вот все, что нужно для воспроизведения проблемы:
git clone https://github.com/GoogleCloudPlatform/DataflowTemplates
- удалите строку
<scope>test</scope>
для beam-runners-direct-java из pom.xml, чтобы она поддерживала DirectRunner во время выполнения. - Выполните компиляциюи запустить программу, как предложено для https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/PubsubToText.java, но изменив бегун на DirectRunner и добавив
--outputShardTemplate=W-P-SS-of-NN
, что является опущенным параметром и требуется при локальном запуске. - Удалить
--project
, --stagingLocation
и tempLocation
лодновременно, так как он не будет развернут в облаке. - Создание файлов занимает очень много времени, хотя я установил, например,
windowDuration=30s
Я подозревал этобыла проблема, связанная с Pub / Sub, но когда я запускаю tcpdump, он начинает подключаться к Pub / Sub и немедленно извлекает данные.Вероятно, это специфическая проблема DirectRunner.