随着 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 各个模块中的用法,其他厂商到时候照葫芦画瓢即可。
文章末尾会介绍鉴权的整体实现,高阶玩家可以拥有自己的新玩法。
支持云厂商列表
云厂商 | 产品 | 支持鉴权机制 |
---|---|---|
AWS | S3,Glue | 支持 Instance Profile,Assume Role 和 Access key & Secret key |
GCS | 支持类似 Instance Profile 机制,User Json Key 和 Impersonation Service Account | |
Azure | Azure Blob Storage | 支持 Shared key 和 SAS token |
Azure | Azure Data Lake Gen1 | 支持 Managed Service Identity 和 Service Principal |
Azure | Azure 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 有几种常用的组合方式:
"use_aws_sdk_default_behavior"="true"
"use_aws_sdk_default_behavior"="true"
+"iam_role_arn="xxx"
"use_instance_profile"="true"
"use_instance_profile"="true"
+"iam_role_arn="xxx"
"access_key"="xxx"
+"secrey_key="xxx"
"access_key"="xxx"
+"secrey_key="xxx"
+"iam_role_arn="xxx"
Glue
Glue 是一款用于取代 Hive metastore 的元信息管理平台,支持参数如下:
参数名称 | 说明 | 默认值 | 例子 |
---|---|---|---|
aws.glue.use_aws_sdk_default_behavior | 是否使用 AWS SDK 的默认行为,SDK 会默认读取环境变量等信息完成鉴权,主要用于 K8S | false | “true” |
aws.glue.use_instance_profile | 是否使用 EC2 上面绑定的 Role 进行鉴权 | false | “true” |
aws.glue.access_key | AWS IAM 用户的 Access Key | 无 | “AKIARGReMXH254” |
aws.glue.secret_key | AWS 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.region | Glue 所在 Region | 无 | “us-west-1” |
aws.glue.endpoint | Glue 所在 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 会默认读取环境变量等信息完成鉴权,主要用于 K8S | false | “true” |
aws.s3.use_instance_profile | 是否使用 EC2 上面绑定的 Role 进行鉴权 | false | “true” |
aws.s3.access_key | AWS IAM 用户的 Access Key | 无 | “AKIARGReMXH254” |
aws.s3.secret_key | AWS 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.region | S3 所在 Region | 无 | “us-west-1” |
aws.s3.endpoint | S3 所在 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,该参数必须设置为 true | true | “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.container | container 名称 | “” | “new-blob-emr-2023-02-24t07-41-50-568z” |
azure.blob.sas_token | SAS 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_account
和azure.blob.shared_key
必须填。 - SAS Token:
azure.blob.storage_account
,azure.blob.container
和azure.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 Identity | false | “true” |
azure.adls1.oauth2_client_id | Service Principal 的 client id | “” | “e32ad6d1-5123-4ed6-8f6b-a5e54a24b705” |
azure.adls1.oauth2_credential | Service Principal 的 credential | “” | “8428Q~LG5qjSRMGgSpw5VRaEM” |
azure.adls1.oauth2_endpoint | Service 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_id
,azure.adls1.oauth2_credential
和azure.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 Identity | false | “true” |
azure.adls2.oauth2_tenant_id | Service Principal 的 client id | “” | “e32ad6d1-5123-4ed6-8f6b-a5e54a24b705” |
azure.adls2.oauth2_client_id | Service Principal 的 credential | “” | “e32ad6d1-5123-4ed6-8f6b-a24b705” |
azure.adls2.oauth2_client_secret | Service Principal 的 client secret | “8428Q~LG5qjSRMGgSpw5VRaEM” | |
azure.adls2.oauth2_client_endpoint | Service 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_account
和azure.adls2.shared_key
必须填。 - Service Principal:
azure.adls2.oauth2_client_id
,azure.adls2.oauth2_client_secret
和azure.adls2.oauth2_client_endpoint
必填。 - Managed Identity:
azure.adls2.oauth2_use_managed_identity
,azure.adls2.oauth2_tenant_id
和azure.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。
支持协议:gs://
参数名称 | 说明 | 默认值 | 例子 |
---|---|---|---|
gcp.gcs.use_compute_engine_service_account | 是否直接使用 Compute Engine 上面绑定的 Service Account | false | “true” |
gcp.gcs.service_account_email | Service Account 生成的 JSON 文件中的 email | “” | “user@hello.iam.gserviceaccount.com” |
gcp.gcs.service_account_private_key_id | Service Account 生成的 JSON 文件中的 private_key_id | “” | “61d257bd8479547cb3e04f0b9b6b9ca07af3b7ea” |
gcp.gcs.service_account_private_key | Service 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_email
,gcp.gcs.service_account_private_key_id
和 gcp.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.log
和be.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
评论列表(7条)
[…] 关于别的厂商鉴权,可以看看我以前写的这个文章:StarRocks 全新云厂商鉴权系统食用指南。 […]
卧槽,一篇文章让你完全了解SR对接的云服务和鉴权参数。。。干货满满。
@dirtysalt:这你不打赏一下。
大佬,SR物化视图改写部分的代码有个大致流程吗?或者在哪一次提交可以看到呢
@zx:这块我不是很清楚,我没参与过这个,感觉已经有数不清的pr了。
@Smith:好的,谢谢,我再找找
鸽鸽真帅