1.背景:
部分业务数据存放在亚马逊S3上,但大数据集群是购买腾讯云emr,希望通过内网专线从腾讯云emr上读取S3的数据写入基于腾讯云cos的hudi中;
2.环境:
Hadoop 3.2.2
spark 3.1.2
hudi 0.9
腾讯云 cos
亚马逊云 s3
spark添加jar包:aws-java-sdk-1.12.52.jar; aws-java-sdk-bundle-1.12.52.jar; aws-java-sdk-core-1.12.52.jar; aws-java-sdk-kms-1.12.52.jar
3.问题:
亚马逊云s3外网访问速度非常慢,极大概率出现访问超时情况,并且数据传输非常不安全,需要使用专线通过亚马逊提供的interface的VPC endpoint进行访问,但是在此环境下,通过配置S3 bucket访问秘钥来读取数据报错,配置代码如下:
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.access.key", "xxxxx");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.secret.key", "xxxxx");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.endpoint","https://bucket.vpce-xxxxxxx-ap-east-1b.s3.ap-east-1.vpce.amazonaws.com ")
查询可能出现的原因,增加其他配置:
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.connection.ssl.enabled", "false");
还是会报同样错误,具体错误如下:
4.解决过程:
向亚马逊提case,寻求帮助,亚马逊技术支持回复为hadoop版本过低导致,修复此问题后的版本为Hadoop version 3.3.2
[1] https://issues.apache.org/jira/browse/HADOOP-17677
[2] https://issues.apache.org/jira/browse/HADOOP-17705
此时检查hadoop官网和git,最新版本为hadoop 3.3.1
我寻思这不扯淡吗,又去找亚马逊技术支持
[1] https://github.com/apache/hadoop/tree/branch-3.3
然后我们希望升级hadoop,但是因为是购买腾讯云emr服务,并不支持升级为hadoop 3.3.1,但因为我们使用spark读取s3,讲道理只需要替换spark集成hadoop的包为3.3.1版本就可以;
于是我们替换spark安装目录下jars文件夹内 hadoop-common 为3.3.1版本进行测试,报错信息发生变化,忘记保存,报错与社区下面错误相同,无法设置endpoint.region导致,此问题已解决,会在hadoop 3.3.2版本发布。这 ... 又回到起点,于是我们根据hadoop github上的 17705 提交,修改了3.3.1版本代码,并重新编译打包了hadoop-common 3.3.1上传并替换至spark jars目录,成功可以配置endpoint.region,从而解决此问题
[HADOOP-17705] S3A to add option fs.s3a.endpoint.region to set AWS region - ASF JIRA
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.access.key", "xxxxxxx");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.secret.key", "xxxxxxx");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.endpoint.region", "xxxxxxx");
sparkSession.sparkContext().hadoopConfiguration().set("fs.s3a.endpoint", "xxxxxxx");
5.总结
已知此问题解决方法2个:
(1)等hadoop-3.3.2版本发布,整个集群更新为此版本,其他组件更新为相应兼容版本
(2)使用hadoop-3.3.1版本,根据hadoop项目 github上的 17705 提交修改源码,重新打包hadoop-common-3.3.1替换driver端spark目录下jars内hadoop-common可解决,但会引发其他问题,目前发现有提交spark任务,yarn不能分配资源,已解决,解决方案如下文:



