StarRocks 全新云厂商鉴权系统食用指南

随着 StarRocks 3.0 的发布,彻底结束了过去云厂商鉴权参数军阀混战的年代,现在采用统一的全新鉴权参数。而且这些鉴权参数可以使用在任何需要发生鉴权的地方,可以是数据湖的 catalog,也可以是导入导出,甚至还可以在备份中使用,可谓是 anywhere。(数据湖的外部表不支持,因为这个功能即将入土)。

所有鉴权参数的命名采用 云厂商.产品.参数=xxx 的方式进行命名,其中参数中多个单词采用 _ 链接。比如 aws.s3.access_key 表示 AWS 下面 s3 的 AccessKey,又比如 aws.glue.access_key 表示 AWS 下面 glue 的 AccessKey。所有无默认值的鉴权参数,如果你不填,StarRocks 也就不传递给对应的 SDK,相应行为随缘。

现在 StarRocks 主要支持了 AWS,Google 和 Azure 的鉴权。关于 AWS,GCS 和 Azure 里面涉及的复杂鉴权语义,这里默认读者是懂的,如果不懂也说明你可能并不需要它(快速学习传送门)。其余国内的云厂商如阿里云 OSS,华为云 OBS,金山云 KS3,火山云引擎 TOS 均通过 S3 兼容协议进行访问,其实 Google 也可以使用 S3 兼容协议进行访问。

考虑到篇幅原因,本文只会在 AWS S3 中举例新鉴权参数在 StarRocks 各个模块中的用法,其他厂商到时候照葫芦画瓢即可。

文章末尾会介绍鉴权的整体实现,高阶玩家可以拥有自己的新玩法。

支持云厂商列表

