Waterdrop
一个简单易用,高性能,能够应对海量数据的数据处理产品
- 为什么需要 Waterdrop(WD)
- WD 能做什么/应用场景
- WD 特性
- WD 工作流程
- WD 插件
- WD 配置
- WD 部署、运行
- WD 监控
- WD插件开发
主题
- WD 架构
- WD 相似产品比较
- WD 核心实现
- WD 插件体系
- WD 易用性
- WD 性能
- WD 核心工作
- WD 发展潜能
- 关注 InterestingLab
- 分布式数据处理入门易,精通难
- 太多Spark重复代码,重复逻辑可以抽象和简化
- 实现高效不出错的spark程序有难度
- 海量数据处理挑战多,经验少
- 开发、测试、上线周期长
为什么需要Waterdrop(WD)
通过我们的努力让Spark的使用更简单,更高效,并将业界和我们使用Spark的优质经验固化到Waterdrop这个产品中,明显减少学习成本,加快分布式数据处理能力在生产环境落地。
- 海量数据ETL
- 海量数据聚合
- 多源数据处理
Waterdrop 是什么
Waterdrop 应用场景
Waterdrop 是一个简单易用,高性能,能够应对海量数据的实时/离线数据处理产品,构建于Apache Spark之上。
- 简单易用,灵活配置,无需开发
- 支持实时流式处理和离线分批处理2种运行模式
- 高性能
- 海量数据处理能力
- 模块化和插件化,易于扩展
- 支持利用SQL做数据处理和聚合
- 支持spark 1.6 ~ spark 2.x
Waterdrop 特性
Waterdrop 工作流程
数据源输入
数据反序列化
数据处理
数据序列化
结果输出
Input Plugin
Serializer Plugin
Filter Plugin
Output Plugin
Serializer Plugin
Waterdrop 插件
Input Plugin:
Hdfs, Http, Kafka, Redis, Stdin, Tcp,
自行开发的Input plugin
Filter Plugin:
Aggregate, Clone, Date, Dict, Drop, Geoip, Grok, Kv, Prune, Range, Split, SQL, 自行开发的Filter plugin
Output Plugin:
Elasticsearch, File, HBase, Hdfs, Http, Kafka, Mongodb, MySQL, Stdout,
自行开发的Output plugin
Serializer Plugin:
Carbondata, Csv, Json, Gzip, ORC, Parquet, Protobuf, Raw,
自行开发的Serializer plugin
Waterdrop 配置
input {
kafka {
topics = "gpc.oi_gaoyingju.test1"
consumer.bootstrap.servers = "10.110.94.130:9092,10.110.94.131:9092,10.110.95.50:9092,10.110.95.68:9092,10.110.95.82:9092"
consumer.zookeeper.connect = "10.110.94.130:2181,10.110.94.131:2181,10.110.95.50:2181,10.110.95.68:2181,10.110.95.82:2181"
consumer.group.id = "scala_test_group1"
consumer.num.consumer.fetchers = "4"
consumer.auto.offset.reset = "largest"
}
}
filter {
split {
delimiter = " "
keys = ["a", "b", "c"]
source_field = "raw_message"
target_field = "msg"
}
}
sql {
query {
table_name = "mytable"
sql = "select * from mytable where a = \"value\""
}
}
output {
kafka {
topic = "gpc.oi_wangjie7.test1"
producer.bootstrap.servers = "10.110.94.130:9092,10.110.94.131:9092,10.110.95.50:9092,10.110.95.68:9092,10.110.95.82:9092"
producer.acks = "1"
producer.retries = "2"
producer.retry.backoff.ms = "100"
producer.batch.size = "46384"
producer.linger.ms = "6000"
producer.buffer.memory = "268435456" # 256 MB
producer.key.serializer = "org.apache.kafka.common.serialization.StringSerializer"
producer.value.serializer = "org.apache.kafka.common.serialization.StringSerializer"
producer.compression.type = "snappy"
producer.send.buffer.bytes = "131072"
producer.max.request.size = "1048576"
producer.max.in.flight.requests.per.connection = "2"
}
}
Waterdrop 部署、运行
## (1) Spark Submit
$SPARK_HOME/bin/spark-submit \
--master yarn-clienta \
--num-executors 30 \
--executor-cores 2 \
--executor-memory 2G \
--conf spark.app.name=Waterdrop \
--conf spark.ui.port=13000 \
--conf spark.streaming.blockInterval=1000ms \
--conf spark.streaming.kafka.maxRatePerPartition=30000 \
--conf spark.streaming.kafka.maxRetries=2 \
--conf spark.yarn.jar=hdfs://alluxio-cluster/sparkLib/spark-assembly-1.6.0-hadoop2.6.0.jar \
--conf spark.local.dir=/data/slot6/streamingetl/tmp \
--conf spark.driver.extraJavaOptions=-Dconfig.file=/data/slot6/waterdrop/application.conf \
--class org.interestinglab.waterdrop.WaterdropMain \
/data/slot6/waterdrop/WaterdropMain-assembly-0.1.0.jar
## (2) Spark Job Server with Rest API
Use Rest API to submit Waterdrop Application.
Waterdrop 监控
Waterdrop 架构
Waterdrop 相似产品比较
Waterdrop vs Spark :
基于Spark;灵活配置,开发少;更接近用户需求;
Waterdrop vs Flume/Logstash:
分布式集群;能够应对海量数据;支持SQL
Waterdrop 核心实现
(1) Dstream ---> foreachRDD ---> foreachPartition
Spark 实时流式计算
(2) Dstream ---> foreachRDD ---> toDataFrame ---> executeSQL
---> toRDD ---> foreachPartition
Waterdrop 核心实现
核心:
(1)数据流转:将input, filter, output, serializer plugin处理逻辑集成到Spark运行的各阶段中。
(2)Event:程序中用于存储数据的数据结构,实现了setField(), getField(), toJson(), toMap(), getSchema()等基础功能,支持多级嵌套Field。
(3)用 Spark SQL的 DataFrame, UDF 实现(1),用 Row 实现 (2)。
Waterdrop 核心实现
Waterdrop 核心实现
通过DataFrame/SQL做数据处理:
(1)转换:select substr(name, 0, 10), get_userid(url) from table1
(2)过滤:select * from table1 where http_status != 200
(3)聚合:select datatime, count(*) as req_count, sum(totalsize) / 60 as bandwidth from table1
(4)将Waterdrop的Filter插件,注册为Spark SQL的UDF(User Defined Function), UDAF(User Defined Aggregation Function),实现通过SQL完成各种Filter功能。
(5)Spark SQL提供了丰富的UDF。
Waterdrop 插件体系
(1)实现一个插件就是继承和实现特定的方法。
(2)利用Scala的Reflection机制实现根据插件类名加载插件。
(3)用abstract class定义BaseXXX能够更好的同时支持Java/Scala。
(4)用插件实现80%的常见数据处理逻辑。
(4)用户开发的插件与Waterdrop项目互相独立。
Waterdrop 易用性
举例:
(1) Kafka Input 允许记录每个Batch 的历史offset,便于对比和回退
(2) 支持Spark 1.6 ~ Spark 2.x
(3) 数据分散统计。场景:统计数据各个时间点的分散程度,对于分散的数据做特殊处理。
(4) ...
Waterdrop 可靠性
举例:
(1) 数据处理的at-most-once, at-least-once, exactly-once
(2) Gracefully Shutdown
(3) 应用存活检测,健康状况检测,自动拉起。
(4) ...
Waterdrop 性能
举例:
(1)充分利用Spark分布式计算的性能。
(2)经过优化的代码实现和固化的高性能调优经验。
(2)利用广播变量减少重复建立连接次数。
(4)...
Waterdrop 核心工作
第一期:
项目的开发、测试规范和流程
项目框架(Event, 数据流)的开发与测试
配置中支持复杂配置逻辑(如:if else 的逻辑,模版变量,预定义变量)
主要插件的开发与测试
部署、运行流程的包装
简洁易懂的中英文文档
第二期:
统计监控功能
Spark UI
Listener Plugin(实现常用的Spark Listener)
支持离线计算
第三期:
性能优化检查器
插件Repo的完整管理体系
支持机器学习算法
Waterdrop 发展潜能
(1)好产品吸引关注度和使用量
(2)Github开源让更多开发者加入
(3)运营和推广提高知名度
(4)深入Spark成为Committer
Questions & Answers
关注 Interesting Lab :
References
1. http://spark.apache.org/docs/latest/streaming-programming-guide.html
2. http://spark.apache.org/third-party-projects.html
3. https://github.com/spark-jobserver/spark-jobserver
4. http://arturmkrtchyan.com/apache-spark-hidden-rest-api
5. https://livy.incubator.apache.org/
Waterdrop
By Gary Gao
Waterdrop
- 8,988