https://github.com/smartloli/apache-drill-cn
1.概述
在《Hadoop - 實時查詢Drill》一文當(dāng)中盯桦,筆者給大家介紹如何去處理實時查詢這樣的業(yè)務(wù)場景夸政,也是簡略的提了一下如何去實時查詢HDFS缎玫,然起相關(guān)細節(jié)并未說明入客。今天給大家細說一下相關(guān)細節(jié)拇泛,其中包含:HDFS兴使,Hive以及HBase等內(nèi)容。
2.數(shù)據(jù)源和文件格式
在使用Drill去做實時查詢,由于其只是一個中間件霎冯,其適配的存儲介質(zhì)是有限制的铃拇,目前官方支持以下存儲介質(zhì):
FS
HDFS
HBase
Hive
RDBMS
MongoDB
MapR-DB
S3
這里筆者主要給大家介紹HDFS,Hive沈撞,HBase這三種介質(zhì)慷荔。另外,Drill支持以下輸入格式的數(shù)據(jù)源:
Avro
CSV
TSV
PSV
Parquet
MapR-DB*
Hadoop Sequence Files
2.1 文本類型文件(CSV缠俺,TSV显晶,PSV)
下面筆者給大家介紹文本類型的相關(guān)細節(jié),文本類型的使用晋修,有其固定的使用方法吧碾,通用配置如下:
"formats": {
? ? "csv": {
? ? ? "type":"text",
? ? ? "extensions": [
? ? ? ? "txt"? ? ? ],
? ? ? "delimiter":"\t"? ? },
? ? "tsv": {
? ? ? "type":"text",
? ? ? "extensions": [
? ? ? ? "tsv"? ? ? ],
? ? ? "delimiter":"\t"? ? },
? ? "parquet": {
? ? ? "type":"parquet"? ? }}
這里以CSV為例子來說明:
"csv":表示固定的文本格式
"type":制定文件的類型凰盔,這里指定為文本類型
"extensions":擴展名為csv
"delimiter":文本內(nèi)容墓卦,每行的分隔符為一個tab占位符
上面的配置,這里我們也可以進行拓展户敬,比如我們的HDFS上的文件格式如下圖所示:
我們要達到以下查詢結(jié)果落剪,內(nèi)容如下所示:
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"]? |+------------------------+
那么,我們可以對其做以下配置尿庐,內(nèi)容如下所示:
"csv": {
? "type":"text",
? "extensions": [
? ? "csv2"? ],
? "skipFirstLine":true,
? "delimiter":","},
這里skipFirstLine這個屬性表示忽略一行結(jié)果忠怖。
另外,同樣用到上面的數(shù)據(jù)源抄瑟,我們要實現(xiàn)以下查詢結(jié)果凡泣,內(nèi)容如下所示:
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的屬性,我們添加以下內(nèi)容即可:
"csv": {
? "type":"text",
? "extensions": [
? ? "csv2"? ],
? "skipFirstLine":false,
? "extractHeader":true,
? "delimiter":","},
從單詞的意義上可以很直接的讀懂屬性所要表達的意思皮假,這里就不多做贅述了鞋拟。由于篇幅問題,這里就不一一列舉了惹资。
其他格式文件與此類似贺纲,填寫指定文件格式,文件類型褪测,擴展名猴誊,文本分隔符即可,其他擴展屬性可按需添加侮措。
3.Plugins
3.1 HDFS
集成HDFS的Plugins懈叹,添加內(nèi)容如下所示:
{
? "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分扎,添加內(nèi)容如下所示:
{
? "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服務(wù)环揽,命令如下所示:
hive --service metastore
? 這里需要注意的是略荡,Drill當(dāng)前不支持寫操作到Hive表,在將Hive表結(jié)構(gòu)中的數(shù)據(jù)類型做查詢映射時歉胶,支持以下類型:
支持的SQL類型Hive類型
BIGINTBIGINT
BOOLEANBOOLEAN
VARCHARCHAR
DATEDATE
DECIMAL*DECIMAL
FLOATFLOAT
DOUBLEDOUBLE
INTEGERINT,TINYINT,SMALLINT
INTERVALN/A
TIMEN/A
N/ATIMESPAMP (unix的系統(tǒng)時間)
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通今,添加內(nèi)容如下所示:
{
? "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連接信息也需使用對應(yīng)的域名臼氨,若是直接填寫IP掺喻,解析會失敗。保證解析的一致性储矩。
4.總結(jié)
另外感耙,在使用JDBC或ODBC去操作Drill的時候,連接信息的使用是需要注意的持隧,直接按照官方給出的連接方式硬套是有問題的即硼,這里我們修改以下連接信息。連接分2種情況屡拨,一種指定其Drill的IP和PORT只酥,第二種,使用ZK的連接方式呀狼,如jdbc:drill:zk=dn1,dn2,dn3:2181即可裂允。