Waterdrop 项目地址:https://interestinglab.github.io/waterdrop
Databricks 开源的 Apache Spark 对于分布式数据处理来说是一个伟大的进步。我们在使用 Spark 时发现了很多可圈可点之处,我们在此与大家分享一下我们在简化Spark使用和编程以及加快Spark在生产环境落地上做的一些努力。
一个Spark Streaming读取Kafka的案例
以一个线上案例为例,介绍如何使用Spark Streaming统计Nginx后端日志中每个域名下每个状态码每分钟出现的次数,并将结果数据输出到外部数据源Elasticsearch中。其中原始数据已经通过Rsyslog传输到了Kafka中。
数据读取
从Kafka中每隔一段时间读取数据,生成DStream
val directKafkaStream = KafkaUtils.createDirectStream[
[key class], [value class], [key decoder class], [value decoder class] ](
streamingContext, [map of Kafka parameters], [set of topics to consume])
具体方法参考Spark Streaming + Kafka Integration Guide
数据清洗
日志案例
192.168.0.1 interestinglab.github.io 127.0.0.1 0.001s [22/Feb/2018:22:12:15 +0800] "GET /waterdrop HTTP/1.1" 200 8938 "http://github.com/" - "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
通过Split
方法从非结构化的原始数据message
中获取域名以及状态码字段,并组成方便聚合的结构化数据格式Map(key -> value)
val splitList = message.split(" ")
val domain = splitList(1)
val httpCode = splitList(9)
val item = Map((domain, httpCode) -> 1L)
数据聚合
利用Sp