在《Hadoop - 實時查詢Drill》一文當中,筆者給你們介紹如何去處理實時查詢這樣的業務場景,也是簡略的提了一下如何去實時查詢HDFS,然起相關細節並未說明。今天給你們細說一下相關細節,其中包含:HDFS,Hive以及HBase等內容。html
在使用Drill去作實時查詢,因爲其只是一箇中間件,其適配的存儲介質是有限制的,目前官方支持如下存儲介質:oop
這裏筆者主要給你們介紹HDFS,Hive,HBase這三種介質。另外,Drill支持如下輸入格式的數據源:post
下面筆者給你們介紹文本類型的相關細節,文本類型的使用,有其固定的使用方法,通用配置以下:學習
"formats": { "csv": { "type": "text", "extensions": [ "txt" ], "delimiter": "\t" }, "tsv": { "type": "text", "extensions": [ "tsv" ], "delimiter": "\t" }, "parquet": { "type": "parquet" } }
這裏以CSV爲例子來講明:spa
上面的配置,這裏咱們也能夠進行拓展,好比咱們的HDFS上的文件格式以下圖所示:unix
咱們要達到如下查詢結果,內容以下所示:code
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"] | +------------------------+
那麼,咱們能夠對其作如下配置,內容以下所示:orm
"csv": { "type": "text", "extensions": [ "csv2" ], "skipFirstLine": true, "delimiter": "," },
這裏skipFirstLine這個屬性表示忽略一行結果。htm
另外,一樣用到上面的數據源,咱們要實現如下查詢結果,內容以下所示:中間件
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": "," },
從單詞的意義上能夠很直接的讀懂屬性所要表達的意思,這裏就很少作贅述了。因爲篇幅問題,這裏就不一一列舉了。
其餘格式文件與此相似,填寫指定文件格式,文件類型,擴展名,文本分隔符便可,其餘擴展屬性可按需添加。
集成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地址注意要正確。
集成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類型:
集成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,解析會失敗。保證解析的一致性。
另外,在使用JDBC或ODBC去操做Drill的時候,鏈接信息的使用是須要注意的,直接按照官方給出的鏈接方式硬套是有問題的,這裏咱們修改如下鏈接信息。鏈接分2種狀況,一種指定其Drill的IP和PORT,第二種,使用ZK的鏈接方式,如jdbc:drill:zk=dn1,dn2,dn3:2181便可。
這篇博客就和你們分享到這裏,若是你們在研究學習的過程中有什麼問題,能夠加羣進行討論或發送郵件給我,我會盡我所能爲您解答,與君共勉!