1 使用 flink 消费 kafka 的数据
1.1 初步接收数据
package test.flink.scala.scalaproject
import java.util.Properties
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.api.scala.createTypeInformation
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011
object LogAnalysis {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val topic = "tzbtest"
val prop = new Properties()
prop.setProperty("bootstrap.servers", "master:9092");
prop.setProperty("group.id","test-tzb-group")
// 接收 kafka 的数据
val consumer = new FlinkKafkaConsumer011[String](topic,new SimpleStringSchema(),prop)
// 接收 kafka 的数据
val data = env.addSource(consumer)
data.print().setParallelism(1)
env.execute("LogAnalysis")
}
}
1.2 初步统计
package test.flink.scala.scalaproject
import java.text.SimpleDateFormat
import java.util.Properties
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.api.scala.createTypeInformation
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011
import org.slf4j.LoggerFactory
object LogAnalysis {
// 生产上记录日志建议采用这种方法
val logger = LoggerFactory.getLogger("LogAnalysis")
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val topic = "tzbtest"
val prop = new Properties()
prop.setProperty("bootstrap.servers", "master:9092");
prop.setProperty("group.id","test-tzb-group")
// 接收 kafka 的数据
val consumer = new FlinkKafkaConsumer011[String](topic,new SimpleStringSchema(),prop)
// 接收 kafka 的数据
val data = env.addSource(consumer)
val logData = data.map( x=>{
val splits = x.split("\t")
val level = splits(2)
val timeStr = splits(3)
var time = 0l
try{
val sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
time = sourceFormat.parse(timeStr).getTime
}catch {
case e:Exception =>{
logger.error(s"time parse error: $timeStr",e.getMessage)
}
}
val domain = splits(5)
val traffic = splits(6)
// 返回 tuple
(level,time,domain,traffic)
})
logData.print().setParallelism(1)
env.execute("LogAnalysis")
}
}
1.3 数据清洗
/**
* 在生产上进行业务处理的时候,一定要考虑处理的健壮性以及你数据的准确性
* 脏数据或者是不符合业务规则的数据是需要全部过滤掉之后
* 再进行相应业务逻辑的处理
*
* 对于我们的业务来说,我们只需要统计level=E的即可
* 对于level非E的,不做为我们业务指标的统计范畴
*
* 数据清洗:就是按照我们的业务规则把原始输入的数据进行一定业务规则的处理
* 使得满足我们的业务需求为准
*/