Offset explorer что это

Обновлено: 07.07.2024

Три общие семантики в системах потоковой обработки:

Максимум однажды Каждая запись обрабатывается один раз или не обрабатывается совсем
Хотя бы один раз Это лучше, чем один раз, потому что это гарантирует, что никакие данные не будут потеряны. Но могут быть дубликаты
Да и только один раз Каждая запись будет обработана ровно один раз, данные не будут потеряны, и никакие данные не будут обрабатываться несколько раз.

  1. At most once: Each record will be either processed once or not processed at all.
  2. At least once: Each record will be processed one or more times. This is stronger than at-most once as it ensure that no data will be lost. But there may be duplicates.
  3. Exactly once: Each record will be processed exactly once - no data will be lost and no data will be processed multiple times. This is obviously the strongest guarantee of the three.

В первую очередь рекомендуется сохранять смещение в Zookeeper. Zookeeper более легкий, чем HBASE и т. Д., И он используется для HA (высокая доступность), а смещение более безопасно.

Стандартные двухэтапные операции для управления смещением:

  • Сохранить смещения
  • Получить компенсацию


Запустите продюсер Kafka и протестируйте тему: tp_kafka:

Запустите потребителя Kafka:

Создавайте данные в IDEA:


Количество Spark Streaming link статистика Kafka:


Воспроизвести 100 данных Kafka -> Spark Streaming принимает:


Но если Spark Streaming останавливается и перезапускается в это время:


Вы обнаружите, что отсчет начинается здесь снова, потому что значение auto.offset.reset установлено на наименьшее значение в коде. (До версии kafka-0.10.1.X)

Создайте папку / offset в HDFS:

Использовать контрольную точку:

Примечание. IDEA изменяет пользователя HDFS в параметрах виртуальной машины в настройках:


Установил, что предыдущие 100 штук были израсходованы. Это после остановки, производства 100 штук, а затем запуска:


Было обнаружено, что здесь было прочитано только 100 элементов между концом последнего раза и началом этого времени, вместо того, чтобы читать все предыдущие элементы, как самые маленькие.

Но у checkpiont есть проблема: если смещение управляется таким образом, пока бизнес-логика меняется, контрольная точка не действует. Потому что он вызывает getOrCreate ().

  1. Создать StreamingContext
  2. Получить данные от Kafka <== получить смещение
  3. Процесс согласно бизнес-логике
  4. Записать результат обработки во внешнее хранилище ==> сохранить смещение
  5. Запустите программу и дождитесь завершения потока
  • Сначала сохранение смещения, а затем сохранение данных может привести к потере данных.
  • Сохранение данных сначала, а затем сохранение смещения может вызвать повторное выполнение данных.


Решение 1: реализовать идемпотент

Характеристика идемпотентной операции в программировании состоит в том, что эффект от любого количества выполнений такой же, как от одного выполнения.

Решение 2: транзакция (транзакция)

1. Транзакция базы данных может включать в себя одну или несколько операций с базой данных, но эти операции составляют логическое целое.

2. Либо все эти операции с базой данных, составляющие логическое целое, выполняются успешно, либо все не выполняются.

3. Все операции, составляющие транзакцию, либо все влияют на базу данных, либо ни одну из них, то есть независимо от того, успешно ли выполнена транзакция, база данных всегда может поддерживать согласованное состояние.

4. Сказанное выше остается верным, даже если база данных выходит из строя и существуют параллельные транзакции.

Сохраните бизнес-логику и смещение в одной транзакции и выполните ее только один раз.

В отличие от баз данных вроде MySQL или MSSQL, у которых в комплекте поставки сразу есть клиентские приложения с графическим интерфейсом, ванильная Kafka не балует нас такими изысками и предлагает разве что консольные утилиты с довольно узким (на первый взгляд) функционалом.

Я опишу некоторые наиболее часто используемые, а в конце более детально разберем самое, на наш взгляд, близкое к идеальному.

Итак, из чего можно выбирать?

Kafka Tool


Часто это единственная альтернатива, с которой вынуждены работать люди, волей судьбы столкнувшиеся с кафкой. Но есть и другие средства.

Kafka Console Consumer

Это одна из утилит, входящая в комплект поставки кафки. И она позволяет читать данные из нее. Как и сама Kafka, это JVM приложение, которое для своей работы требует установленной Java. В принципе, это справедливо и для Kafka Tool, но в данном случае можно обойтись без Java — если запускать через docker:


По сути, нужно просто перед самой командой добавить docker run --rm -it taion809/kafka-cli:2.2.0, что на докерском значит «запусти вот такой образ, выведи, то, что он показывает, на мой экран и удали образ, когда он закончит работу». Можно пойти еще дальше и добавить алиас типа


