
# 安装Spark
#### 前提条件
您需要准备一台可访问公网的Linux机器，节点规格建议为4U8G及以上。
#### 配置JDK
以CentOS系统为例，安装JDK 1.8。
1. 查询可用的JDK版本。 
   ```
   yum -y list java*
   ```
   
   
2. 选择安装JDK 1.8。 
   ```
   yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
   ```
   
   
3. 安装完成后，查看JDK版本。 
   ```
   # java -version
   openjdk version "1.8.0_382"
   OpenJDK Runtime Environment (build 1.8.0_382-b05)
   OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
   ```
   
   
4. 添加环境变量。 
   1. Linux环境变量配置在/etc/profile文件中。
      ```
      vim /etc/profile
      ```
      
   
   2. 在编辑模式下，在文件最后添加如下内容：
      ```
      JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
      PATH=$PATH:$JAVA_HOME/bin
      CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
      export JAVA_HOME  PATH  CLASSPATH
      ```
      
   
   3. 保存并关闭profile文件，执行如下命令使其生效。
      ```
      source /etc/profile
      ```
      
   
   4. 查看JDK环境变量。
      ```
      echo $JAVA_HOME
      echo $PATH
      echo $CLASSPATH
      ```
      
   
   
   
   
 
#### 获取Spark包
由于OBS适配hadoop2.8.3和3.1.1版本，本文使用3.1.1。
1. 下载v3.1.1版本的[Spark](https://github.com/apache/spark.git)。如环境中未安装git，您需要先执行**yum install git** 安装git。
   
   ```
   git clone -b v3.1.1 https://github.com/apache/spark.git
   ```
   
   
2. 修改/dev/make-distribution.sh文件，指定Spark版本，目的是为了让编译的时候跳过检测。 
   1. 使用搜索找到 VERSION 所在行，查看版本号所在行数。
      ```
      cat ./spark/dev/make-distribution.sh |grep -n '^VERSION=' -A18
      ```
      
   
   2. 显示129行到147行，将这些内容注释，并指定版本。
      ```
      sed -i '129,147s/^/#/g' ./spark/dev/make-distribution.sh
      sed -i '148a VERSION=3.1.3\nSCALA_VERSION=2.12\nSPARK_HADOOP_VERSION=3.1.1\nSPARK_HIVE=1' ./spark/dev/make-distribution.sh
      ```
      
   
   
   
   
3. 下载[依赖包](https://archive.apache.org/dist//maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz)。
   
   ```
   wget https://archive.apache.org/dist//maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
   tar -zxvf apache-maven-3.6.3-bin.tar.gz && mv apache-maven-3.6.3 ./spark/build
   ```
   
   
4. 执行如下命令进行编译。 
   ```
   ./spark/dev/make-distribution.sh --name hadoop3.1 --tgz -Pkubernetes -Pyarn -Dhadoop.version=3.1.1
   ```
   
   
5. 编译可能需要一定时间，请耐心等待。编译完成后，软件包名称为spark-3.1.3-bin-hadoop3.1.tgz。
 
#### 配置Spark运行环境
为了操作简便，使用root用户，并将编译出的软件包spark-3.1.3-bin-hadoop3.1.tgz放置于操作节点/root目录下。
1. 将软件包移动至/root目录。 
   ```
   mv ./spark/spark-3.1.3-bin-hadoop3.1.tgz /root
   ```
   
   
2. 执行命令安装Spark。 
   ```
   tar -zxvf spark-3.1.3-bin-hadoop3.1.tgz
   mv spark-3.1.3-bin-hadoop3.1 spark-obs
   cat >> ~/.bashrc <<EOF
   PATH=/root/spark-obs/bin:\$PATH
   PATH=/root/spark-obs/sbin:\$PATH
   export SPARK_HOME=/root/spark-obs
   EOF
   source ~/.bashrc
   ```
   
   
3. 此时已经可以使用spark-submit等二进制，执行以下命令查看所用的Spark版本。 
   ```
   spark-submit --version
   ```
   
   
 
 #### 配置Spark对接OBS
1. 获取华为云OBS jar包。本文使用[hadoop-huaweicloud-3.1.1-hw-45.jar](https://github.com/huaweicloud/obsa-hdfs/releases/download/v45/hadoop-huaweicloud-3.1.1-hw-45.jar)，获取地址：<https://github.com/huaweicloud/obsa-hdfs/tree/master/release>。
   
   ```
   wget https://github.com/huaweicloud/obsa-hdfs/releases/download/v45/hadoop-huaweicloud-3.1.1-hw-45.jar
   ```
   
   
2. 复制华为云OBS jar包到相应目录。 
   ```
   cp hadoop-huaweicloud-3.1.1-hw-45.jar /root/spark-obs/jars/
   ```
   
   
3. 修改Spark配置项。为了对接OBS，需要为Spark添加对应的配置项。 
   1. 获取AK/SK，详情请参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
   
   2. 修改AK_OF_YOUR_ACCOUNT / SK_OF_YOUR_ACCOUNT / OBS_ENDPOINT为实际值。
      - AK_OF_YOUR_ACCOUNT：上一步中获取的AK。
      
      - SK_OF_YOUR_ACCOUNT：上一步中获取的SK。
      
      - OBS_ENDPOINT：OBS的Endpoint，可前往[地区和终端节点](https://developer.huaweicloud.com/endpoint?OBS)查询。
      
      
      ```
      cp ~/spark-obs/conf/spark-defaults.conf.template ~/spark-obs/conf/spark-defaults.conf
      cat >> ~/spark-obs/conf/spark-defaults.conf <<EOF
      spark.hadoop.fs.obs.readahead.inputstream.enabled=true
      spark.hadoop.fs.obs.buffer.max.range=6291456
      spark.hadoop.fs.obs.buffer.part.size=2097152
      spark.hadoop.fs.obs.threads.read.core=500
      spark.hadoop.fs.obs.threads.read.max=1000
      spark.hadoop.fs.obs.write.buffer.size=8192
      spark.hadoop.fs.obs.read.buffer.size=8192
      spark.hadoop.fs.obs.connection.maximum=1000
      spark.hadoop.fs.obs.access.key=AK_OF_YOUR_ACCOUNT
      spark.hadoop.fs.obs.secret.key=SK_OF_YOUR_ACCOUNT
      spark.hadoop.fs.obs.endpoint=OBS_ENDPOINT
      spark.hadoop.fs.obs.buffer.dir=/root/hadoop-obs/obs-cache
      spark.hadoop.fs.obs.impl=org.apache.hadoop.fs.obs.OBSFileSystem
      spark.hadoop.fs.obs.connection.ssl.enabled=false
      spark.hadoop.fs.obs.fast.upload=true
      spark.hadoop.fs.obs.socket.send.buffer=65536
      spark.hadoop.fs.obs.socket.recv.buffer=65536
      spark.hadoop.fs.obs.max.total.tasks=20
      spark.hadoop.fs.obs.threads.max=20
      spark.kubernetes.container.image.pullSecrets=default-secret
      EOF
      ```
      
   
   
   
   
 
 #### 预置镜像到SWR
在K8s内运行Spark任务，需要构建相同版本的Spark容器镜像，并将其上传到SWR。在编译Spark时，会自动生成配套的Dockerfile文件，您可通过此文件制作镜像并上传至SWR。
1. 制作镜像。 
   ```
   cd ~/spark-obs
   docker build -t spark:3.1.3-obs --build-arg spark_uid=0 -f kubernetes/dockerfiles/spark/Dockerfile .
   ```
   
   
2. 上传镜像。 
   1. （可选）登录SWR管理控制台，选择左侧导航栏的"组织管理"，单击页面右上角的"创建组织"，创建一个组织。 如已有组织可跳过此步骤。
      
   
   2. 在左侧导航栏选择"我的镜像"，单击右侧"客户端上传"，在弹出的页面中单击"生成临时登录指令"，单击![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001690626137.png)复制登录指令。
   
   3. 在集群节点上执行上一步复制的登录指令，登录成功会显示"Login Succeeded"。
   
   4. 登录制作镜像的节点，复制登录指令。
      ```
      docker tag [{镜像名称}:{版本名称}] swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
      docker push swr.cn-east-3.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
      ```
      记录下镜像的访问地址以供后文填写。
      例如记录下地址为：swr.cn-east-3.myhuaweicloud.com/dev-container/spark:3.1.3-obs
      
   
   
   
   
 
#### 配置Spark History Server
1. 修改\~/spark-obs/conf/spark-defaults.conf文件，开启Spark事件日志记录，并配置OBS桶名称及目录。 
   ```
   cat >> ~/spark-obs/conf/spark-defaults.conf <<EOF
   spark.eventLog.enabled=true
   spark.eventLog.dir=obs://{bucket-name}/{log-dir}/
   EOF
   ```
   - spark.eventLog.enabled：设置为true，表示开启Spark事件日志记录。
   
   - spark.eventLog.dir：OBS桶名称及路径，格式为*obs://{bucket-name}/{log-dir}/*，例如obs://spark-sh1/history-obs/。请务必修改OBS桶名称及目录为正确值。
   
   
   
   
2. 修改\~/spark-obs/conf/spark-env.sh文件，如果该文件不存在，使用命令复制模板为文件。 
   ```
   cp ~/spark-obs/conf/spark-env.sh.template ~/spark-obs/conf/spark-env.sh
   cat >> ~/spark-obs/conf/spark-env.sh <<EOF
   SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=obs://{bucket-name}/{log-dir}/"
   EOF
   ```
   此处的OBS地址需要与上一步spark-default.conf中的一致。
   
   
3. 直接启动history server。 
   ```
   start-history-server.sh
   ```
   回显如下：
   ```
   starting org.apache.spark.deploy.history.HistoryServer, logging to /root/spark-obs/logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-spark-sh1.out
   ```
   
   
4. 启动后可以通过节点端口18080访问。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001531028505.png "点击放大")
   如需关闭history server，可执行以下脚本：
   ```
   stop-history-server.sh
   ```
   
   
 
