1.概述
在《Hadoop - 實時查詢Drill》一文當中,筆者給大家介紹如何去處理實時查詢這樣的業務場景,也是簡略的提了一下如何去實時查詢HDFS,然起相關細節並未說明。今天給大家細說一下相關細節,其中包含:HDFS,Hive以及HBase等內容。
2.資料來源和檔案格式
在使用Drill去做實時查詢,由於其只是一箇中介軟體,其適配的儲存介質是有限制的,目前官方支援以下儲存介質:
- FS
- HDFS
- HBase
- Hive
- RDBMS
- MongoDB
- MapR-DB
- S3
這裡筆者主要給大家介紹HDFS,Hive,HBase這三種介質。另外,Drill支援以下輸入格式的資料來源:
- Avro
- CSV
- TSV
- PSV
- Parquet
- MapR-DB*
- Hadoop Sequence Files
2.1 文字型別檔案(CSV,TSV,PSV)
下面筆者給大家介紹文字型別的相關細節,文字型別的使用,有其固定的使用方法,通用配置如下:
"formats": { "csv": { "type": "text", "extensions": [ "txt" ], "delimiter": "\t" }, "tsv": { "type": "text", "extensions": [ "tsv" ], "delimiter": "\t" }, "parquet": { "type": "parquet" } }
這裡以CSV為例子來說明:
- "csv":表示固定的文字格式
- "type":制定檔案的型別,這裡指定為文字型別
- "extensions":副檔名為csv
- "delimiter":文字內容,每行的分隔符為一個tab佔位符
上面的配置,這裡我們也可以進行擴充,比如我們的HDFS上的檔案格式如下圖所示:
我們要達到以下查詢結果,內容如下所示:
0: jdbc:drill:zk=local> SELECT * FROM hdfs.`/tmp/csv_with_header.csv2`; +------------------------+ | columns | +------------------------+ | ["hello","1","2","3"] | | ["hello","1","2","3"] | | ["hello","1","2","3"] | | ["hello","1","2","3"] | | ["hello","1","2","3"] | | ["hello","1","2","3"] | | ["hello","1","2","3"] | +------------------------+
那麼,我們可以對其做以下配置,內容如下所示:
"csv": { "type": "text", "extensions": [ "csv2" ], "skipFirstLine": true, "delimiter": "," },
這裡skipFirstLine這個屬性表示忽略一行結果。
另外,同樣用到上面的資料來源,我們要實現以下查詢結果,內容如下所示:
0: jdbc:drill:zk=local> SELECT * FROM hdfs.`/tmp/csv_with_header.csv2`; +-------+------+------+------+ | name | num1 | num2 | num3 | +-------+------+------+------+ | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | | hello | 1 | 2 | 3 | +-------+------+------+------+
這該如何去修改CSV的屬性,我們新增以下內容即可:
"csv": { "type": "text", "extensions": [ "csv2" ], "skipFirstLine": false, "extractHeader": true, "delimiter": "," },
從單詞的意義上可以很直接的讀懂屬性所要表達的意思,這裡就不多做贅述了。由於篇幅問題,這裡就不一一列舉了。
其他格式檔案與此類似,填寫指定檔案格式,檔案型別,副檔名,文字分隔符即可,其他擴充套件屬性可按需新增。
3.Plugins
3.1 HDFS
整合HDFS的Plugins,新增內容如下所示:
{ "type": "file", "enabled": true, "connection": "hdfs://hdfs.company.com:9000/", "workspaces": { "root": { "location": "/opt/drill", "writable": true, "defaultInputFormat": null } }, "formats": { "csv": { "type": "text", "extensions": [ "txt" ], "delimiter": "\t" }, "tsv": { "type": "text", "extensions": [ "tsv" ], "delimiter": "\t" }, "parquet": { "type": "parquet" } } }
PS:連線HDFS地址注意要正確。
3.2 Hive
整合Hive的Plugins,新增內容如下所示:
{ "type": "hive", "enabled": true, "configProps": { "hive.metastore.uris": "thrift://hdfs.company.com:9083", "fs.default.name": "hdfs://hdfs.company.com/", "hive.metastore.sasl.enabled": "false" } }
PS:這裡需要指定Hive的metastore的thrift地址,同時也需要指定hdfs的地址。另外,我們需要啟動metastore的thrift服務,命令如下所示:
hive --service metastore
這裡需要注意的是,Drill當前不支援寫操作到Hive表,在將Hive表結構中的資料型別做查詢對映時,支援以下型別:
支援的SQL型別 | Hive型別 |
BIGINT | BIGINT |
BOOLEAN | BOOLEAN |
VARCHAR | CHAR |
DATE | DATE |
DECIMAL* | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
INTEGER | INT,TINYINT,SMALLINT |
INTERVAL | N/A |
TIME | N/A |
N/A | TIMESPAMP (unix的系統時間) |
TIMESPAMP | TIMESPAMP (JDBC時間格式:yyyy-mm-dd hh:mm:ss) |
None | STRING |
VARCHAR | VARCHAR |
VARBINARY | BINARY |
另外,在Drill中,不支援以下Hive型別:
- LIST
- MAP
- STRUCT
- TIMESTAMP(Unix Epoch format)
- UNION
3.3 HBase
整合HBase的Plugins,新增內容如下所示:
{ "type": "hbase", "config": { "hbase.zookeeper.quorum": "hbase-zk01,hbase-zk02,hbase-zk03", "hbase.zookeeper.property.clientPort": "2181" }, "size.calculator.enabled": false, "enabled": true }
PS:在使用ZooKeeper叢集連線資訊時,需要注意的是,Drill在解析HBase的Plugins時,會解析其HBase叢集上的ZK叢集資訊,如:在HBase叢集中的ZK資訊配置使用的時域名,這裡在配置其HBase的Plugins的ZK連線資訊也需使用對應的域名,若是直接填寫IP,解析會失敗。保證解析的一致性。
4.總結
另外,在使用JDBC或ODBC去操作Drill的時候,連線資訊的使用是需要注意的,直接按照官方給出的連線方式硬套是有問題的,這裡我們修改以下連線資訊。連線分2種情況,一種指定其Drill的IP和PORT,第二種,使用ZK的連線方式,如jdbc:drill:zk=dn1,dn2,dn3:2181即可。
5.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!