SparkStreaming简单的实时流处理(WordCount)
将数据写入到Redis
object WordCount extends App {
Logger.getLogger("org").setLevel(Level.WARNING)
//实例化一个SparkCOnf
private val conf = new SparkConf()
.setAppName(this.getClass.getSimpleName) //设置App名称,通过反射获取当前的类名
.setMaster("local[*]") //设置在哪运行 如果在本地,最低两个核,如果不指定,会使用最大核数
//在实例化一个StreamingCountext()他有两个参数,1、配置 2设置多少秒处理一次数据
private val ssc = new StreamingContext(conf,Seconds(3)) //设置3秒处理一批数据,它是分批次处理
//监听centos机器的端口
private val data: ReceiverInputDStream[String] = ssc.socketTextStream("centos",端口号)
//什么是DStream:可以看作是RDDs,它代表一个连续数据流,它包含多个RDD
private val res: DStream[(String, Int)] = data.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
res.print()//打印
res.foreachRDD(r=>{ //为什么要循环RDD?? 1、DStream是里面包含很大RDD(他是一个RDDs)连续的数据流
r.foreachPartition(par=>{ //再对RDD的每一个分区进行操作
val jedis = JedisP.getResource() //让每一个分区拿一个连接
par.foreach(t=>{ //对分区内的数据进行遍历
jedis.hincrBy("wordCount",t._1,t._2) //如果有值,就增加值 没有就创建
})
jedis.close() //关闭jedis
})
})
ssc.start() //启动SparkStreaming
ssc.awaitTermination() //阻塞
}