Реализация обогащения с использованием Spark с MySQL - плохая идея? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать одну гигантскую схему, которая облегчает пользователям запрос данных, чтобы добиться этого, необходимо объединить потоковые события с User Metadata на USER_ID and ID. В инженерии данных эта операция называется «обогащение данных», верно? приведенные ниже таблицы являются примером.

# `Event` (Stream)

+---------+--------------+---------------------+
| UERR_ID |    EVENT     |      TIMESTAMP      |
+---------+--------------+---------------------+
|       1 | page_view    | 2020-04-10T12:00:11 |
|       2 | button_click | 2020-04-10T12:01:23 |
|       3 | page_view    | 2020-04-10T12:01:44 |
+---------+--------------+---------------------+


# `User Metadata` (Static)

+----+-------+--------+
| ID | NAME  | GENDER |
+----+-------+--------+
|  1 | Matt  | MALE   |
|  2 | John  | MALE   |
|  3 | Alice | FEMALE |
+----+-------+--------+



==> # Result

+---------+--------------+---------------------+-------+--------+
| UERR_ID |    EVENT     |      TIMESTAMP      | NAME  | GENDER |
+---------+--------------+---------------------+-------+--------+
|       1 | page_view    | 2020-04-10T12:00:11 | Matt  | MALE   |
|       2 | button_click | 2020-04-10T12:01:23 | John  | MALE   |
|       3 | page_view    | 2020-04-10T12:01:44 | Alice | FEMALE |
+---------+--------------+---------------------+-------+--------+

Я разрабатывал это с помощью Spark, а User Metadata хранится в MySQL, затем я понял, что это будет пустой тратой параллелизма Spark, если код искры включает объединение с MySQL таблицами, верно?

Узкое место будет происходить на MySQL, если траффи c будет увеличена, я думаю ..

Должен ли я хранить эти таблицы на key-value store и периодически обновлять его?

Можете ли вы дать мне некоторую идею для решения этой проблемы? Как вы обычно обрабатываете этот тип операций?

1 Ответ

0 голосов
/ 20 апреля 2020

Решение 1:

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

Решение 2:

Вы можете использовать соединитель MySql к Kafka, как показано ниже, https://debezium.io/documentation/reference/1.1/connectors/mysql.html Для каждой операции DML или изменения таблицы в вашей таблице метаданных пользователя будет соответствующее событие, запущенное для топа Кафки c (например, db_events). Вы можете параллельно запустить поток в задании потоковой передачи Spark, которое опрашивает db_events и обновляет значение ключа локального кэша. Это решение сделает ваше приложение практически в реальном времени. Я могу заметить, что необходимо будет запустить службу Kafka Connect с Mysql Connector (т.е. Debezium) в качестве плагина.

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