记 Doris 回归测试S3导入load_parallelism > 1

增加load_parallelism > 1的S3导入用例,测试导入时切分输入文件的逻辑。

这里有几个隐性的问题点(坑):

1、导入的文件一定要大,一般大于128M,否则,即使设置了 load_parallelism > 1 也不会doris的逻辑也不会切分文件并且多线程导入。

应该是min_bytes_per_broker_scanner这个参数控制的,默认是64M。

2、操作系统CA证书路径问题

回归测试里的S3导入用例,一般是从regression-conf.groovy里的配置变量获取endpoint、bucket、ak、sk,其中endpoint是社区流水线的域名,如果在LOAD语句里直接使用域名,那么默认使用https协议连接S3服务,例如:

) WITH S3 (
    "AWS_ENDPOINT" = "cos.ap-beijing.myqcloud.com",
    "AWS_ACCESS_KEY" = "AKIDd9RVMzIOI0V7Wlnbr9JG0WrhJk28zc2H",
    "AWS_SECRET_KEY" = "4uWxMhqnW3Plz97sPjqlSUXO1RhokRuO",
    "AWS_REGION" = "ap-beijing"
)

也可以在域名前加http或https来指定协议:

"AWS_ENDPOINT" = "http://cos.ap-beijing.myqcloud.com"

"AWS_ENDPOINT" = "https://cos.ap-beijing.myqcloud.com"

注意,BE底层是用AWS SDK访问S3服务的,而 AWS SDK 默认是走https,就是说这里如果只传入域名,走的是https协议使用端口443。

走http,LOAD成功,但是,走https失败,报错找不到CA证书(CA公钥):

[IO_ERROR]failed to read from s3://doris-build-1308700295/regression/load/data/test_load_parallelism.csv: curlCode: 77, Problem with the SSL CA cert (path? access rights?)

这个问题搞了好几天,也有对CA理解不够透彻的原因,也有对doris底层代码理解不透彻的原因。

经社区小伙伴提示,可能时CA证书的路径不对,doris找不到,调试doris BE端代码发现,doris和S3通讯用的是aws sdk,endpoint没有处理直接传给aws client,aws client再去选择https协议,找CA证书,而我没有aws sdk代码,不知道aws sdk到哪里找CA证书。

而我用aws cli是可以访问cos.ap-beijing.myqcloud.com并且读取对象的,使用的也是https协议。(后来我猜测aws cli应该是自带CA证书的)

并且curl可以访问https网站,例如https://www.baidu.com,也就是说curl可以进行https通讯,而进行https通讯必须要CA证书,那么curl的CA证书在哪呢?在网上搜搜搜,用 curl -vvI 访问一个https网址可以打印出来:

这里可以看到我机器上的CA证书路径:

/etc/pki/tls/certs/ca-bundle.crt

那么 aws sdk 寻找的CA证书路径是啥,是不是把上面这个文件,放到aws sdk寻找的路径就可以了?

从社区小伙伴那里了解到,这个路径可能和操作系统相关,而我用的是openeuler。

我想到了编译doris时用thirdparty库,里面的bin目录下也有个curl,这个curl寻找CA证书的路径,是不是与doris相同,毕竟都是来自社区的嘛~

我就试了一下这个来自社区的curl:

./thirdparty/installed/bin/curl -vvI https://www.baidu.com

发现它寻找的CA证书的路径是:

/etc/ssl/certs/ca-certificates.crt 

而我本机这个路径下,没有证书文件,尝试拷贝我本机自带的curl用的CA证书,到这个路径:

cp /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt 

再执行S3 LOAD,走https就成功了:

LOAD LABEL part_9744bffa3ea1e (
    DATA INFILE("s3://doris-build-1308700295/regression/load/data/test_load_parallelism.csv")
    INTO TABLE paral_load
    COLUMNS TERMINATED BY ","
    FORMAT AS "CSV"
)
WITH S3 (
    "AWS_ENDPOINT" = "cos.ap-beijing.myqcloud.com",
    "AWS_ACCESS_KEY" = "AKIDd9RVMzIOI0V7Wlnbr9JG0WrhJk28zc2H",
    "AWS_SECRET_KEY" = "4uWxMhqnW3Plz97sPjqlSUXO1RhokRuO",
    "AWS_REGION" = "ap-beijing"
)
PROPERTIES(
    "load_parallelism" = "3",
    "timeout" = "3600"
);

当然这里还有个小问题,就是时而成功,时而失败,经社区小伙伴提醒,应该是网络延迟问题,调大be.conf里的参数为:

buffered_reader_read_timeout_ms = 2000000ms

完美解决,不会有失败了 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值