spark对接oss对象存储

空浩淼
2023-12-01

       随着云原生的不断发展,存算分离的大数据架构已经成为了主流。今天介绍一下如何让spark使用阿里云oss对象存储替代本地存储或者hdfs存储jar包,日志等。

环境

spark环境:

spark-3.1.3-bin-hadoop3.2

hadoop源码:

hadoop3.2

添加jar包

       我使用的是spark-3.1.3-bin-hadoop3.2这个spark环境。默认的版本中是没有阿里云的相关jar包的,因此只能使用hdfs或者local。

       在hadoop源码中(https://github.com/apache/hadoop),有一个hadoop-tools文件夹,下面放着的都是hadoop周边衍生工具代码,比如hadoop-aliyun是hadoop对接aliyun的,再比如hadoop-aws是hadoop对接aws的。

       我们通过编译hadoop代码,可以在hadoop-aliyun/target下面得到hadoop-aliyun-3.2.0.jar,这个jar包还依赖aliyun-sdk-oss-2.8.3.jar以及jdom-1.1.jar,这两个jar包在maven的.m2仓库中可以找到,路径分别为:

~/.m2/repository/com/aliyun/oss/aliyun-sdk-oss/2.8.3/aliyun-sdk-oss-2.8.3.jar

~/.m2/repository/org/jdom/jdom/1.1/jdom-1.1.jar

将这三个jar包,放到spark-3.1.3-bin-hadoop3.2/jars下面。

         因为我是基于k8s提交spark作业,所以将spark-3.1.3-bin-hadoop3.2打成docker镜像。

修改配置

       放置完jar后,还需要添加一下配置才能使用。

       进入spark-3.1.3-bin-hadoop3.2/conf文件夹,执行命令

vi spark-defaults.conf

       在打开的文件中添加如下配置:

spark.hadoop.fs.oss.accessKeyId=LTAI5tLy5RdMDSfBghyAV2me
spark.hadoop.fs.oss.accessKeySecret=2boDk3rr9kQd5qk1yQ6tsXYQow8chP
spark.hadoop.fs.oss.impl=org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
spark.hadoop.fs.oss.endpoint=oss-cn-hangzhou.aliyuncs.com

       将ak, sk, endpoint改成你自己的。这样就可以用了。

       如果想要将日志也放到oss中,还需要加上两行配置。

spark.eventLog.enabled true
spark.eventLog.dir oss://<your bucket>

       如果想通过historyserver,读取oss中的日志,则需要改另一个文件,执行命令

vi spark-env.sh

       在里面加入如下配置

export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=10 -Dspark.history.fs.logDirectory=oss://<your bucket> -Dspark.history.fs.update.interval=10"

 

测试

       测试一下spark-pi。将spark-3.1.3-bin-hadoop3.2/examples/jars/目录下的spark-examples_2.12-3.1.3.jar放到oss的bucket中。

      执行下面的命令,提交spark-pi作业。

./spark-submit --master k8s://https://192.168.124.131:6443 --deploy-mode cluster --name spark-pi --class org.apache.spark.examples.SparkPi --conf spark.kubernetes.namespace=spark --conf spark.executor.instances=1 --conf spark.kubernetes.container.image=xingyunyang/spark:v3.1.3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=sa-example oss://sparktest/jars/spark-examples_2.12-3.1.3.jar

       这条命令行,前面的字段都是通用的,不是重点,重点是最后jar包的存放位置,从以前的local://换成了oss://,因此spark就可以从oss上将jar包拉下来。

 类似资料: