动态目录

本节介绍openLooKeng的动态目录特性。通常openLooKeng管理员通过将目录概要文件(例如hive.properties)放置在连接节点目录(etc/catalog)下来将数据源添加到引擎。每当需要添加、更新或删除目录时,都需要重启所有协调节点和工作节点。

为了动态修改目录,openLooKeng引入了动态目录的特性。动态目录的原理是,将目录相关的配置文件在一个共享文件系统上管理,然后所有协调节点和工作节点从共享文件系统上同步到本地,并加载。开启此特性需要:

  • 首先,在etc/config.properties中配置:

    catalog.dynamic-enabled=true

  • 其次,在hdfs-config-default.properties中配置用于存储动态目录信息的文件系统。你可以通过etc/node.properties中的catalog.share.filesystem.profile属性修改这个文件名,默认为hdfs-config-default,你可以查看文件系统文档以获取更多信息。

    etc/filesystem/路径下添加hdfs-config-default.properties文件, 如果这个路径不存在,请创建。

    1. fs.client.type=hdfs
    2. hdfs.config.resources=/opt/openlookeng/config/core-site.xml, /opt/openlookeng/config/hdfs-site.xml
    3. hdfs.authentication.type=NONE
    4. fs.hdfs.impl.disable.cache=true

    如果HDFS开启Kerberos认证,那么

    1. fs.client.type=hdfs
    2. hdfs.config.resources=/opt/openlookeng/config/core-site.xml, /opt/openlookeng/config/hdfs-site.xml
    3. hdfs.authentication.type=KERBEROS
    4. hdfs.krb5.conf.path=/opt/openlookeng/config/krb5.conf
    5. hdfs.krb5.keytab.path=/opt/openlookeng/config/user.keytab
    6. hdfs.krb5.principal=openlookeng@HADOOP.COM # replace openlookeng@HADOOP.COM to your principal
    7. fs.hdfs.impl.disable.cache=true
  • 最后,在etc/node.properties配置用户文件系统中的存储动态目录信息的路径,用于指定共享文件系统上与本地存放目录相关的配置文件的路径;同时因为需要从共享文件系统上的相同路径同步配置文件,所以所有协调节点和工作节点的共享文件系统上的路径必须一致,本地的存放路径不做要求。

    1. catalog.config-dir=/opt/openlookeng/catalog
    2. catalog.share.config-dir=/opt/openkeng/catalog/share

使用

目录操作是通过openLooKeng协调节点上的RESTful API来完成的。HTTP请求具有如下形态(以Hive连接节点为例),POST/PUT请求体形式为multipart/form-data

  1. curl --location --request POST 'http://your_coordinator_ip:9101/v1/catalog' \
  2. --header 'X-Presto-User: admin' \
  3. --form 'catalogInformation="{
  4. \"catalogName\" : \"hive\",
  5. \"connectorName\" : \"hive-hadoop2\",
  6. \"properties\" : {
  7. \"hive.hdfs.impersonation.enabled\" : \"false\",
  8. \"hive.hdfs.authentication.type\" : \"KERBEROS\",
  9. \"hive.collect-column-statistics-on-write\" : \"true\",
  10. \"hive.metastore.service.principal\" : \"hive/hadoop.hadoop.com@HADOOP.COM\",
  11. \"hive.metastore.authentication.type\" : \"KERBEROS\",
  12. \"hive.metastore.uri\" : \"thrift://xx.xx.xx.xx:21088\",
  13. \"hive.allow-drop-table\" : \"true\",
  14. \"hive.config.resources\" : \"core-site.xml,hdfs-site.xml\",
  15. \"hive.hdfs.presto.keytab\" : \"user.keytab\",
  16. \"hive.metastore.krb5.conf.path\" : \"krb5.conf\",
  17. \"hive.metastore.client.keytab\" : \"user.keytab\",
  18. \"hive.metastore.client.principal\" : \"test@HADOOP.COM\",
  19. \"hive.hdfs.wire-encryption.enabled\" : \"true\",
  20. \"hive.hdfs.presto.principal\" : \"test@HADOOP.COM\"
  21. }
  22. }
  23. "' \
  24. --form 'catalogConfigurationFiles=@"/path/to/core-site.xml"' \
  25. --form 'catalogConfigurationFiles=@"/path/to/hdfs-site.xml"' \
  26. --form 'catalogConfigurationFiles=@"/path/to/user.keytab"', \
  27. --form 'globalConfigurationFiles=@"/path/to/krb5.conf"'