云厂商产品支持鉴权机制
AWSS3,Glue支持 Instance Profile,Assume Role 和 Access key & Secret key
GoogleGCS支持类似 Instance Profile 机制,User Json Key 和 Impersonation Service Account
AzureAzure Blob Storage支持 Shared key 和 SAS token
AzureAzure Data Lake Gen1支持 Managed Service Identity 和 Service Principal
AzureAzure Data Lake Gen2支持 Managed Identity,Shared Key 和 Service Principal
阿里云OSS走 S3 兼容协议,仅支持 Access Key & Secret Key
华为云OBS走 S3 兼容协议,仅支持 Access Key & Secret Key
金山云KS3走 S3 兼容协议,仅支持 Access Key & Secret Key
火山云引擎TOS走 S3 兼容协议,仅支持 Access Key & Secret Key
腾讯云COS走 S3 兼容协议,仅支持 Access Key & Secret Key
其它兼容 S3 存储(前提使用 s3://s3a:// 协议)Minio…走 S3 兼容协议,仅支持 Access Key & Secret Key

语法

管理所有参数的文件:CloudConfigurationConstants.java,需要的人可以直接看代码。现在实现比较挫,有机会重构吧。

AWS

AWS 下面有两个产品,分别是 S3 和 Glue。考虑到 AWS 存在多种鉴权方式,因而存在优先级,如果用户填写所有参数,其不会全部生效。

优先级如下:use_aws_sdk_default_behavior > use_instance_profile > aws.s3.access_key & aws.s3.secret_key

AWS 有几种常用的组合方式:

  1. "use_aws_sdk_default_behavior"="true"
  2. "use_aws_sdk_default_behavior"="true" + "iam_role_arn="xxx"
  3. "use_instance_profile"="true"
  4. "use_instance_profile"="true" + "iam_role_arn="xxx"
  5. "access_key"="xxx" + "secrey_key="xxx"
  6. "access_key"="xxx" + "secrey_key="xxx" + "iam_role_arn="xxx"

Glue

Glue 是一款用于取代 Hive metastore 的元信息管理平台,支持参数如下:

参数名称说明默认值例子
aws.glue.use_aws_sdk_default_behavior是否使用 AWS SDK 的默认行为,SDK 会默认读取环境变量等信息完成鉴权,主要用于 K8Sfalse“true”
aws.glue.use_instance_profile是否使用 EC2 上面绑定的 Role 进行鉴权false“true”
aws.glue.access_keyAWS IAM 用户的 Access Key“AKIARGReMXH254”
aws.glue.secret_keyAWS IAM 用户的 Secret Key“zfQEnHiz9XTPSC7xwnyQIWkBixl”
aws.glue.iam_role_arn需要 Assume 的目标 Role 的 ARN“arn:aws:iam::081565:role/smith_role_glue”
aws.glue.external_id需要 Assume 的目标 Role 的 External Id“password”
aws.glue.regionGlue 所在 Region“us-west-1”
aws.glue.endpointGlue 所在 Endpoint,如果你填了 Region,Endpoint 不要填“glue.us-west-1.amazonaws.com”

因为 Glue 只会用在数据湖,下面放一个湖的 Example:

CREATE EXTERNAL CATALOG hudi_glue 
PROPERTIES (
    "type"="hudi",
    "hive.metastore.type"="glue",
    "aws.glue.access_key"="AKIARGFRMXH254",
    "aws.glue.secret_key"="zfQEnHiz9XTPSC73wnyQIWkBixl",
    "aws.glue.iam_role_arn"="arn:aws:iam::081565:role/smith_role_glue",
    "aws.glue.region"="us-west-1"
);

S3

S3 路径仅支持 s3://s3a:// 两种协议。

参数名称说明默认值例子
aws.s3.use_aws_sdk_default_behavior是否使用 AWS SDK 的默认行为,SDK 会默认读取环境变量等信息完成鉴权,主要用于 K8Sfalse“true”
aws.s3.use_instance_profile是否使用 EC2 上面绑定的 Role 进行鉴权false“true”
aws.s3.access_keyAWS IAM 用户的 Access Key“AKIARGReMXH254”
aws.s3.secret_keyAWS IAM 用户的 Secret Key“zfQEnHiz9XTPSC7xwnyQIWkBixl”
aws.s3.iam_role_arn需要 Assume 的目标 Role 的 ARN“arn:aws:iam::081565:role/smith_role_glue”
aws.s3.external_id需要 Assume 的目标 Role 的 External Id“password”
aws.s3.regionS3 所在 Region“us-west-1”
aws.s3.endpointS3 所在 Endpoint,如果你填了 Region,Endpoint 不要填。如果使用非 AWS 官方的 S3 存储(比如 OSS 等),则 Endpoint 必填,Region 不要填。“s3.us-west-1.amazonaws.com” 或 “https://ks3-cn-beijing.ksyuncs.com/” 等等
aws.s3.enable_path_style_access是否开启 path-style 访问,默认采用 virtual-hosted-style 访问。一般使用 minio 这类自建 S3 存储时,需要设置该值为 true 原文介绍false“true”
aws.s3.enable_ssl是否开启 SSL,如果采用 assume role 等机制访问 S3,该参数必须设置为 truetrue“false”

因为 StarRocks 涉及到存储的功能非常多,在这里会给每一个使用场景贴出用法,后续其他存储系统参考这里即可。

Endpoint 地址如果带 https://,则意味使用 https:// 进行访问。如果什么协议不带,意味着该 Endpoint 同时支持 http 和 https。

数据湖

CREATE EXTERNAL CATALOG hudi_glue 
PROPERTIES (
    "type"="hudi",
    "hive.metastore.type"="glue",
    "aws.glue.access_key"="AKIARGFRMXH254",
    "aws.glue.secret_key"="zfQEnHiz9XTPSC73wnyQIWkBixl",
    "aws.glue.iam_role_arn"="arn:aws:iam::081565:role/smith_role_glue",
    "aws.glue.region"="us-west-1",
    "aws.s3.access_key"="AKIARGFRMXH254",
    "aws.s3.secret_key"="zfQEnHiz9XTPSC73wnyQIWkBixl",
    "aws.s3.iam_role_arn"="arn:aws:iam::081565:role/smith_role_glue",
    "aws.s3.region"="us-west-1"
);

External File Table

CREATE EXTERNAL TABLE file_table 
(
  player_id varchar(65500),
  attributes map<varchar(100), varchar(2000)>
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "s3://smith/file_table.orc",
  "format" = "orc",
  "aws.s3.access_key"="AKIARG2NX",
  "aws.s3.secret_key"="zfQEnHi49/T+L9",
  "aws.s3.iam_role_arn"="arn:aws:iam::081565:role/smith_role_s3",
  "aws.s3.region"="us-west-1"
);

StarRocks 部署在 K8S 中

因为 K8S 的网络可能并不支持 Instance Profile,它需要如 WebIdentity 等机制。对于这种情况,我们只需要开启 use_aws_sdk_default_behavior 参数,采用 SDK 默认行为即可(当然前提是你容器配置过了)。

这个例子只有 AWS 专有,其他云厂商没有所谓的 use_aws_sdk_default_behavior 参数。

CREATE EXTERNAL TABLE file_table 
(
  player_id varchar(65500),
  attributes map<varchar(100), varchar(2000)>
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "s3://smith/file_table.orc",
  "format" = "orc",
  "aws.s3.use_aws_sdk_default_behavior"="true",
  "aws.s3.region"="us-west-1"
);

导入

LOAD LABEL test.label5
(
    DATA INFILE("s3://smith/file_table_dir/*")
    INTO TABLE load_table
    FORMAT AS "orc"
    (player_id)
)
WITH BROKER
(
    "aws.s3.access_key"="AKIARNX",
    "aws.s3.secret_key"="zfQEnHinY49/T+L9",
    "aws.s3.region"="us-west-1"
)
PROPERTIES
(
    "timeout" = "60"
);

导出

EXPORT TABLE test.load_table 
(player_id)
TO "s3://smith/export.csv" 
PROPERTIES
(
    "timeout" = "60"
)
WITH BROKER
(
    "aws.s3.access_key"="AKIARGFRMXH254CWV2NX",
    "aws.s3.secret_key"="zfQEnHiz9XTPSC73wnyQIkBixlR/FYnY49/T+L9",
    "aws.s3.region"="us-west-1"
);

SELECT INTO OUTFILE

类似小型 ETL,可以把 sql 结果输出到外部存储。

SELECT * FROM test.load_table limit 100
INTO OUTFILE "s3a://smith/export_outfile.csv"
FORMAT AS CSV
PROPERTIES
(
    "aws.s3.access_key"="AKIAR2NX",
    "aws.s3.secret_key"="zfQEnHi49/T+L9",
    "aws.s3.iam_role_arn"="arn:aws:iam::0818565:role/smith_role_s3",
    "aws.s3.region"="us-west-1",
    "column_separator" = ",",
    "line_delimiter" = "\n",
    "max_file_size" = "100MB"
);

备份与恢复

CREATE REPOSITORY `bak_repo`
WITH BROKER `broker`
ON LOCATION "s3://smith-sample/backup20230105/"
PROPERTIES
(
    "aws.s3.use_instance_profile" = "true",
    "aws.s3.iam_role_arn"="arn:aws:iam::08165:role/s3_role",
    "aws.s3.region"="us-west-2"
);

BACKUP SNAPSHOT hello.snapshot_lineitem_20230105
TO `bak_repo`
ON (lineitem2)
PROPERTIES ("type" = "full");

兼容 S3 存储的用法

Minio

仅支持 s3://s3a:// 协议。

Minio 根据我的经验之谈,一般需要开启 path-style access,是否开启 SSL 则取决于 minio 是否强制 SSL。

导入

LOAD LABEL test.label5
(
    DATA INFILE("s3://smith/file_table_dir/*")
    INTO TABLE load_table
    FORMAT AS "orc"
    (player_id)
)
WITH BROKER
(
    "aws.s3.access_key"="AKIARNX",
    "aws.s3.secret_key"="zfQEnHinY49/T+L9",
    "aws.s3.endpoint"="http://localhost:9000",
    "aws.s3.enable_path_style_access"="true",
    "aws.s3.enable_ssl"="false"
)
PROPERTIES
(
    "timeout" = "60"
);

其余场景用法参考 AWS S3。

阿里云 OSS

仅支持 oss:// 协议。

数据湖

CREATE EXTERNAL CATALOG oss_hive_test
PROPERTIES(
  "aws.s3.access_key"="LTAI5BcD",
  "aws.s3.secrey_key"="pWCOHnSu",
  "aws.s3.endpoint"="oss-cn-zhangjiakou-internal.aliyuncs.com",
  "type"="hive", 
  "hive.metastore.uris"="thrift://172.21.1.238:9083"
);

其余场景用法参考 AWS S3。

华为云 OBS

仅支持 obs:// 协议。

External Table

CREATE external TABLE obs
(
  `ACTIVITY` varchar(65500)
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "obs://test/load/foo.parquet",
  "format" = "parquet",
  "aws.s3.access_key"="05SL8M5ZTTTF",
  "aws.s3.secret_key"="Q81cSeUCWbqWHpjtG7PU",
  "aws.s3.endpoint"="obs.cn-north-4.myhuaweicloud.com"
);

如果路径带 = 号,需要在 be.conf 里面添加 aws_sdk_enable_compliant_rfc3986_encoding=true 配置,否则会 403。

Hive Catalog

使用如下建表语法:

CREATE EXTERNAL CATALOG hive_catalog_hms
PROPERTIES
(
    "type" = "hive",
    "hive.metastore.uris" = "thrift://ip:9083",
    "aws.s3.endpoint" = "obs.xxxxx.myhuaweicloud.com",
    "aws.s3.access_key" = "ak",
    "aws.s3.secret_key" = "sk"
);

be.conf 里面添加 aws_sdk_enable_compliant_rfc3986_encoding=true 即可解决。

其余场景用法参考 AWS S3。

腾讯云

仅支持 cosn:// 协议。

External Table

CREATE external TABLE cosn
(
  `ACTIVITY` varchar(65500)
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "cosn://srtest-1251083869/foo.parquet",
  "format" = "parquet",
  "aws.s3.access_key"="AKIDDH8GKBoL9pIVhl",
  "aws.s3.secret_key"="tY4OUMdXLxMvN",
  "aws.s3.endpoint"="https://cos.ap-shanghai.myqcloud.com"
);

其余场景用法参考 AWS S3。

腾讯云 COS 有一个元数据加速桶,建议不要开启,因为它没有完全兼容 S3 协议,会导致 Hadoop SDK 的目录识别,rename() 方法出现问题。

KS3

仅支持 ks3:// 协议。

External Table

CREATE external TABLE ks3 
(
  `ACTIVITY` varchar(65500)
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "ks3://test-20221025/test/foo.parquet",
  "format" = "parquet",
  "aws.s3.access_key"="AKLTFOwMJlIUw",
  "aws.s3.secret_key"="OIvxr0FaJQo5y8bm1puo71xjK2xXrA",
  "aws.s3.endpoint"="https://ks3-cn-beijing.ksyuncs.com/"
);

如果路径带 = 号,需要在 be.conf 里面添加 aws_sdk_enable_compliant_rfc3986_encoding=true 配置,否则会 403。

其余场景用法参考 AWS S3。

TOS

仅支持 tos:// 协议。火山云引擎提供了两种 Endpoint,请选择 S3 兼容的 Endpoint。

External Table

CREATE external TABLE tos
(
  `ACTIVITY` varchar(65500)
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "tos://smith-tos/foo.parquet",
  "format" = "parquet",
  "aws.s3.access_key"="AKLTMThlNTVmOD2Q5YWJlN2U",
  "aws.s3.secret_key"="Tkdaa05qZzFNRs1TUdWaU5qQQ==",
  "aws.s3.endpoint"="https://tos-s3-cn-beijing.volces.com"
);

其余场景用法参考 AWS S3。

GCS

骚操作,Google 的 GCS 也可以使用 s3 协议强行访问。

External Table

CREATE external TABLE tos
(
  `ACTIVITY` varchar(65500)
) 
ENGINE=FILE
PROPERTIES
(
  "path" = "s3://smith-gcs/foo.parquet",
  "format" = "parquet",
  "aws.s3.access_key"="AKLTMThlNTVmOD2Q5YWJlN2U",
  "aws.s3.secret_key"="Tkdaa05qZzFNRs1TUdWaU5qQQ==",
  "aws.s3.endpoint"="storage.googleapis.com"
);

如果 bucket 路径带 ‘_‘ 下划线,会访问失败,这是 Java 的 BUG,正常来说 bucket 是不允许有下划线的,但是 Google 的可以。所以这种情况还是老老实实的走 Google 官方的鉴权方法稳妥。

https://stackoverflow.com/questions/25993225/uri-gethost-returns-null-why

因为 bucket 名称带 _ 导致 URI.getHost() 方法返回是 null,使得 bucket 名称变为 null 了,然后就出 bug 了。报错信息是: “bucket is null/empty”。因为这个报错是 Hadoop SDK 里面抛出来的,所以 StarRocks 无能为力。

Azure

因为 Azure 自己比较挫的设计,导致它下面三个存储产品的鉴权参数不尽相同。

Azure Blob Storage

仅支持 wasb://wasbs:// 协议。wasbs:// 意思是开启 SSL 访问。

导入文件的路径格式参考 Hadoop,为 wasb[s]://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>

参数名称说明默认值例子
azure.blob.storage_account存储的 Storage Account“”“smith”
azure.blob.shared_key对应 Storage Account 的 Access Key“”“XXR2YL69y+pljRZm0LCcrLxtUTlAJLtyU”
azure.blob.containercontainer 名称“”“new-blob-emr-2023-02-24t07-41-50-568z”
azure.blob.sas_tokenSAS Token“”“sp=r&st=2023-02-27T12:50:59Z&se=2023-04-26T20:5”

Azure Blob 支持两种访问形式,分别是 Shared Key 和 SAS Token。

  • Shared Key:azure.blob.storage_accountazure.blob.shared_key 必须填。
  • SAS Token:azure.blob.storage_accountazure.blob.containerazure.blob.sas_token 必填。

Shared Key + 数据湖

CREATE EXTERNAL CATALOG blob_key_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.18:9083",
  "azure.blob.storage_account"="smithblob",
  "azure.blob.shared_key"="XXR2YL69y+pljRZmrlboplPz+ASt1nxZlQ=="
);

