Hadoop-Drill深度剖析


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類型
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類型:

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

5.結束語

  這篇博客就和大家分享到這里,如果大家在研究學習的過程當中有什么問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM