在《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便可。
这篇博客就和你们分享到这里,若是你们在研究学习的过程中有什么问题,能够加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!