其它模块用法参考 AWS S3。

SAS Token + 导入

因为导入路径里面你已经填写了 Storage Account 和 Container 名称,所以你在参数中不需要额外填写,我们会基于路径进行自动推断。

LOAD LABEL test.label3
(
    DATA INFILE("wasbs://brokerload@test.blob.core.windows.net/file_table.orc")
    INTO TABLE load_table
    FORMAT AS "orc"
    (player_id)
)
WITH BROKER
(
   "azure.blob.shared_key"="DrUWfUJ+RTg4kZjOy8QdJt+AStD6gbqA=="
)
PROPERTIES
(
    "timeout" = "600"
);

其它模块用法参考 AWS S3。

SAS Token + 数据湖

CREATE EXTERNAL CATALOG blob_sas_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.18:9083",
  "azure.blob.account_name"="blob",
  "azure.blob.container_name"="new-blob-emr-2023-02-24t07-41-50-568z",
  "azure.blob.sas_token"="sp=r&st=2023-02-27T12:50:59Z&se=2023-04-26T20:50:59Z2Fhqk%3D"
);

其它模块用法参考 AWS S3。

Azure Data Lake Gen1

Azure Data Lake Gen1 已不被推荐使用,请使用 Azure Data Lake Gen2。

支持 adl:// 协议

