增加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
完美解决,不会有失败了 !