Druid简单使用
一、Druid服务进程
Historical进程:Historical进程用于处理历史数据的存储和查询(历史数据包括所以已经被committed的流数据)。Historical进程从深度存储(Deep Storage)中下载Segment数据,同时支持对这些数据的查询操作。Historical进程不支持写入操作。
MiddleManager进程:MiddleManager负责将数据导入到集群中。他们负责从外部数据源中读取数据,也负责发布新的Segment。
Broker进程:Broker负责从外部客户端接收查询请求,并把这些请求拆分成子查询后转发给Historical和MiddleManager。当Broker接收到这些子查询的结果疑惑,会合并子查询结果并将结果返回给调用者。终端用户实际上都是和Broker做交互,而不会直接查询Historical和MiddleManager。
Coordinator进程:Coordinator进程负责协调Historical进程。他们负责把Segment分配给特定的Historical进程,以及确保这些Segment在Historical间是负载均衡的。
Overlard进程:Overlard进程负责协调MiddleManager进程,它也是数据导入的控制器,负责将数据导入任务分配给MiddleManager以及协调发布新的Segment数据。
Router进程:Router进程是为Broker,Overlard, Coordinator提供统一网关服务的可选进程。用户也可以不适用Router而将请求直接发送给Broker,Overlard,Coordinator。
二、Druid管理界面
Druid提供管理UI,访问地址http://{routerNodeIp}:8888/,在该管理服务中可以对Druid进行数据的批量摄入、实时数据配置、数据查询、数据摄入任务管理、datasource管理等操作
Coordinator控制界面: http://{Coordinator NodeIp}:8081/
三、Druid数据摄入
Druid的数据摄入可以使接入流式数据和静态数据两种。Druid的数据摄取方式也有两种,分别是Push(推送)和Pull(拉取)。例如:hdfs中的数据可以采用批量数据Push的方式,而kafka中的流式数据可以采用Pull
流式数据
1.通过实时节点以Pull方式摄取;
创建pull监控
curl -X POST -H 'Content-Type: application/json' -d @supervisor-spec.json http://OVERLORD_IP:PORT/druid/indexer/v1/supervisor
2.通过索引服务以Push方式摄取
创建push规则
curl -X POST -H ‘Content-Type:application/json’ -d @my-index-task.json http://OVERLORD_IP:PORT/druid/indexer/v1/task
数据push,例如:
curl -X POST -H 'Content-Type:application/json' -d '[{"timestamp":"2016-07-13","user":"张三","type":"浏览"}]' http://PEON_IP:PORT/druid/worker/v1/chat/tableName/push-events/
静态数据
1.以索引服务方式摄取
druid通过索引服务方式批量摄取数据,需要通过统治节点提交一个索引任务
curl -X POST -H ‘Content-Type:application/json’ -d @my-index-task.json http://OVERLORD_IP:PORT/druid/indexer/v1/task
2.以hadoop方式摄取
Druid Hadoop Index Job 支持从HDFS上读取数据,并摄入到Druid系统中,该方式需求POST请求统治节点启动一个Hadoop Index Job
curl -X POST -H ‘Content-Type:application/json’ -d @index-hadoop-task.json http://OVERLORD_IP:PORT/druid/indexer/v1/task
注:其中关于各数据格式定义json,可以参考Druid安装包中quickstart/tutorial目录,该目录下包括了各种方式的数据格式定义及样例数据
四、Druid数据查询
1.原生语言查询
接口类型:HTTP REST 、POST
查询地址: http://BROKER:8082/druid/v2/pretty
语句格式:
{
"queryType": "groupBy",
"dataSource": {...},
"columns": [],
"filter":{...},
"intervals": {...},
"aggregations"{...},
...
}
2.SQL查询
接口类型:HTTP REST 、POST
查询地址: http://BROKER:8082/druid/v2/sql
语句格式:
{
"query":"SELECT COUNT(*) AS TheCount FROM data_source"
}
注:1.2两种查询方式均可以使用管理界面测试 ,也可以直接使用postman工具,或者curl命令
3.JDBC
依赖驱动: Avatica JDBC driver
连接地址:
jdbc:avatica:remote:url=http://BROKER:8082/druid/v2/sql/avatica/
String url = "jdbc:avatica:remote:url=http://192.168.252.110:8082/druid/v2/sql/avatica/";
Properties connectionProperties = new Properties();
String query = "SELECT cityName as cityName,sum(\"count\") as s FROM \"wikiticker-2015-09-12-sampled\" GROUP BY cityName";
try (Connection connection = DriverManager.getConnection(url, connectionProperties)) {
try (
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery(query)
) {
System.out.println("cityName\t\t\tcount");
long s = 0;
while (resultSet.next()) {
String cityName = resultSet.getString(1);
long count = resultSet.getLong(2);
System.out.println(cityName+"\t\t\t"+count);
s++;
}
System.out.println("total:"+s);
}
} catch (SQLException e) {
e.printStackTrace();
}
注意:经个人多次测试,在sql语句上datasource即表名上需要带上双引号(2 SQL查询也需要),也没有找到原因,目前官方文档上也未明确强调说明