導讀:前段時間公司業(yè)務需要,需要對現(xiàn)有用戶數(shù)據(jù)進行簡單的商業(yè)分析,因此找到了Apache Drill。本文將對Apache Drill進行簡單的說明,希望能夠幫助讀者理解并使用到實際項目中。
使用場景
Aache Drill 是一個用來分析大數(shù)據(jù)的工具,使用標準SQL查詢語句(即select語句)來完成數(shù)據(jù)查詢的JAVA框架,主要用于:
- 跨數(shù)據(jù)庫查詢:比如MySQL不同庫聯(lián)查
- 跨數(shù)據(jù)源查詢:比如mysql與oracle數(shù)據(jù)庫聯(lián)查、mysql與mongodb數(shù)據(jù)庫聯(lián)查,當然還支持更多的數(shù)據(jù)源。
如果你有以上的使用場景,那么它將會給你帶來強大的震撼。
介紹
Apache Drill 是一個分布式查詢引擎,實際上是GoolDremal的開源實現(xiàn)。
特點:
- 低延遲
- 支持SQL
- 學習成本低
- 支持jdbc
- 高性能
基于以上特點,我在使用過程中,發(fā)現(xiàn)非常簡單,很容易和現(xiàn)在的框架集成(springboot+mybatis),幾乎零成本,唯一的成本就是配置數(shù)據(jù)源,這塊成本也很小,因為Apache Drill提供了web ui操作。
基本用法
在這里我就不講具體安裝步驟了,我用Docker來代替。
- 通過apache/drill官方鏡像安裝并啟動
- 瀏覽器打開localhost:8047(web ui 默認端口,別忘記修改容器port)
- 配置數(shù)據(jù)源

web ui 首頁
- 點擊Storage,可以看到下圖

drill 自帶的web ui
- 通過create創(chuàng)建數(shù)據(jù)源

配置
配置代碼如下(這里是以mysql為例,mac系統(tǒng))
{
"type": "jdbc",
"driver": "com.mysql.cj.jdbc.Driver",
"url": "jdbc:mysql://docker.for.mac.host.internal:3306?serverTimezone=Asia/Shanghai",
"username": "root",
"password": "java",
"caseInsensitiveTableNames": false,
"enabled": true
}
- 測試

使用需要注意一點:
SQL查詢語句比我們直接使用mysql等數(shù)據(jù)庫SQL,多了一個命名空間,也就是我們在創(chuàng)建數(shù)據(jù)圓的時候的名字,下面SQL中的mysql。
SELECT * from mysql.gadmins.sys_admin_function
5. jdbc client
pom.xml 添加依賴
<dependency>
<groupId>org.apache.drill.exec</groupId>
<artifactId>drill-jdbc-all</artifactId>
<version>1.17.0</version>
</dependency>
java代碼
Class.forName("org.apache.drill.jdbc.Driver");
Connection connection =DriverManager.getConnection("jdbc:drill:zk=
node3.mynode.com:2181/drill/my_cluster_com-drillbits");
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("SELECT * from mysql.gadmins.`sys_admin_function`");
while(rs.next()){
System.out.println(rs.getString(1));
}
拓展使用
由于我主要用來做數(shù)據(jù)查詢,最關鍵的就是SQL語句了,那么有2個拓展場景
- 通過自建web 管理SQL語句,執(zhí)行測試、發(fā)布
- 通過結合DataQL引擎,可以讓SQL語句數(shù)據(jù)動起來,進一步對SQL查詢出來的數(shù)據(jù)進行轉化
總結
在調研的過程中,Apache Drill 給我的感覺就很來電,很有眼緣,當然也很符合我們的業(yè)務需要。在技術方案選型的過程中,是一個循序漸進的過程,未來還需要更多的調研,或許到一定階段,就需要其他框架來支撐業(yè)務,這也是程序員的最大樂趣之一。