我是想建立一个巨大的模式,让数据用户查询起来更方便,为了实现这个目标,流媒体事件必须与 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表的连接,这将是浪费Spark的并行性,对不对?
我想,如果流量增加的话,MySQL上会出现瓶颈。
我是否应该将这些表存储到 key-value store
并定期更新?
你能给我一些解决这个问题的思路吗?你们平时是如何处理这类操作的?
解决方案1 :
按照你的建议,你可以在你的本地保存一个key-value对的本地缓存副本,并定期更新缓存。
解决方案2:你可以使用MySql来实现。
你可以使用MySql to Kafka Connector,如下图。https:/debezium.iodocumentationreference1.1connectorsmysql.html。对于用户元数据表上的每一个DML或表的改变操作,都会有一个各自的事件被发射到一个Kafka主题(例如db_events)。你可以在你的Spark流式作业中并行运行一个线程,该线程会轮询db_events并更新你的本地缓存键值。这个解决方案将使你的应用成为真正意义上的近乎实时的应用.我可以看到的一个问题是,将需要运行一个带有Mysql Connector(即Debezium)的Kafka Connect服务作为插件。