做一个实时系统,用到了kafka,redis,sparkStream,很经典的一个架构。
kafka的生产者就不写了,这边只涉及sparksteam写消费者代码,存到redis。
KafkaToRedis kafkaToRedis=new KafkaToRedis();
SparkConf conf = new SparkConf().setAppName("kafka_to_redis");
JavaStreamingContext jssc = new JavaStreamingContext(conf,Durations.seconds(10));
Map<String, String> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers","wxincentos1:9092,wxincentos3:9092");
kafkaParams.put("metadata.broker.list", "wxincentos1:9092,wxincentos3:9092");
kafkaParams.put("group.id", "1");Set<String> topics = new HashSet<String>();
topics.add("test3");
JavaPairInputDStream<String,String> lines = KafkaUtils.createDirectStream(
jssc,
String.class, // key类型
String.class, // value类型
StringDecoder.class, // 解码器
StringDecoder.class,
kafkaParams,
topics);
到此就看后面的需求了,网上太多的wordcount的列子,看的都快吐了,想找个能把数据内容取出来的都那么困难,大多还是停留在rdd上,没办法只好自己想办法,看了好多列子,发现其实就是个rdd转其他类型的问题,就好办多了。
把rdd collect一下就能得到一个数组,操作也简单,说干就干。
JavaDStream<String> valueDStream = lines.map(new Function<Tuple2<String, String>, String>() {
public String call(Tuple2<String, String> v1) throws Exception {
return v1._2();
}
});List a=rdd.collect();
for(int i = 0; i<a.size();i++){a.get(i);
}
数据就轻轻松松地取出来啦
写redis的话就是实例化个redis客户端,操作操作即可。就不赘述啦,后面讲讲redis集群怎么用的。