如何将JavaPairDStream写入Redis?

如何将JavaPairDStream写入Redis?,java,apache-spark,redis,spark-streaming,Java,Apache Spark,Redis,Spark Streaming,我正在使用spark 1.5.0和java 7 输入来自kafka,以不同的json对象的形式,带有类型字段。例如: {'type': 'alpha', ...} {'type': 'beta', ...} ... 我正在根据每个事件类型的计数对应的输入数据创建一个JavaPairDStream 我想将这些数据存储到redis。如何进行此操作?使用foreachRDD和forEach函数实现此操作,如下所示: wordCounts.foreachRDD( new Function<

我正在使用spark 1.5.0和java 7

输入来自kafka,以不同的json对象的形式,带有
类型
字段。例如:

{'type': 'alpha', ...}
{'type': 'beta', ...}
...
我正在根据每个事件类型的计数对应的输入数据创建一个
JavaPairDStream


我想将这些数据存储到redis。如何进行此操作?

使用
foreachRDD
forEach
函数实现此操作,如下所示:

wordCounts.foreachRDD(
    new Function<JavaPairRDD<String, Integer>, Void>() {
        public Void call(JavaPairRDD<String, Integer> rdd) {
            rdd.foreach(
                new VoidFunction<Tuple2<String,Integer>>() {
                    public void call(Tuple2<String,Integer> wordCount) {
                        System.out.println(wordCount._1() + ":" + wordCount._2());
                        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
                        Jedis jedis = pool.getResource();
                        jedis.select(0);
                        jedis.set(wordCount._1(), wordCount._2().toString());
                    }
                }
            );
            return null;
        }
    }
);
wordCounts.foreachRDD(
新函数(){
公共无效调用(javapairdd-rdd){
弗雷奇(
新函数(){
公共作废调用(Tuple2字数){
System.out.println(wordCount._1()+“:“+wordCount._2());
JedisPool pool=new JedisPool(new JedisPool config(),“localhost”);
绝地武士=pool.getResource();
绝地武士。选择(0);
jedis.set(wordCount._1(),wordCount._2().toString());
}
}
);
返回null;
}
}
);

为每个RDD创建一个新的连接池是非常低效的。我建议为每个分区创建一个连接:

wordCount.mapPartitions(p->{
 Jedis jd = new Jedis(getJedisConfig());
 while (p->hasNext()) {
   Tuple2<String,Integer> data = p.next();
   String word = data._1();
   Integer cnt = data._2();
   jd.set(word,count); // or any other format of save to Redis
 }
}
)
wordCount.mapPartitions(p->{
绝地jd=新绝地(getJedisConfig());
而(p->hasNext()){
Tuple2 data=p.next();
字符串字=数据。_1();
整数cnt=数据。_2();
jd.set(word,count);//或保存到Redis的任何其他格式
}
}
)

我希望以前有人会向您指出这一点,但我认为排序集比简单键(您使用的是
SET
)更有益于您的案例。