catalogName为用户指定的目录名称;

connectorName为目录类型,请参考connector章节;

properties为指定目录类型的相关参数,请参考各个connector的详细配置;

配置中如果需要指定文件,在properties中只需要指定文件名称即可,文件本地的路径以以下方式进行设置:

  1. 如果配置文件是所有目录共同使用,那么将文件路径放入globalConfigurationFiles参数中,例如krb5.conf
  2. 如果配置文件只有当前创建的目录使用,那么将文件路径放入catalogConfigurationFiles参数中,例如hdfs-site.xmlcore-site.xmluser.keytab,每个目录均有不同的配置。

添加目录

当添加新目录时,会向协调节点发送一个POST请求。协调节点首先重写文件路径属性,将文件保存到本地磁盘,并通过加载新添加的目录来验证操作。如果目录加载成功,协调节点将文件保存到共享文件系统(例如HDFS)。

其他协调节点和工作节点定期检查共享文件系统中的目录属性文件。当发现新的目录时,他们把相关的配置文件拉到本地磁盘,然后将目录加载到内存中。

以Hive为例,通过curl可以用以下命令创建目录:

  1. curl --location --request POST 'http://your_coordinator_ip:8090/v1/catalog' \
  2. --header 'X-Presto-User: admin' \
  3. --form 'catalogInformation="{
  4. \"catalogName\" : \"hive\",
  5. \"connectorName\" : \"hive-hadoop2\",
  6. \"properties\" : {
  7. \"hive.hdfs.impersonation.enabled\" : \"false\",
  8. \"hive.hdfs.authentication.type\" : \"KERBEROS\",
  9. \"hive.collect-column-statistics-on-write\" : \"true\",
  10. \"hive.metastore.service.principal\" : \"hive/hadoop.hadoop.com@HADOOP.COM\",
  11. \"hive.metastore.authentication.type\" : \"KERBEROS\",
  12. \"hive.metastore.uri\" : \"thrift://xx.xx.xx.xx:21088\",
  13. \"hive.allow-drop-table\" : \"true\",
  14. \"hive.config.resources\" : \"core-site.xml,hdfs-site.xml\",
  15. \"hive.hdfs.presto.keytab\" : \"user.keytab\",
  16. \"hive.metastore.krb5.conf.path\" : \"krb5.conf\",
  17. \"hive.metastore.client.keytab\" : \"user.keytab\",
  18. \"hive.metastore.client.principal\" : \"test@HADOOP.COM\",
  19. \"hive.hdfs.wire-encryption.enabled\" : \"true\",
  20. \"hive.hdfs.presto.principal\" : \"test@HADOOP.COM\"
  21. }
  22. }
  23. "' \
  24. --form 'catalogConfigurationFiles=@"/path/to/core-site.xml"' \
  25. --form 'catalogConfigurationFiles=@"/path/to/hdfs-site.xml"' \
  26. --form 'catalogConfigurationFiles=@"/path/to/user.keytab"', \
  27. --form 'globalConfigurationFiles=@"/path/to/krb5.conf"'

删除目录

与添加操作类似,当需要删除目录时,向协调节点发送DELETE请求。接收请求的协调节点从本地磁盘中删除相关目录概要文件,从服务器卸载目录,并从共享文件系统中删除目录。

其他协调节点和工作节点定期检查共享文件系统中的目录属性文件。当删除目录时,协调节点和工作节点也会删除本地磁盘上的相关配置文件,然后从内存中卸载目录。

以Hive为例,通过curl可以用以下命令删除目录,在catalog后指定之前创建过的目录名称:

  1. curl --location --request DELETE 'http://your_coordinator_ip:8090/v1/catalog/hive' \
  2. --header 'X-Presto-User: admin'

更新目录

UPDATE操作是DELETE和ADD操作的组合。首先管理员向协调节点发送PUT请求。协调节点收到请求后在本地删除并添加目录以验证更改。如果操作成功,协调节点从共享文件系统中删除目录,并等待所有其他节点从本地文件系统中删除目录。将新的配置文件保存到共享文件系统中。