导入路径格式:adl://<data_lake_storage_gen1_name>.azuredatalakestore.net/<path>/<file_name>

参数名称说明默认值例子
azure.adls1.use_managed_service_identity是否启用 Managed Service Identityfalse“true”
azure.adls1.oauth2_client_idService Principal 的 client id“”“e32ad6d1-5123-4ed6-8f6b-a5e54a24b705”
azure.adls1.oauth2_credentialService Principal 的 credential“”“8428Q~LG5qjSRMGgSpw5VRaEM”
azure.adls1.oauth2_endpointService Principal 的 endpoint“”“https://login.microsoftonline.com/54cc-386b-4a44-a7b8-8971193/oauth2/token”

Azure Data Lake Gen1 支持两种访问形式,分别是 Managed Service Identity 和 Service Principal。

  • Managed Service Identity:"azure.adls1.use_managed_service_identity"="true"
  • Service Principal:azure.adls1.oauth2_client_idazure.adls1.oauth2_credentialazure.adls1.oauth2_endpoint 必填。

Managed Service Identiy + 数据湖

CREATE EXTERNAL CATALOG adls1_sas_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.18:9083",
  "azure.adls1.use_managed_service_identity"="true"
);

其余场景用法参考 AWS S3。

Service Principal + 数据湖

