Java 在spark中查找数据的最佳选项

Java 在spark中查找数据的最佳选项,java,apache-spark,apache-spark-sql,spark-streaming,Java,Apache Spark,Apache Spark Sql,Spark Streaming,我有一个要求,我需要从卡夫卡主题中读取消息,在数据集上进行查找,然后根据查找数据的结果发送消息。下面举一个例子来说明这一点 Kafka topic接收一条xml消息,该消息具有一个字段messageID,其中包含值2345 我们进行查找并确认以前没有发送过具有此ID的邮件。如果返回false,我们将在上发送消息,然后将此messageID添加到查找数据中。 如果此messageID已经在查找数据中,我们不会发送它 目前,这是通过使用hbase表来保存查找数据来实现的。但是,我们每天可以收到数百万

我有一个要求,我需要从卡夫卡主题中读取消息,在数据集上进行查找,然后根据查找数据的结果发送消息。下面举一个例子来说明这一点

Kafka topic接收一条xml消息,该消息具有一个字段messageID,其中包含值2345

我们进行查找并确认以前没有发送过具有此ID的邮件。如果返回false,我们将在上发送消息,然后将此messageID添加到查找数据中。 如果此messageID已经在查找数据中,我们不会发送它

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

对于使用hbase查找数据(如将此数据存储在RDD的内存中),是否有其他更优化的解决方案?我尝试了这一点,但遇到了一些困难,因为spark上下文显然不可序列化,因此无法添加到现有的lookuo数据集

任何建议都将不胜感激

非常感谢


Dan

Spark适合处理用于分析目的的大量数据。创建RDD抽象是为了增强Map Reduce过程的性能限制。Spark不是像HBase那样的密钥/值存储的替代品

看看你们的问题,我觉得你们需要在HBase上加一个缓存层。这可以通过Redis或其他分布式缓存机制实现。
RDD cachined在这里帮不上忙,因为

  • 不能保证整个数据都在内存中
  • 成对rdd支持基于键值的查找,但它遵循map reduce模式查找键。RDD是一种抽象,它将有关数据位置的信息和沿袭DAG信息保存在其中。除非对数据执行某些操作,否则RDD不会具体化数据。现在,即使您将所有数据都保存在缓存中,RDD也需要搜索数据进行查找。它不像HBase,在HBase中,您有一个键的索引,并且可以在固定的时间内完成查找
    现在,您可能可以构建一些bloom过滤器,对数据进行索引,并使用Spark进行查找。但是,这可能会很困难。

    Spark有查找api(对于实时应用程序来说,最佳情况延迟仍然很长),但是在您的情况下-如果在存储(缓存)中找不到密钥,您是否希望将该密钥添加到缓存中?你知道RDD是不可变的,对吗?Spark没有针对这种情况的解决方案。这是不正确的,Spark有
    查找
    api,但出于不同的原因,它不适用于OP。如何查找rdd?请阅读重要的函数说明-是的,pairdrdd支持键值查找,但不能替代hbase键值存储。虽然我应该在回答中提到这一点,但Avishek建议将Redis与spark Redis结合使用可以大大减少延迟