• 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": "	"
        },
        "tsv": {
          "type": "text",
          "extensions": [
            "tsv"
          ],
          "delimiter": "	"
        },
        "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": "	"
        },
        "tsv": {
          "type": "text",
          "extensions": [
            "tsv"
          ],
          "delimiter": "	"
        },
        "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.结束语

      这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

  • 相关阅读:
    结对编程——四则运算
    需求分析
    结对编程
    调查问卷的心得体会
    软件工程课初步目标
    软件工程课程建议
    结对编程--fault,error,failure
    结对编程--四则运算
    需求分析
    结对编程
  • 原文地址:https://www.cnblogs.com/smartloli/p/5002435.html
Copyright © 2020-2023  润新知