CREATE EXTERNAL CATALOG adls1_sas_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.18:9083",
  "azure.adls1.oauth2_client_id"="e32ad6d1-5123-4ed6-8f6b-a5e54a24b705",
  "azure.adls1.oauth2_credential"="8428Q~LG5qjSRMGgSpw5VRaEM",
  "azure.adls1.oauth2_endpoint"="https://login.microsoftonline.com/54cc-386b-4a44-a7b8-8971193/oauth2/token"
);

其余场景用法参考 AWS S3。

Azure Data Lake Gen2

支持 abfs://abfss:// 协议。

导入路径格式:abfs[s]://<container>@<storage_account>.dfs.core.windows.net/<file_name>

参数名称说明默认值例子
azure.adls2.oauth2_use_managed_identity是否启用 Managed Identityfalse“true”
azure.adls2.oauth2_tenant_idService Principal 的 client id“”“e32ad6d1-5123-4ed6-8f6b-a5e54a24b705”
azure.adls2.oauth2_client_idService Principal 的 credential“”“e32ad6d1-5123-4ed6-8f6b-a24b705”
azure.adls2.oauth2_client_secretService Principal 的 client secret“8428Q~LG5qjSRMGgSpw5VRaEM”
azure.adls2.oauth2_client_endpointService Principal 的 endpoint“https://login.microsoftonline.com/54cc-386b-4a44-a7b8-8971193/oauth2/token”
azure.adls2.storage_account目标 Storage Account“”“smith”
azure.adls2.shared_key目标 Storage Account 的 Access Key“”“XXR2YL69y+pljRZm0LCcrLxtUTlAJLtyU”

