Hadoop - 實時查詢Drill

weixin_34365417發表於2018-05-22

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)

  下面筆者給大家介紹文字型別的相關細節,文字型別的使用,有其固定的使用方法,通用配置如下:

4594052-aba2a16de670ae98.gif

"formats": {

    "csv": {

      "type":"text",

      "extensions": [

        "txt"      ],

      "delimiter":"\t"    },

    "tsv": {

      "type":"text",

      "extensions": [

        "tsv"      ],

      "delimiter":"\t"    },

    "parquet": {

      "type":"parquet"    }}

4594052-8e1b29f2e7292a1d.gif

  這裡以CSV為例子來說明:

"csv":表示固定的文字格式

"type":制定檔案的型別,這裡指定為文字型別

"extensions":副檔名為csv

"delimiter":文字內容,每行的分隔符為一個tab佔位符

  上面的配置,這裡我們也可以進行擴充,比如我們的HDFS上的檔案格式如下圖所示:

4594052-6d90d71b98e529f5.png

  我們要達到以下查詢結果,內容如下所示:

4594052-0b57a88ade864077.gif

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"]  |+------------------------+

4594052-0678ebab506f24e3.gif

  那麼,我們可以對其做以下配置,內容如下所示:

4594052-1905a5297302c0c2.gif

"csv": {

  "type":"text",

  "extensions": [

    "csv2"  ],

  "skipFirstLine":true,

  "delimiter":","},

4594052-07d5276510325a46.gif

  這裡skipFirstLine這個屬性表示忽略一行結果。

  另外,同樣用到上面的資料來源,我們要實現以下查詢結果,內容如下所示:

4594052-a6e6741cbce7159f.gif

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|+-------+------+------+------+

4594052-e379b41e7381e87e.gif

  這該如何去修改CSV的屬性,我們新增以下內容即可:

4594052-f6983402402a2820.gif

"csv": {

  "type":"text",

  "extensions": [

    "csv2"  ],

  "skipFirstLine":false,

  "extractHeader":true,

  "delimiter":","},

4594052-ff36f87126e3f305.gif

  從單詞的意義上可以很直接的讀懂屬性所要表達的意思,這裡就不多做贅述了。由於篇幅問題,這裡就不一一列舉了。

  其他格式檔案與此類似,填寫指定檔案格式,檔案型別,副檔名,文字分隔符即可,其他擴充套件屬性可按需新增。

3.Plugins

3.1 HDFS

  整合HDFS的Plugins,新增內容如下所示:

4594052-452a872b0033fd67.gif

{

  "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"    }

  }

}

4594052-63df53fca490c3ed.gif

  PS:連線HDFS地址注意要正確。

3.2 Hive

  整合Hive的Plugins,新增內容如下所示:

4594052-18c116ea290e5669.gif

{

  "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"  }

}

4594052-6cc0e9d90bffbc5d.gif

  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,新增內容如下所示:

4594052-f506d3337ad5923b.gif

{

  "type":"hbase",

  "config": {

    "hbase.zookeeper.quorum":"hbase-zk01,hbase-zk02,hbase-zk03",

    "hbase.zookeeper.property.clientPort":"2181"  },

  "size.calculator.enabled":false,

  "enabled":true}

4594052-720a5260b8eb4b37.gif

  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即可。

相關文章