Утилита кажется архаичной и ее консольность может отпугнуть неискушенных адептов графических интерфейсов, но, как и большинство консольных инструментов, при правильном использовании она дает более мощный результат. Как именно — рассмотрим на примере следующего инструмента, тоже консольного.

Kafkacat

Это уже весьма могучая штука, которая позволяет читать и писать из Кафки, а также получать список топиков. Она тоже консольная, но при этом поудобнее в использовании, чем стандартные утилиты вроде kafka-console-consumer (и ее тоже можно запустить из докера).


Файл можно будет использовать для анализа или чтобы воспроизвести какой-то сценарий. Безусловно, для решения этой задачи можно было бы и использовать родной консьюмер, но kafkacat позволяет выразить это короче.

Или вот пример посложнее (в смысле букв немного больше, но решение проще многих других альтернатив):


Из возможностей для улучшений можно отметить тот факт, что kafkacat поддерживает Avro из коробки, а вот protobuf — нет.

Kafka Connect + ELK

Kafka Connect — это решение для интеграции Kafka с другими системами. В двух словах, оно (или он?) позволяет экспортировать из и импортировать данные в Kafka без написания кода. Все, что нужно — это поднятый кластер Connect и конфиги наших хотелок в формате JSON. Слово «кластер» звучит дорого и сложно, но на самом деле это один или больше инстансов, которые можно поднять где угодно — мы, например, запускаем их там же, где и обычные сервисы — в Kubernetes.

Kafka Connect предоставляет REST API, c помощью которого можно управлять коннекторами, занимающимися перегонкой данных из и в Kafka. Коннекторы задаются конфигурациями, в случае Elasticsearch эта конфигурация может быть вот такой:


Выглядит всё крайне просто, но самое интересное, конечно же, в деталях. А деталей тут есть )

Большинство проблем связанно с данными. Обычно, как и в нашем случае, нужно работать с форматами данных, разработчики которого явно не думали, что когда-то эти данные будут попадать в Elasticsearch.

Для решения нюансов с данными есть трансформации. Это такие себе функции, которые можно применять к данным и мутировать их, подстраивая под требования получателя. При этом всегда есть возможность использовать любую Kafka клиент технологию для случаев, когда трансформации бессильны. Какие же сценарии мы решали с помощью трансформаций?

В нашем случае есть 4 трансформации. Вначале мы их перечисляем, а потом конфигурим. Трансформации применяются в порядке их перечисления, и это позволяет интересно их комбинировать.


Имена

Индексы

Elasticsearch работает с индексами, которые имеют свойство забиваться и нервировать девопсов. Нужна поддержка удобной для управления схемой индексирования. В нашем случае мы остановились на индексе на сервис / команду с ежедневной ротацией. Плюс решения — хранение данные из разных топиков в одном индексе с возможностью контролировать его возраст.


Тут, конечно, стоит отметить, что данная инициатива сейчас у нас на этапе внедрения, поэтому нельзя сказать,что все массово ищут все что нужно в Kibana, но мы к этому уверенно идем.

Вообще, Kafka Connect применимо не только для таких задач. Его можно вполне использовать в тех случаях, где нужна интеграция с другими системами, Реально, например, реализовать полнотекстовый поиск в вашем приложении с помощью двух коннекторов. Один будет читать из операционной базы обновления и писать их в Kafka. А второй — читать из Kafka и отсылать в Elasticsearch. Приложение делает поисковый запрос в Elasticsearch, получает id и по нему находит нужные данные в базе.

Заключение

Ну а наша публикация подходит к концу. Очень надеюсь, что вы узнали что-то новое для себя, а иначе — зачем это все? Если что-то не получилось раскрыть, или вы категорически не согласны с чем-то, или может есть более удобные способы решения подобных проблем — напишите про это в комментариях, обсудим )

Я пытаюсь адаптировать сайт для поддержки IE 7. У меня есть несколько элементов, которые, однако, смещены вправо на 69 пикселей. Я тестирую в IE9, чтобы отображать страницу так, как если бы это был IE7. Когда я включаю режим разработчика и проверяю элемент, я замечаю, что вокруг "поля" есть параметр "offset".

Я никогда не слышал об этом раньше, и Googling не очень помог мне - мне только удалось найти что-то о плавающем смещении, что было не то же самое, но я предполагаю, что он должен был устранить некоторые из проблем режим quirks? Как я могу устранить этот параметр offset?

Очевидно, что у меня установлена ​​специальная таблица стилей IE-7, и вы можете сами проверить эту проблему, перейдя в мою тестовую среду по этой ссылке:

