不少用华为云的 OBS 用户,不知道怎么配置 StarRocks 才能正常访问 OBS,这里写一篇教程,简单说一下。
访问华为云有两种办法,一种是走 S3 的兼容 API,另外一种则是通过华为云自己官方的 Hadoop JAR 包进行访问。
如果你创建的是普通的 OBS 桶,那么走 S3 兼容 API 就行了,这个最方便,不需要什么改动。
但是如果你用了华为云的并行文件系统,那么你就会头疼了。你会发现,如果一个目录下面的文件数量超过 1000 个,你的 SQL 的查询结果少了。这是因为并行文件系统没有完全兼容标准的 S3 协议,导致 FE list 文件的时候,超过 1000 个文件就 list 不出来了,它只会保留前 1000 个文件。是的,他不会报错,只会自己偷偷摸摸的查询结果错了。
下面的教程均基于 StarRocks 最新版(3.2)进行说明。
常规 OBS 桶配置
这个最简单啦,这么配鉴权就行了:
"aws.s3.access_key"="ak",
"aws.s3.secret_key"="sk",
"aws.s3.endpoint"="obs.cn-north-4.myhuaweicloud.com"
比如建一个 SR 的文件外部表,这么建就行了:
CREATE external TABLE obs
(
`ACTIVITY` varchar(65500)
)
ENGINE=FILE
PROPERTIES
(
"path" = "obs://test/load/foo.parquet",
"format" = "parquet",
"aws.s3.access_key"="ak",
"aws.s3.secret_key"="sk",
"aws.s3.endpoint"="obs.cn-north-4.myhuaweicloud.com"
);
但是如果你的访问路径存在 “=”,你会发现查询莫名其妙的 403(常见于 Hive 的分区表路径)。是的,这是因为华为云并没有完全兼容 S3,这里你需要在 be.conf
里面添加一个 aws_sdk_enable_compliant_rfc3986_encoding=true
配置项就行了。
并行文件系统
因为并行文件系统主要影响的就是 list 操作。而 StarRocks 的 list 操作均发生于 FE。所以整体的思路就是,FE 使用华为云官方的 Hadoop Jar,BE 则继续使用 S3 兼容 API 访问。
FE 配置
FE 配置和华为云官方的 Hadoop对接OBS 教程其实差不多。
从 https://github.com/huaweicloud/obsa-hdfs/tree/master/release 下载 jar 包,下载 hadoop-huaweicloud-3.1.1-hw-53.8.jar 这个 jar 包到 FE 的 fe/lib
目录下。
之后在 fe/conf
目录下配置如下 core-site.xml
:
<configuration>
<property>
<name>fs.obs.impl</name>
<value>org.apache.hadoop.fs.obs.OBSFileSystem</value>
</property>
<property>
<name>fs.AbstractFileSystem.obs.impl</name>
<value>org.apache.hadoop.fs.obs.OBS</value>
</property>
<property>
<name>fs.obs.access.key</name>
<value>ak</value>
</property>
<property>
<name>fs.obs.secret.key</name>
<value>sk</value>
</property>
<property>
<name>fs.obs.endpoint</name>
<value>obs.cn-east-3.myhuaweicloud.com</value>
</property>
</configuration>
BE 配置
在 be/conf
目录下配置如下 be.conf
:
object_storage_access_key_id=ak
object_storage_secret_access_key=sk
object_storage_endpoint=obs.cn-east-3.myhuaweicloud.com
aws_sdk_enable_compliant_rfc3986_encoding=true
然后 SR 建 catalog,导入啥的,不要配置任何鉴权信息。比如我下面这个文件外部表的 case:
CREATE external TABLE obs
(
`ACTIVITY` varchar(65500)
)
ENGINE=FILE
PROPERTIES
(
"path" = "obs://obs-sr-test-parallel/dir/foo.parquet",
"format" = "parquet"
);
然后一查就灵:
mysql> select * from obs;
+----------+
| ACTIVITY |
+----------+
| A |
| B |
+----------+
2 rows in set (0.42 sec)
至此,就搞定了。
JNI 配置
如果你用到了 RCFile,Avro 等格式,那么还需要在 BE 侧额外配置一下 jar 包和 core-site.xml,这是因为 StarRocks BE 侧是通过 JNI 的方式访问这类不常见的格式,
把放在 FE 的 OBS jar 包拷贝一份到 be/lib/hive-reader-lib/
目录下。把 FE 配置的 core-site.xml 放到 be/conf
目录下即可。
总结
鉴权千变万化,万变不离其中,最终的杀手锏基本都是通过 Hadoop Jar 来访问。不过如果你想让 StarRocks 完美的支持华为云 OBS,那么我建议你来水下代码吧。
关于别的厂商鉴权,可以看看我以前写的这个文章:StarRocks 全新云厂商鉴权系统食用指南。
原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/starrocks-how-to-connect-obs
评论列表(5条)
真是太有用了,一直在找这方便的资料,点赞
@jijj:不客气
试了下,成功了,感谢!!!
@Danny:哈哈
@Danny:用的如何