Azure Data Lake Gen2 支持三种访问形式,分别是 Shared Key, Service Principal 和 Managed Identity。

  • Shared Key:azure.adls2.storage_accountazure.adls2.shared_key 必须填。
  • Service Principal:azure.adls2.oauth2_client_idazure.adls2.oauth2_client_secretazure.adls2.oauth2_client_endpoint 必填。
  • Managed Identity:azure.adls2.oauth2_use_managed_identityazure.adls2.oauth2_tenant_idazure.adls2.oauth2_client_id 必填。

Shared Key

和 Blob 同理,如果是导入等任务,因为你已经在路径中指明了 Storage Account,Storage Account 可以不用填。

Shared Key + 数据湖

CREATE EXTERNAL CATALOG abfs_key_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.24:9083",
  "azure.adls2.storage_account"="smithadl",
  "azure.adls2.shared_key"="DrUWfUJ+RTg4+Hofa7WP+uBmzJwGx8B/L1M1lOy8QdJt+AStD6gbqA=="
);

其余场景用法参考 AWS S3。

数据湖 + Service Principal

CREATE EXTERNAL CATALOG abfs_princple_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.24:9083",
  "azure.adls2.oauth2_client_id"="e32ad6d1-5c27-47d6-8f6b-a5e54b705",
  "azure.adls2.oauth2_client_secret"="8428Q~LG5lbRxfSpw5VRaEM",
  "azure.adls2.oauth2_client_endpoint"="https://login.microsoftonline.com/540e19cc-386b-444-a7b8-8974c0921193/oauth2/token"
);

