在Spark中查找数据的最佳选择

时间:2018-10-19 18:54:31

标签: java apache-spark apache-spark-sql spark-streaming

我有一个要求,我需要从kafka主题中读取一条消息,对数据集进行查找,然后根据查找数据的结果发送该消息。下面的示例使这一点更加清楚。

Kafka主题接收xml消息,该消息具有一个字段messageID,其值保持为2345

我们进行查找并确认之前未发送过具有该ID的消息。如果返回错误,则继续发送消息,然后将此messageID添加到查找数据。 如果此messageID已存在于查找数据中,则我们不会继续发送它。

当前,这是通过使用hbase表保存查找数据来实现的。但是,我们每天可以收到数百万条消息,而且我担心该组件的性能会随着时间的推移而下降。

是否有另一种更优化的解决方案,而不是将hbase用于此查找数据,例如将数据存储在RDD中的内存中?我尝试了此操作,但是遇到了一些困难,因为Spark上下文显然无法序列化,因此我无法添加到现有的lookuo数据集中

任何建议都非常感谢!

非常感谢

1 个答案:

答案 0 :(得分:0)

Spark非常适合处理大量数据以进行分析。创建RDD抽象是为了增强Map-Reduce流程的性能限制。 Spark不能代替HBase这样的键/值存储。
在我看来,看看您的问题,您需要在HBase之上有一个缓存层。这可以通过Redis或其他分布式缓存机制来实现。
解决的RDD在这里无济于事,因为

  1. 不能保证整个数据都在内存中
  2. Paired rdd支持基于键值的查找,但是它遵循映射约简模式来查找键。 RDD是一种抽象,它将有关数据位置的信息和沿袭DAG信息保留在其中。除非对数据进行一些操作,否则RDD不会实现数据。现在,即使您将所有数据都保留在缓存中,RDD也需要搜索数据以进行查找。它与HBase不同,在HBase中,您具有键的索引并且可以在恒定时间内完成查找。

现在,您可能可以构建一些Bloom筛选器,对数据建立索引并使用Spark进行查找。但是,这可能很难。