支持多种数据源与输出
数据输入形式有两种:一种是批,一种是流(分别对应sparksql中的一次性读取,与structruedstreaming的流式处理)
批处理有:ElasticSearch File Hdfs Hive Hbase JDBC Kudu MongDB Mysql 等(Hbase为商业版,普通版需要实现可以使用Hive映射HBase表的方式)
流式处理有:FileStream HdfsStream KafakStream SocketStream RedisStream S3Stream等
支持多种数据输出
Clickhouse ES File Hbase(商业版支持) Hdfs Http(商业版支持) Jdbc Kafka Kudu MongoDB Mysql Opentsdb S3 StdOut
waterdrop配置文件分四部分:
spark { spark运行参数配置好了大部分时间不需要变更}
input {配置输入源}
filter {配置数据处理过程}
output {配置数据输出}
很可能只是数据同步,没有数据处理的话 filter也必须要有,可以保留为空 filter{ }
spark参数部分:
spark {
#批处理没有这个参数流式应用才有,单位为秒
spark.streaming.batchDuration = 5
#应用名称
spark.app.name = "Waterdrop"
#excetor的数量
spark.executor.instances = 2
#每个excuter的核数
spark.executor.cores = 1
#executer的内存
spark.executor.memory = "1g"
}
了解spark的话,spark运行参数在里面添加或更改,如果不了解spark的话,就采用上面的默认配置就好
Input部分
公共参数result_table_name=tableName 指输入后的数据源注册成表,表名叫tableName,fileter中可以根据这个表名做处理
input支持多个数据源,只展示几个常用的数据源
hdfs:
input{
hdfs{
#必须要有指定hdfs路径
path = "hdfs://hadoop01:8020/user/hive/warehouse/myhive.db/clickhousetest"
#指定读取的文件的格式 csv
、json
、parquet
、xml
、orc
和 text
.
format="text"
#执行读取数据后注册成表的表名
result_table_name = "test_source"
#如果format为xml必须有下面配置
optionss.rowTag=xxx
}
}
ES
input{
elasticsearch {
hosts = ["localhost:9200"]
#支持匹配模式 index* 所有以index开头的索引
index = "index"
result_table_name = "source_table"
#指定读取字段,不写就是全读其他es参数以es.开头进行设置
es.read.field.include = "id, name"
es.input.max.docs.per.partition = 10 #指定spark分区数量,不设置为shard数量
}
}
Mysql/JDBC
input{
mysql {
url = "jdbc:mysql://localhost:3306/database"
#读取的表,还可以用sql 如 table = "(select * from CDS where CD_ID>16) AS a"
table = "waterdrop"
user = "root"
password = "root"
result_table_name = "sourcetable"
#一下jdbc参数为saprk jdbc参数,开头要用jdbc.除非特殊要求,不然以下列可以用不设置
#jdbc.partitionColumn = "item_id"
#jdbc.numPartitions = "10"
# jdbc.lowerBound = 0
#jdbc.upperBound = 100
}
}
input{
jdbc{
#dirver名称,需要把dirver驱动包放到waterdrop安装目录的plugins目录下,如:cp xxx.jar plugins/myplugins/lib
driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://node03:3306/hive"
#读取的表,还可以用sql 如 table = "(select * from waterdrop where id>16) AS a"
table = "waterdrop"
user = "root"
password = "root"
result_table_name = "sourcetable"
#以下jdbc参数为saprk jdbc参数,开头要用jdbc.除非特殊要求,不然以下列可以用不设置
# jdbc.partitionColumn = "item_id"
# jdbc.numPartitions = "10"
# jdbc.lowerBound = 0
# jdbc.upperBound = 100
}
}
Kudu
input{
kudu{
#kudu mater地址
kudu_master="hadoop01:7051,hadoop02:7051,hadoop03:7051"
kudu_table="myKuduTable"
result_table_name="source_table"
}
}
Hive
需要提前做spark与hive的集成(百度)
input {
hive {
pre_sql = "select * from database.table"
result_table_name = "source_table"
}
}
KafkaStream(structuredstreaming)
input{
kafkaStream {
topics = "waterdrop"
consumer.bootstrap.servers = "hadoop:9092"
consumer.group.id = "group"
#kafka与structruedstreaming整合的参数通过consumer.xxxx添加,必须要有consumer.前缀
#consumer.failOnDataLoss = false
#如果kafka中message为json可以使用以下schemal
#schema = "{\"name\":\"string\",\"age\":\"integer\",\"addrs\":{\"country\":\"string\",\"city\":\"string\"}}
}
}
filter部分
filter部分不总结了,如果需要使用WaterDrop做ETL,参考官网吧,函数比较多,本质就是spark算子.
https://interestinglab.github.io/waterdrop-docs/#/zh-cn/v1/configuration/filter-plugin
output部分
hdfs
output{
hdfs {
#hdfs地址
path = "hdfs:///var/logs-${now}"
#格式化上方地址${now}
path_time_format = "yyyy.MM.dd"
/#输出格式csv、json、parquet、orc和text
format = "json"
#文件保存模式overwrite(覆盖),append(追加),ignore(存在则忽略)以及error(存在则报错)
save_mode = "error"
}
}
Jdbc/Mysql
output{
jdbc {
driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://hadoop01:3306/waterdrop"
table = "waterdrop"
user = "root"
password = "root"
#文件保存模式overwrite(覆盖),append(追加),ignore(存在则忽略)以及error(存在则报错)
save_mode=append
}
}
output{
mysql {
url = "jdbc:mysql://localhost:3306/info"
table = "access" user = "username"
password = "password"
#文件保存模式overwrite(覆盖),append(追加),ignore(存在则忽略)以及error(存在则报错)
save_mode = "append"
}
}
ES
output{
elasticsearch {
hosts = ["localhost:9200"]
index = "waterdrop-${now}"
index_type="log"
#上方now格式化
index_time_format = "yyyy.MM.dd"
#es参数通过es.配置
es.batch.size.entries = 100000
}
}
Kudu
output{
kudu{
kudu_master="hadoop01:7051,hadoop02:7051,hadoop03:7051"
kudu_table="my_kudu_table"
#写入kudu中采取的模式,支持 insert|update|upsert|insertIgnore,insert与insetIgnore区别在于后者主键重复不会报错,upsert与update就不用说了
mode="upsert" }
}
clickhouse
output{
clickhouse {
#注意如果没有配置clickhouse,将无法访问,需要在clickhouse-server 的config配置文件中配置<listen_host>::</listen_host>
host = "hadoop01:8123"
database = "waterdrop"
table = "mytable"
fields = ["id", "name"]
username = "root"
password = "root"
#批次大小
bulk_size = 20000
#ClickHouse 配置分布式表的时候,提供配置表隶属的集群名称
#cluster=
#异常码重试
retry_codes = [209, 210]
#重试次数
retry = 3
#其他clickhouse参数
# clikhouse.****=****
}
}