其余场景用法参考 AWS S3。

数据湖 + Managed Identity

CREATE EXTERNAL CATALOG abfs_managed_identity_hive_test
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://10.1.0.24:9083",
  "azure.adls2.oauth2_use_managed_identity" = "true",
  "azure.adls2.oauth2_tenant_id" = "0b96185d-2506-1234-91f6-c5de2123456",
  "azure.adls2.oauth2_client_id" = "c11e0d64-1234-476b-1234-6feffa123456"
);

其余场景用法参考 AWS S3。

Google

支持协议:gs://

参数名称说明默认值例子
gcp.gcs.use_compute_engine_service_account是否直接使用 Compute Engine 上面绑定的 Service Accountfalse“true”
gcp.gcs.service_account_emailService Account 生成的 JSON 文件中的 email“”“user@hello.iam.gserviceaccount.com”
gcp.gcs.service_account_private_key_idService Account 生成的 JSON 文件中的 private_key_id“”“61d257bd8479547cb3e04f0b9b6b9ca07af3b7ea”
gcp.gcs.service_account_private_keyService Account 生成的 JSON 文件中的 private_key“”“—–BEGIN PRIVATE KEY—-xxxx—–END PRIVATE KEY—–\n”
gcp.gcs.impersonation_service_account需要 impersonation 的目标 Service Account。类似于 AWS Assume Role 的目标 Service Account。“”“hello”

使用 Compute Engine 绑定的 Service Account

设置 gcp.gcs.use_compute_engine_service_account=true 即可。

使用 Service Account 的 JSON 文件

gcp.gcs.service_account_emailgcp.gcs.service_account_private_key_idgcp.gcs.service_account_private_key 必填,从对应 json 文件里面的 key 获得。

使用 Impersonation

类似于 AWS 的 Assume Role。

  • gcp.gcs.use_compute_engine_service_account + gcp.gcs.impersonation_service_account
  • gcp.gcs.service_account_email + gcp.gcs.service_account_private_key_id + gcp.gcs.service_account_private_key + gcp.gcs.impersonation_service_account

数据湖 + Service Account 的 JSON

CREATE EXTERNAL CATALOG gcs_connector
PROPERTIES(
  "type"="hive", 
  "hive.metastore.uris"="thrift://34.132.15.127:9083",
  "gcp.gcs.service_account_email"="user@helloworld.iam.gserviceaccount.com",
  "gcp.gcs.service_account_private_key_id"="61d25b9ca07af3b7ea",
  "gcp.gcs.service_account_private_key"="-----BEGIN PRIVATE KEY-----\nMIIEv......Lgk=\n-----END PRIVATE KEY-----\n"
);

高阶用法

目前的整体架构是 FE 采用 Hadoop 全家桶与云存储交互,目前 FE 已经内置了 AWS,Azure,GCP 和 JindoSDK 的 jar 包。BE 除了 Azure 和 GCP 使用 Hadoop 的 jar 包,其余都使用 S3 SDK 进行访问。这意味着你在 FE 侧可以通过 core-site.xml 的方式对权限进行细粒度的调整,而 BE 侧支持 core-site.xml 的只有 Azure 和 GCP。

