在 spark 中查找数据的最佳选择
Posted
技术标签:
【中文标题】在 spark 中查找数据的最佳选择【英文标题】:Best option for lookup data in spark 【发布时间】:2018-10-19 18:54:31 【问题描述】:我有一个要求,我需要从 kafka 主题读取消息,对数据集进行查找,然后根据查找数据的结果发送消息。下面的示例可以使这一点更清楚。
Kafka 主题收到一条 xml 消息,其中 messageID 字段的值为 2345
我们进行查找并确认以前没有发送过具有此 ID 的消息。如果返回 false,我们发送消息,然后将此 messageID 添加到查找数据中。 如果这个 messageID 已经在查找数据中,我们不会继续发送它。
目前这是通过使用 hbase 表来保存查找数据来实现的。但是,我们每天可以收到数百万条消息,我担心组件的性能会随着时间的推移而下降。
是否有其他更优化的解决方案可以使用 hbase 来查找数据,例如将此数据存储在 RDD 中的内存中?我尝试了这个,但遇到了一些困难,因为 spark 上下文显然不可序列化,所以我无法添加到现有的 lookuo 数据集
非常感谢任何建议!
非常感谢
丹
【问题讨论】:
Spark 具有查找 api(对于实时应用来说,最佳情况下的延迟仍然很长),但在您的情况下 - 如果在存储(缓存)中 not 找到密钥,则您希望将此密钥添加到缓存中吗?您确实意识到 RDD 是不可变的,对吧?对于这种情况,Spark 没有解决方案。 【参考方案1】:Spark 非常适合处理大量数据以进行分析。创建 RDD 抽象是为了增加 Map-Reduce 过程的性能限制。 Spark 不是像 HBase
这样的键/值存储的替代品。
看着你的问题,在我看来,你需要在 HBase 之上有一个缓存层。这可以通过Redis
或其他分布式缓存机制来实现。
RDD 缓存在这里无济于事,因为
-
不能保证整个数据都在内存中
配对 rdd 支持基于键值的查找,但它遵循 map reduce 模式来查找键。 RDD 是一种抽象,其中保留了有关数据位置和沿袭 DAG 信息的信息。 RDD 不会具体化数据,除非对它进行一些操作。现在,即使您将所有数据都保存在缓存中,RDD 也需要搜索数据以进行查找。它不像 HBase,你有一个键的索引,并且可以在恒定时间内完成查找。
现在您可能可以构建一些布隆过滤器,为您的数据编制索引并使用 Spark 进行查找。但是,这可能很难。
【讨论】:
这是不正确的,Spark 确实有lookup
api,但由于不同的原因它不适用于OP。
如何在 rdd 上进行查找?
请阅读重要的功能说明 - github.com/apache/spark/blob/…
是的,pairdrdd 支持键值查找,但不能替代 hbase 键值存储。虽然我应该在回答中提到这一点
Avishek 建议将 Redis 与 spark-redis 一起使用可以减少很多延迟以上是关于在 spark 中查找数据的最佳选择的主要内容,如果未能解决你的问题,请参考以下文章
spark中将每个组作为新数据帧并在循环中传递另一个函数的最佳方法是啥?
pySpark 在 UDF 中使用 Spark SQL/DF 的最佳选择?