Hadoop 将键值数据库与Spark集成

Hadoop 将键值数据库与Spark集成,hadoop,apache-spark,rocksdb,Hadoop,Apache Spark,Rocksdb,我很难理解Spark如何与存储交互 我想制作一个Spark集群,从RocksDB数据库(或任何其他键值存储)获取数据。然而,目前,我所能做的最好的事情是将整个数据集从数据库中提取到每个集群节点的内存中(例如,提取到映射中),并从该对象构建RDD 我必须做什么才能只获取必要的数据(就像Spark对HDFS所做的那样)?我已经读过Hadoop输入格式和记录阅读器,但我还没有完全掌握应该实现什么 我知道这是一个宽泛的问题,但我真的很感激有人能帮我开始。提前感谢您。这里有一个可能的解决方案。我假设您有要

我很难理解Spark如何与存储交互

我想制作一个Spark集群,从RocksDB数据库(或任何其他键值存储)获取数据。然而,目前,我所能做的最好的事情是将整个数据集从数据库中提取到每个集群节点的内存中(例如,提取到映射中),并从该对象构建RDD

我必须做什么才能只获取必要的数据(就像Spark对HDFS所做的那样)?我已经读过Hadoop输入格式和记录阅读器,但我还没有完全掌握应该实现什么


我知道这是一个宽泛的问题,但我真的很感激有人能帮我开始。提前感谢您。

这里有一个可能的解决方案。我假设您有要访问的键值存储(在您的情况下是RocksDB)的客户端库。
KeyValuePair
表示一个bean类,表示键值存储中的一个键值对

课程

/*Lazy iterator to read from KeyValue store*/
class KeyValueIterator implements Iterator<KeyValuePair> {
    public KeyValueIterator() {
        //TODO initialize your custom reader using java client library
    }
    @Override
    public boolean hasNext() {
        //TODO
    }

    @Override
    public KeyValuePair next() {
        //TODO
    }
}
class KeyValueReader implements FlatMapFunction<KeyValuePair, KeyValuePair>() {
    @Override
    public Iterator<KeyValuePair> call(KeyValuePair keyValuePair) throws Exception {
        //ignore empty 'keyValuePair' object
        return new KeyValueIterator();
    }
}

这是否允许每个Spark节点只获取它要处理的数据?是的。我已经用一个注释编辑了答案(谢谢你提出这个疑问)。通过增加分区的数量,数据将分布在执行器之间。每个执行者只收到处理所需的数据。谢谢您的回答。虽然这不是我想要的答案,但我一定会尝试这个解决方案。
/*list with a dummy KeyValuePair instance*/
ArrayList<KeyValuePair> keyValuePairs = new ArrayList<>();
keyValuePairs.add(new KeyValuePair());
JavaRDD<KeyValuePair> keyValuePairRDD = javaSparkContext.parallelize(keyValuePairs);
/*Read one key-value pair at a time lazily*/    
keyValuePairRDD = keyValuePairRDD.flatMap(new KeyValueReader());
keyValuePairRDD.repartition(partitionCounts)
//OR
keyValuePairRDD.partitionBy(...)