更新时间:2023-10-27 GMT+08:00

安装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。如环境中未安装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. 下载依赖包。

    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/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,详情请参见访问密钥
    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,可前往地区和终端节点查询。
      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. 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
    3. 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
    4. 登录制作镜像的节点,复制登录指令。
      docker tag [{镜像名称}:{版本名称}] swr.ap-southeast-1.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}
      docker push swr.ap-southeast-1.myhuaweicloud.com/{组织名称}/{镜像名称}:{版本名称}

      记录下镜像的访问地址以供后文填写。

      例如记录下地址为:swr.ap-southeast-1.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访问。

    如需关闭history server,可执行以下脚本:

    stop-history-server.sh