接上篇flume+springboot+kafka集成,本篇将sparkStream也集成进来了,sparkStream作为kafka的消费者,接受kafka的数据,并实现日志错误、警告数据的实时计算
(1)环境还是前文中的环境,这里新添加的只有一个sparkStream程序(本文上传的所有代码都是可以跑通)
package com.saprk
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.SparkConf
import org.apache.spark.streaming.kafka010.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
object kafkademo {
def main(args: Array[String]): Unit = {
//1 创建spark配置对象
val conf=new SparkConf()
//设置配置属性
conf.setMaster("local[2]")
conf.setAppName("test sparkstreaming-kafka consumer")
//2 通过配置文件创建Stream的上下文对象, 设置Streaming读取每3秒钟流式数据
val ctx=new StreamingContext(conf,Seconds(10))
ctx.checkpoint("/data_in")
//3 设置kafka读取主题名
val topics=Array("testtopics")
//4 消费者配置
val kafkaParam = Map(
"bootstrap.servers" -> "master:9092",//用于初始化链接到集群的地址
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
//用于标识这个消费者属于哪个消费团体
"group.id" -> "g1",
//如果没有初始化偏移量或者当前的偏移量不存在任何服务器上,可以使用这个配置属性
//可以使用这个配置,latest自动重置偏移量为最新的偏移量
"auto.offset.reset" -> "latest",
//如果是true,则这个消费者的偏移量会在后台自动提交
"enable.auto.commit" -> (false: java.lang.Boolean)
);
//5 通过 sparkstreaming-kafka的工具类,创建DStream
//创建DStream,返回接收到的输入数据
var stream=KafkaUtils.createDirectStream[String,String](ctx, PreferConsistent,Subscribe[String,String](topics,kafkaParam))
val data=stream.filter(line=>line.value().length>0)
val words = stream.map(_.value().split(" "))
// 实现累加
val updateFunc =(curVal:Seq[Int],preVal:Option[Int])=>{
//进行数据统计当前值加上之前的值
var total = curVal.sum
//最初的值应该是0
var previous = preVal.getOrElse(0)
//Some 代表最终的返回值
Some(total+previous)
}
val d_stream = stream.map(qline⇒qline.value().split(" ")(1))
val result = d_stream.map(word=>(word,1)).updateStateByKey(updateFunc).print()
val wordCounts = d_stream.map(x =>(x,1)).reduceByKey(_+_)
wordCounts.print()
var rdd=data.map(line=>(line.key(),line.value().split(" ")(1)))
rdd.print()
//rdd.saveAsTextFiles("/msparkout")
// 启动流式读取对象
ctx.start()
//等待客户端信息发送
ctx.awaitTermination()
//停止流式对象上下文
ctx.stop()
}
}
(2)上传到服务器上,服务器上现在运行着WebServer flume kafka,只需运行spark程序即可
bin/spark-submit --class com.saprk.kafkademo /opt/software/sparkcount.jar
(3)运行成功
里面有个warn,搜了搜,很多说是bug的,忽略就行,所以这里我就忽略了整个程序就完成了,下面你可以将实时计算的数据传到mysql等数据库中,利用他