其他协调节点和工作节点定期检查共享文件系统中的目录属性文件,并在本地文件系统上执行相应的更改。

目录属性,包括 connector-nameproperties等,支持修改。但是目录名称不能更改。

以Hive为例,通过curl可以用以下命令更新目录,以下更新了hive.allow-drop-table参数:

  1. curl --location --request PUT 'http://your_coordinator_ip:8090/v1/catalog' \
  2. --header 'X-Presto-User: admin' \
  3. --form 'catalogInformation="{
  4. \"catalogName\" : \"hive\",
  5. \"connectorName\" : \"hive-hadoop2\",
  6. \"properties\" : {
  7. \"hive.hdfs.impersonation.enabled\" : \"false\",
  8. \"hive.hdfs.authentication.type\" : \"KERBEROS\",
  9. \"hive.collect-column-statistics-on-write\" : \"true\",
  10. \"hive.metastore.service.principal\" : \"hive/hadoop.hadoop.com@HADOOP.COM\",
  11. \"hive.metastore.authentication.type\" : \"KERBEROS\",
  12. \"hive.metastore.uri\" : \"thrift://xx.xx.xx.xx:21088\",
  13. \"hive.allow-drop-table\" : \"false\",
  14. \"hive.config.resources\" : \"core-site.xml,hdfs-site.xml\",
  15. \"hive.hdfs.presto.keytab\" : \"user.keytab\",
  16. \"hive.metastore.krb5.conf.path\" : \"krb5.conf\",
  17. \"hive.metastore.client.keytab\" : \"user.keytab\",
  18. \"hive.metastore.client.principal\" : \"test@HADOOP.COM\",
  19. \"hive.hdfs.wire-encryption.enabled\" : \"true\",
  20. \"hive.hdfs.presto.principal\" : \"test@HADOOP.COM\"
  21. }
  22. }
  23. "' \
  24. --form 'catalogConfigurationFiles=@"/path/to/core-site.xml"' \
  25. --form 'catalogConfigurationFiles=@"/path/to/hdfs-site.xml"' \
  26. --form 'catalogConfigurationFiles=@"/path/to/user.keytab"', \
  27. --form 'globalConfigurationFiles=@"/path/to/krb5.conf"'

API信息

HTTP请求

添加:POST host/v1/catalog

更新:PUT host/v1/catalog

删除:DELETE host/v1/catalog/{catalogName}

HTTP返回码

HTTP返回码POSTPUTDELETE
401 UNAUTHORIZED没有权限添加目录没有权限修改目录同PUT
302 FOUND目录已存在--
404 NOT_FOUND动态目录已停用目录不存在或动态目录已停用同PUT
400 BAD_REQUEST请求不正确同POST同PUT
409 CONFLICT另一个会话正在操作目录同POST同POST
500 INTERNAL_SERVER_ERROR协调节点内部发生错误同POST同POST
201 CREATED成功成功-
204 NO_CONTENT--成功

配置属性

etc/config.properties中:

属性名称是否必选描述默认值
catalog.dynamic-enabled是否启用动态目录。false
catalog.scanner-interval扫描共享文件系统中目录的时间间隔。5s
catalog.max-file-size目录文件最大大小,用于限制上传的最大文件大小,避免客户端上传的文件过大。128 KB
catalog.valid-file-suffixes有效的配置文件后缀名,如果有多个,以逗号分开;当不配置时,允许所有的后缀类型。用于校验上传的文件类型,指定类型的配置文件才允许上传。

etc/node.properties中:

路径配置白名单:[“/tmp”, “/opt/hetu”, “/opt/openlookeng”, “/etc/hetu”, “/etc/openlookeng”, 工作目录]

注意:避免选择根目录;路径不能包含../;如果配置了node.data_dir,那么当前工作目录为node.data_dir的父目录; 如果没有配置,那么当前工作目录为openlookeng server的目录

属性名称是否必选描述默认值
catalog.config-dir本地磁盘存放配置文件的根目录。
catalog.share.config-dir共享文件系统中存放配置文件的根目录。
catalog.share.filesystem.profile共享文件系统的配置文件名。hdfs-config-default

对查询的影响

  • 删除目录后,正在执行的查询可能会失败。
  • 更新目录时,正在进行的查询可能会失败。