JindoSDK 是阿里云推出的一款用于优化 Hadoop 与 OSS 通讯的 SDK。

我觉得 FE 访问 OSS 的性能不够好?

如果你采用 aws.s3.access_key 的方式来访问 OSS 的数据,默认采用的是 Hadoop 的 S3AFileSystem 进行访问。而 StarRocks 目前内置了 JindoSDK,你可以通过在 FE 测配置 core-site.xml 和 BE 侧配置 be.conf 来启用 JindoSDK。JindoSDK 访问 OSS 会有更好的性能。

FE的 core-site.xml 配置:

<?xml version="1.0"?>
<configuration>
    <property>
        <name>fs.oss.impl</name>
        <value>org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem</value>
    </property>
    <property>
        <name>fs.AbstractFileSystem.oss.impl</name>
        <value>com.aliyun.jindodata.oss.OSS</value>
    </property>
    <property>
        <name>fs.oss.accessKeyId</name>
        <value>LTAIYLBcD</value>
    </property>
    <property>
        <name>fs.oss.accessKeySecret</name>
        <value>pWCOho7nSu</value>
    </property>
    <property>
        <name>fs.oss.endpoint</name>
        <value>oss-cn-zhangjiakou-internal.aliyuncs.com</value>
    </property>
</configuration>

BE be.conf 配置:

object_storage_access_key_id = LTAIYLBcD
object_storage_secret_access_key = pWCOho7nSu
object_storage_endpoint = http://oss-cn-zhangjiakou-internal.aliyuncs.com/

Azure 和 GCP 支持的鉴权语义过于简单?

你可以根据 Azure 和 GCP 的官方文档,配置对应的 core-site.xml 文件分别放置在 FE 和 BE 的 conf 目录下。

现有的 Azure 鉴权不支持 Azurite,怎么办?

目前的鉴权参数并不是为 Azurite 准备的,如果你需要使用 Azurite,请通过 core-site.xml 的方式完成。

不足之处

  • StarRocks 不会对你输入的鉴权参数做任何的校验,即使你把 endpoint 地址填到 region 去,StarRocks 也不会做什么处理,到时候迎接你的只有 403。
  • 当鉴权参数错误时,你可能会从 mysql-client 测看到一些莫名奇妙的错误,这时候需要看 fe.logbe.INFO 的日志才能确定具体问题。
  • 发生 403 时,不一定是你的 AccessKey 和 SecretKey 填写错误。有可能是你 Endpoint 填错了,或者目标存储强制开启 SSL,而你又没开启,等等。
  • 目前在非 AWS 的机器上面进行 assume role 操作,可能会报错。

Case-By-Case

后续如果有问题,会 case-by-case 的收集在这里,也欢迎大家进行反馈。

原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/starrocks-new-cloud-authentication

打赏 微信扫一扫 微信扫一扫
SmithSmith
上一篇 2023年1月20日 上午1:43
下一篇 2023年7月6日 下午8:58

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(7条)

  • […] 关于别的厂商鉴权,可以看看我以前写的这个文章:StarRocks 全新云厂商鉴权系统食用指南。 […]

  • dirtysalt
    dirtysalt 2023年9月1日 下午1:44

    卧槽,一篇文章让你完全了解SR对接的云服务和鉴权参数。。。干货满满。

  • zx
    zx 2023年7月5日 上午10:01

    大佬,SR物化视图改写部分的代码有个大致流程吗?或者在哪一次提交可以看到呢

    • Smith
      Smith 2023年7月5日 上午10:29

      @zx这块我不是很清楚,我没参与过这个,感觉已经有数不清的pr了。

    • zx
      zx 2023年7月5日 上午10:32

      @Smith好的,谢谢,我再找找

  • DCSB
    DCSB 2023年4月13日 下午4:21

    鸽鸽真帅