https://github.com/smartloli/apache-drill-cn
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类型
BIGINTBIGINT
BOOLEANBOOLEAN
VARCHARCHAR
DATEDATE
DECIMAL*DECIMAL
FLOATFLOAT
DOUBLEDOUBLE
INTEGERINT,TINYINT,SMALLINT
INTERVALN/A
TIMEN/A
N/ATIMESPAMP (unix的系统时间)
TIMESPAMPTIMESPAMP (JDBC时间格式:yyyy-mm-dd hh:mm:ss)
NoneSTRING
VARCHARVARCHAR
VARBINARYBINARY
另外,在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即可。