主要內(nèi)容
·使用Drill來清洗、準備和匯總原始數(shù)據(jù)供后期分析使用。
·對日志文件、Parquet文件、JSON和其他復雜的數(shù)據(jù)文件進行查詢。
·使用標準SQL對Hadoop、關系型數(shù)據(jù)庫、MongoDB和Kafka進行查詢。
·通過各種編程語言訪問Drill。
·使用Drill分析各種結構復雜或存在二義性的數(shù)據(jù)。
·通過自定義函數(shù)擴展Drill的功能,完成復雜的分析任務。
·為網(wǎng)絡安全、圖片元數(shù)據(jù)或機器學習數(shù)據(jù)提供分析能力。
前言
人類具備了對海量數(shù)據(jù)進行分析處理的能力,這也許是21 世紀最重要的技術進步之一。但是直到現(xiàn)在,用于大數(shù)據(jù)集分析的工具還是過于復雜或者昂貴(也可能是既復雜又昂貴)。Apache Drill 具備改變這一現(xiàn)狀的潛力。
Apache Drill 為數(shù)據(jù)分析領域帶來了無限新的可能,它允許用戶使用一種標準的語言查詢各種不同的數(shù)據(jù)源。
讀者對象
我們把本書的目標讀者設定為三種類型:數(shù)據(jù)分析師或其他使用Drill 進行數(shù)據(jù)查詢的人、在生產(chǎn)環(huán)境中部署和維護Drill 的系統(tǒng)管理員,以及編寫代碼擴展Drill 功能的開發(fā)人員。
為何編寫本書
三年前,Charles 在San Jose 召開的Strata 會議上了解到了Drill,他覺得Drill 很可能為數(shù)據(jù)分析領域帶來一場革命。在與MapR 的首席科學家Ted Dunning 進行了幾次交流后,Charles 意識到Drill 在安全領域的數(shù)據(jù)分析上大有可為。不過在那時,很多Drill 的功能都還沒有文檔,有關Drill 開發(fā)的信息也非常零散或根本找不到。Charles 想要擴展Drill 的功能,但是不知道應該從何入手。如果Charles 現(xiàn)在想重新學習Drill,那本書就包含了他想了解的一切注1。
Paul 在幾家商業(yè)智能(BI)公司接觸過不少數(shù)據(jù)查詢工具和數(shù)據(jù)庫工具。當他看到Drill 時,覺得它集其他很多工具之大成,而且是開源和可擴展的。Paul 加入了Drill的團隊,并著手宣傳Drill 的功能。
本書向你展示了如何使用Drill 高效地分析數(shù)據(jù)。本書不能替代Drill 的文檔,它定位于學習Drill 的向?qū)。它是使用Drill 多年的經(jīng)驗積累,并且解釋了什么是Drill 以及它是如何解決用戶問題的。
這本書也是為打算擴展Drill 功能的人準備的。當你開始試用Drill,你就可能想要為它開發(fā)一些當前缺失的功能。當Charles 剛開始使用Drill 時,沒有足夠的文檔是一個很大的問題,本書的目標就是解決這個問題。第8~12 章以深入淺出的語言介紹了如何去擴展Drill 的功能。
本書組織結構
本書的讀者對象有三種,各自具備不同的知識背景。以下是每個章節(jié)內(nèi)容的設計思路:
?? 第1~3 章是對Drill 的基本介紹,并介紹如何把Drill 運行起來。
?? 第4~7 章是為數(shù)據(jù)分析師、數(shù)據(jù)科學家和其它使用Drill 進行數(shù)據(jù)查詢的人準備的。除了第7 章以外,其他幾個章節(jié)都需要讀者理解SQL。
?? 第8、10~12 章介紹了如何擴展Drill 的功能。這些章節(jié)需要讀者具備Java 開發(fā)的基本能力。
?? 第9 章介紹了在生產(chǎn)環(huán)境中安裝和配置Drill 的一些瑣碎的細節(jié)。如果你是一名系統(tǒng)管理員,這一章就是為你準備的。
?? 第13 章介紹了很多Drill 的應用案例。不管你是從事什么工作,閱讀這章的內(nèi)容都可以幫助你進一步領略Drill 的強大功能。
在線資源
本書中使用的所有代碼和數(shù)據(jù)都可以從本書的GitHub 倉庫(https://github.com/cgivre/drillbook)下載?梢栽贕itHub 的Issue 頁上報代碼中存在的問題。
Drill 本身也有很詳盡的在線文檔(https://drill.apache.org)可供參考。
本書內(nèi)容約定
在本書中,按以下約定進行排版:
斜體(italic)
表示新名詞、URL、電子郵件地址、文件名以及文件擴展名。
等寬字體(constant width)
用于程序代碼,以及在正文中引用變量、函數(shù)名稱、數(shù)據(jù)類型、環(huán)境變量、語句、關鍵字等代碼中的元素。
等寬粗體(constant width bold)
需要用戶輸入的命令或其他文本。
等寬斜體(constant width italic)
需要替換成用戶自定義的值或根據(jù)上下文決定的值。
使用示例代碼
本書輔助學習材料(代碼示例和練習等)可以從本書的GitHub 倉庫https://github.com/cgivre/drillbook 下載。
本書存在的目的就是幫助你完成工作?偟膩碚f,你可以在自己的程序或文檔中使用本書所提供的示例代碼。如果不是對這些代碼進行大規(guī)模的分發(fā),就不需要聯(lián)系我們獲取授權。比如,編寫一個程序,里面使用了本書中幾段示例代碼是不需要申請授權的。出售或分發(fā)包含O’Reilly 圖書完整示例代碼的CD-ROM 則需要申請授權。引用書中的部分內(nèi)容或示例代碼來回來問題不需要授權。在你的產(chǎn)品文檔中包含本書中大量的示例代碼則需要授權。
我們不強制要求署名,但如果你這么做,我們深表感激。署名一般包括書名、作者、出版社和國際標準書號(ISBN)。例如:“Learning Apache Drill by Charles Givreand Paul Rogers (O’Reilly). Copyright 2019 Charles Givre and Paul Rogers, 978-1-492-03279-3”。
如果你覺得你對示例代碼的使用行為超出了合理的方式或超出了上述的允許不獲取授權的場景,可以與我們?nèi)〉寐?lián)系:permissions@oreilly.com。
O’Reilly 在線學習平臺(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術和商業(yè)培訓、
知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網(wǎng)絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經(jīng)驗。O’Reilly 的在線學習平臺允許你按需訪問現(xiàn)場培訓課程、深入的學習路徑、交互式編程環(huán)境,以及O’Reilly 和200 多家其他出版商提供的大量文本和視頻資源。有關的更多信息,請訪問http://oreilly.com。
訪問http://oreilly.com/safari 了解更多信息。
聯(lián)系我們
任何有關本書的意見或疑問,請按照以下地址聯(lián)系出版社。
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)
奧萊利技術咨詢(北京)有限公司
我們?yōu)楸緯峁┝艘粋網(wǎng)頁,上面有勘誤表、示例和其他相關的信息,請訪問:http://bit.ly/learning-apache-drill。
有關本書的建議或者技術問題,請發(fā)郵件到bookquestions@oreilly.com。
有關其他圖書、講座、會議、新聞的信息,請訪問我們的網(wǎng)站:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
感謝Arina Ielchiieva、John Omernik、Aman Sinha 和 Parth Chandra 在百忙之中抽出時間幫助我們進行技術審閱。感謝Jeff Bleiel 和整個O’Reilly 編輯團隊與我們的緊密合作。最后還要感謝專注Drill 項目的貢獻者,沒有他們的幫助,就不會有本書的誕生。
來自Charles 的特別致謝
我想特別感謝我的妻子Alisheva 和孩子們:Mel、Dovie、Rozie 和Goldie,你們原諒我經(jīng)常缺席家庭活動并因為撰寫此書而工作到深夜,還支持我追求Drill 以及其他的極客愛好。沒有你們的支持,這本書就無法完成。
我還要感謝Drill 開發(fā)委員會中與我一起工作的所有成員,他們教會了我很多有關Java 開發(fā)、GitHub 和編寫生產(chǎn)級代碼的知識。感謝合著者Paul,他提出了無數(shù)寶貴的建議,還告訴了我很多Drill 內(nèi)部實現(xiàn)原理。
最后,感謝Ted Dunning 和Ellen Friedman 邀請我參與這個項目,感謝Drill 項目管理委員(PMC)會認可我對Drill 的貢獻,讓我成為Drill 的Committer 以及PMC的一員。
來自Paul 的特別致謝
我想特別感謝我的妻子Anne 和孩子們:Delaine、Forrest 和Pauline,因為我常常在晚上或周末消失,埋頭撰寫本書。
我還想感謝Drill 開發(fā)團隊在過去的兩年中對我的無私幫助,回答我在編寫本書過程中遇到的各種問題。這本書是他們把知識傳遞給其他人的一個途徑。感謝Drill 最初的開發(fā)者們,他們創(chuàng)造了這個出色的產(chǎn)品,也感謝后來一直參與改進Drill 的其他開發(fā)者。我非常榮幸可以成為Drill PMC 的一員,并與如此出色的團隊一起工作。感謝Charles 不斷推動這本書的創(chuàng)作進程直到完成,并在此過程中分享他從Drill 用戶的視角所觀察到的東西。
Charles Givre是Apache Drill的PMC成員,他是德意志銀行中央安全辦公室的首席數(shù)據(jù)科學家。他致力于培養(yǎng)數(shù)據(jù)科學家并教授數(shù)據(jù)分析技能,為此他還合伙創(chuàng)辦自己的培訓公司GTK Cyber。他在全球各種會議和高校教授上述主題的內(nèi)容。
Paul Rogers是Apache Drill的PMC成員,他專注于Drill的執(zhí)行引擎開發(fā),同時也是一位數(shù)據(jù)庫和BI方面的軟件架構師。他曾經(jīng)在Cloudera、MapR、Oracle、Actuate和Informix工作。
目錄
前言 1
第1 章 Apache Drill 入門 7
什么是Apache Drill 8
Drill 用途廣泛 8
Drill 非常易用 10
有關Drill 的性能 11
大數(shù)據(jù)簡史 11
大數(shù)據(jù)生態(tài)中的Drill 13
Drill 與類似工具的比較 13
第2 章 安裝與運行 15
準備系統(tǒng)環(huán)境 16
Windows 環(huán)境下的特殊配置 16
在Windows 上安裝Drill 18
在Windows 上啟動Drill 18
在macOS 或Linux 上安裝嵌入模式的Drill 19
在macOS 或Linux 上以嵌入模式運行Drill 20
在macOS 或 Linux 上安裝分布式模式的Drill 21
為Drill 準備集群環(huán)境 22
啟動分布式模式的Drill 23
連接集群 23
小結 24
第3 章 Apache Drill 概述 25
Apache Hadoop 生態(tài) 25
Drill 是一個低延遲的查詢引擎 26
使用HDFS 進行分布式數(shù)據(jù)處理 27
Drill 系統(tǒng)結構 27
Drill 操作概覽 28
Drill 是一個查詢引擎,不是數(shù)據(jù)庫 29
Drill 操作概述 30
Drill 組件 30
SQL 會話狀態(tài) 30
編譯查詢語句 31
查詢語句執(zhí)行 36
低延遲特性38
小結 41
第4 章 查詢包含分隔符的數(shù)據(jù) 42
通過Drill 查詢數(shù)據(jù)的幾種方式 42
其他操作接口 43
Drill SQL 查詢格式 44
選擇數(shù)據(jù)源44
定義工作區(qū)46
指定默認數(shù)據(jù)源 47
在查詢中訪問列 49
帶表頭并包含分隔符的數(shù)據(jù) 51
Table 函數(shù) 53
查詢目錄中的數(shù)據(jù) 53
理解Drill 的數(shù)據(jù)類型 55
使用字符串處理函數(shù)清洗和準備數(shù)據(jù) 57
復雜數(shù)據(jù)轉(zhuǎn)換函數(shù) 59
操作Drill 中的日期和時間 60
把字符串轉(zhuǎn)換為日期 61
對日期進行重新格式化 63
日期計算與操作 63
Drill 中的日期時間函數(shù) 64
創(chuàng)建視圖 65
使用Drill 進行數(shù)據(jù)分析 66
通過聚合函數(shù)對數(shù)據(jù)進行統(tǒng)計 68
查詢包含分隔符數(shù)據(jù)的常見問題 75
列名中的空格 75
列名中的非法字符 76
字段名中的保留字 76
小結 77
第5 章 分析復合與嵌套數(shù)據(jù) 78
數(shù)組與Map 78
Drill 中的數(shù)組 79
在Drill 中訪問Map(鍵– 值對) 81
查詢嵌套數(shù)據(jù) 83
使用Drill 分析日志文件 91
配置Drill 讀取httpd Web 服務器的日志 91
查詢Web 服務器日志 92
用Drill 對其他類型的日志進行分析 97
小結 100
第6 章 把Drill 連接到數(shù)據(jù)源 101
查詢多種數(shù)據(jù)源 102
配置新的存儲插件 102
用Drill 連接關系型數(shù)據(jù)庫 103
通過Drill 查詢Hadoop 數(shù)據(jù) 108
用Drill 連接并查詢HBase 108
用Drill 查詢Hive 數(shù)據(jù) 110
連接Kafka 查詢流數(shù)據(jù) 113
提高Kafka 查詢的性能 115
連接并查詢Kudu 115
用Drill 連接并查詢MongoDB 數(shù)據(jù) 116
把Drill 連接到云存儲 116
用Drill 從OpenTSDB 查詢時間序列數(shù)據(jù) 121
小結 122
第7 章 連接Drill 123
理解Drill 的接口 123
JDBC 與Drill 124
ODBC 與Drill 125
Drill 的REST 接口 127
使用Python 連接Drill 128
使用drillpy 對Drill 發(fā)起查詢 129
使用pydrill 連接Drill 130
其他通過Python 連接Drill 的方法 131
用R 語言連接Drill 133
使用sergeant 在R 中查詢Drill 133
通過Java 連接Drill 135
在PHP 中查詢Drill 136
使用連接器137
在PHP 中執(zhí)行Drill 查詢 137
在PHP 中操作Drill 138
使用Nodejs 查詢Drill 139
在BI 工具中使用Drill 作為數(shù)據(jù)源 139
使用Apache Zeppelin 和Drill 分析數(shù)據(jù) 139
使用Apache Superset 分析數(shù)據(jù) 145
小結 151
第8 章 用Drill 完成數(shù)據(jù)工程工作 152
讀時Schema 152
SQL 關系模型 153
數(shù)據(jù)生命周期:數(shù)據(jù)探索到生產(chǎn) 154
Schema 推導 155
數(shù)據(jù)源推導 155
存儲插件 156
存儲配置 156
工作區(qū) 157
查詢目錄 159
默認Schema 159
文件類型推導 160
格式插件與格式配置 160
格式推導 161
文件格式變種 162
Schema 推導概述163
分布式掃描 165
帶分隔符數(shù)據(jù)的Schema 推導 167
CSV 文件處理小結 173
JSON 文件的Schema 推導 175
二義性數(shù)值Schema 178
在文件間保證Schema 一致 184
JSON 對象 186
Drill 中的JSON 列表 189
JSON 小結 193
在Drill 中使用Parquet 文件格式 194
Parquet 中的Schema 進化 195
分區(qū)數(shù)據(jù)目錄 195
定義表工作區(qū) 198
處理生產(chǎn)環(huán)境中的查詢 199
捕捉Schema 映射視圖 199
在腳本中運行復雜查詢 200
小結 201
第9 章 在生產(chǎn)環(huán)境部署Drill 202
安裝Drill 202
前置需求 203
生產(chǎn)環(huán)境安裝 204
配置ZooKeeper 205
內(nèi)存配置 206
配置日志 208
測試安裝是否成功 209
分發(fā)Drill 可執(zhí)行文件和配置 210
啟動Drill 集群 211
配置存儲 212
使用Apache Hadoop HDFS 213
使用Amazon S3 214
準入控制 217
其他配置 219
用戶自定義函數(shù)與自定義插件 219
安全 220
日志級別 220
控制CPU 使用 222
監(jiān)控 223
監(jiān)控Drill 的進程 224
監(jiān)控JMX 指標 224
監(jiān)控查詢 225
其他部署選項 225
MapR 安裝程序 226
Drill-on-YRAN 226
Docker 226
小結 227
第10 章 搭建開發(fā)環(huán)境 228
安裝Maven 228
創(chuàng)建Drill 的編譯環(huán)境 229
設置Git 并獲取源代碼 229
從代碼編譯Drill 230
安裝IDE 231
小結 231
第11 章 編寫用戶自定義函數(shù) 232
用例:找出合法的信用卡號碼 232
Drill 中的用戶自定義函數(shù)是怎么工作的 234
Drill 的簡單UDF 結構 234
pomxml 文件 235
函數(shù)文件 236
簡單函數(shù)API 240
完整的代碼241
構建與安裝UDF 243
靜態(tài)安裝UDF 243
動態(tài)安裝UDF 243
復合函數(shù):返回Map 或數(shù)組的UDF 244
例子:解析User Agent 元數(shù)據(jù) 245
ComplexWriter 對象 246
編寫聚合UDF 248
聚合函數(shù)API 249
聚合UDF 示例:肯德爾秩相關系數(shù) 249
小結 252
第12 章 編寫格式插件 253
正則表達式格式插件 253
基于Easy 框架創(chuàng)建格式插件 255
創(chuàng)建Maven 的pomxml 文件 256
創(chuàng)建插件包258
Drill 模塊配置 258
格式插件配置 259
注意事項 259
創(chuàng)建正則表達式格式插件配置類 260
版權聲明頭與代碼格式 262
測試配置 262
解決配置問題 263
排查問題 264
創(chuàng)建格式插件類 264
創(chuàng)建測試文件 267
配置RAT 267
高效調(diào)試 267
創(chuàng)建單元測試 268
Drill 是如何找到插件的 270
記錄讀取器 270
測試讀取器的殼 273
日志 274
出錯處理 274
初始化 275
解析正則表達式 276
定義列名 276
投影 277
記錄列投影映射 278
空投影 278
全投影 279
部分投影 279
打開文件 281
記錄批 282
Drill 的列存結構 282
定義向量 283
讀取數(shù)據(jù) 284
把數(shù)據(jù)放入向量 285
釋放資源 286
測試讀取器 286
測試通配符場景 286
測試顯式投影 288
測試空投影288
擴展 288
其他細節(jié) 290
文件塊 290
默認格式配置 290
下一步 292
生產(chǎn)版本 292
給Drill 貢獻代碼:使用Pull Request 292
維護你的分支 293
創(chuàng)建插件項目 293
小結 294
第13 章 特殊用法 296
查找在特定區(qū)域拍攝的照片 296
分析Excel 文件 297
pomxml 文件 298
Excel 自定義記錄讀取器 299
使用Excel 格式插件 303
用Drill 分析網(wǎng)絡數(shù)據(jù)包(PCAP 文件) 304
查詢PCAP 數(shù)據(jù)文件的例子 304
使用Drill 分析Twitter 數(shù)據(jù) 308
在機器學習流程中使用Drill 309
通過Drill 進行預測 310
建立與序列化模型 310
編寫UDF 封裝類 311
通過UDF 進行預測 313
小結 313
附錄A Drill 函數(shù)列表 315
附錄B Drill 格式化字符串 331