云原生数据湖分析(Data Lake Analytics,DLA)支持通过CU版访问用户自建的HDFS。本文主要介绍如何通过DLA连接并查询HDFS上的数据。

前提条件

  • DLA目前仅支持通过CU版访问HDFS,请确保您已经开通了DLA CU版本,详情请参见CU版本快速入门
  • 创建虚拟集群时,绑定的数据源网络必须和HDFS集群在同一个VPC下面。
  • 以下示例是一个简单的CSV文件,您可以在本地创建一个新的文本文件example.txt,在其中粘贴如下内容:
    7,8,9
    然后执行如下命令将文件上传到HDFS。
    hadoop fs -mkdir -p hdfs://172.168.XX.XX:9000/test/p/d=1
    hadoop fs -copyFromLocal example.txt hdfs://172.168.XX.XX:9000/test/p/d=1/example.txt

    您需要把命令中172.168.XX.XX:9000替换成您HDFS集群的host。

操作步骤

  1. 登录DLA控制台
  2. 单击左侧导航栏的Serverless Presto>SQL执行
  3. 单击登录到DMS来执行SQL操作,执行以下SQL命令创建库:
    CREATE DATABASE `my_hdfs_db`
    WITH DBPROPERTIES (
        catalog = 'hive',
        location = 'hdfs://172.168.XX.XX:9000/test/'
    )
    说明 您也可以通过MySQL客户端或者程序代码等方式连接DLA,然后执行SQL命令创建库。
    参数说明如下:
    • CATALOG:取值为hive,表示创建的是hive Schema。
    • LOCATION:库所在的目录。
  4. 创建表。
    CREATE EXTERNAL TABLE p (
        `a` int,
        `b` int,
        `c` int
    ) partitioned by (d int)
    ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
    STORED AS `TEXTFILE`
    LOCATION 'hdfs://172.168.XX.XX:9000/test/p/';
    HDFS表的参数、表属性和OSS表大部分都是一样的。主要的区别如下:
    • 由于网络连通性的问题,在创建库、表时不会对目录内容进行检查,用户需要自己保证目录的正确性。
    • 基于同样的原因,HDFS表不支持auto.create.location属性。
  5. 查询或访问数据。
    由于只有CU的计算资源和HDFS网络可以联通,因此所有访问HDFS表的SQL语句都需要指定hint: /*+cluster=your-vc-name*/ ,这样SQL就会在CU中执行。
    示例:
    mysql> /*+ cluster=vc-test */
        -> alter table p
        -> add partition (d=1)
        -> location 'hdfs://172.168.XX.XX:9000/test/p/d=1';
    Query OK, 0 rows affected (8.63 sec)
    
    mysql> /*+ cluster=vc-test */
        -> alter table p
        -> drop partition (d=1) ;
    Query OK, 0 rows affected (6.08 sec)
    
    mysql> /*+ cluster=vc-test */ msck repair table p;
    +-----------+-----------+
    | Partition | Operation |
    +-----------+-----------+
    | d=1       | CREATED   |
    +-----------+-----------+
    1 row in set (16.47 sec)
    
    mysql> /*+ cluster=vc-test */ select * from  p;
    +------+------+------+------+
    | a    | b    | c    | d    |
    +------+------+------+------+
    |    7 |    8 |    9 |    1 |
    +------+------+------+------+
    1 row in set (4.74 sec)

    更多详细信息,请参见常用SQL