Нашел решение - это было довольно просто. Просто нужно было явно объявить позицию подобным образом (хотя она была унаследована от родительского элемента во всех других браузерах, IE добавил маржу и назвал ее "смещением", что было отменено, сделав это):

ОТВЕТЫ

Ответ 1

Смещение - это расстояние, на которое элемент был перемещен из исходного местоположения. Это видно, когда вы позиционируете элемент как относительный, так и абсолютный с значениями left , top , bottom и/или right . В качестве примера возьмем следующий код:

Если мы проверим этот элемент в Internet Explorer 10, мы увидим смещение, которое вы упомянули. Значения em были преобразованы в пиксели, но эффект все еще виден. Обратите внимание, что мы видим что-то подобное в Chrome Developer Tools (также в Opera), но вместо этого оно помечено как "позиция":

enter image description here
enter image description here

Как ни странно, Firefox даже не может сообщать о смещении/позиции по их иллюстрации:

enter image description here

В конце концов, это проблема простой семантики. Будем ли мы называть это "смещением" или "позицией", это все равно одно и то же; это расстояние от исходного местоположения на экране.

Надеюсь, что это поможет.

Ответ 2

Это кажется странным, но вы можете попробовать установить vertical-align: top в CSS для ввода. Это исправляет его в IE8, по крайней мере.

Ответ 3

У меня была аналогичная проблема, моя ширина заголовка заголовка не отображалась корректно (появлялась в ширине сокращений), после некоторой отладки я понял, что добавил rem Poly-fill, которая создавала проблему для меня. Я тоже использовал meta(http-equiv="x-ua-compatible" content="IE=Edge,chrome=1") .

После удаления файла rem-polyfil JS он начал работать правильно для меня.

Ответ 4

Вы можете попробовать: position: -ms-device-fixed; этот трюк помогает мне.

— Я духов вызывать могу из бездны!
— И я могу, и всякий это может. Вопрос лишь, явятся ль они на зов.

Как-то так сложилось, что у нас не так много UI для Apache Kafka. А если хочется именно desktop, то Offset Explorer и упомянутый Conduktor. Первый имеет морально устаревший интерфейс 2000х, а второй не оправдано дорогой, т. к. не использую весь его богатый функционал. Вооружившись Qt и librdkafka, набросал conduktor на минималках.

Используй layout Люк


Сложный выпадающий элемент, имеющий множество состояний. Как съесть слона? По кусочкам маленького размера. Лайауты умеют отслеживать изменение видимости компонентов, и высчитывать размеры на основе implicit size объекта. Более мелки компоненты строятся следующим образом


Сворачивающая левая панель построена на манипуляции с размерами

И для сравнения как сделано в Qt Quick Controls

Twist таблицы и списка


Твист заключается в переключении между двумя режимами отображения

Достигается это наложением таблицы со списком, с последующей синхронизации полосы прокрутки. Делается через StackLayout,фиксации высоты делегата и двух ScrollBar

Делегат для таблицы выглядит следующим образом

Нехитрая схема, которая позволяет настраивать вид каждой колонки. Если не боитесь дополнительных зависимостей, то можете взять DelegateChooser и DelegateChoice.

Ещё раз о таблицах


Изменение количества колонок в таблице и их размер, это привычный функционал и что-то само собой разумеется. Что может пойти не так? TableView позволяет задавать функцию columnWidthProvider , которая позволяет устанавливать ширину столбца. Начиная с Qt 5.13 если вернуть 0, колонка будет скрыта.

Что бы применить изменения, дергаем forceLayout , как это сделано в документации

В моём случае это выглядит так

Осталось за малым, вывести заголовок таблицы и сделать изменение размера столбца. Естественно нашелся компонент под это дело, а именно HorizontalHeaderView

Да, это работает. Беремся за splitter и двигаем влево, вправо. Какие тут подводные камни? Понимающие люди обратили внимание на reuseItems: false . HorizontalHeaderView это view, а в view используется пул элементов(reusing items), что бы сэкономить на создание и удалении. Документация не рекомендует иметь делегаты с состоянием.

На что влияет reuseItems: true в данном примере. Представьте, вы взялись за splitter и растягиваете колонку, которая имеет ширину 300. В какой-то момент view решает пере использовать элемент, возвращает в пул, достаёт от туда, и вставляет в другое место и инициализирует шириной 40. Получаем не очень понятное поведение. В моём случае такое поведение проявляется при вставке/удалении строк таблицы.

Про окна

Заключение

Получился прототип, который можно развивать до полноценного MVP. Из ближайших планов настроить какой-нибудь CI для сборок под Windows и Mac OS X. Весь код доступен на Git Hub.

Читайте также: