更新时间:2024-09-19 GMT+08:00

使用Livy提交Spark Jar作业

DLI Livy简介

DLI Livy是基于开源的Apache Livy用于提交Spark作业到DLI的客户端工具。

准备工作

  • 创建DLI队列。在“队列类型”中选择“通用队列”,即Spark作业的计算资源。具体请参考创建队列
  • 准备一个linux弹性云服务器ECS,用于安装DLI Livy。
    • ECS需要放通30000至32767端口、8998端口。具体操作请参考添加安全组规则
    • ECS需安装Java JDK,JDK版本建议为1.8。配置Java环境变量JAVA_HOME。
    • 查询弹性云服务器ECS详细信息,获取ECS的“私有IP地址”。
  • 使用增强型跨源连接打通DLI队列和Livy实例所在的VPC网络。具体操作可以参考增强型跨源连接

DLI Livy工具下载及安装

本次操作下载的DLI Livy版本为apache-livy-0.7.2.0107-bin.tar.gz,后续版本变化请根据实际情况修改。

  1. 单击下载链接,获取DLI Livy工具压缩包。
  2. 使用WinSCP工具,将获取的工具压缩包上传到准备好的ECS服务器目录下。
  3. 使用root用户登录ECS服务器,执行以下命令安装DLI Livy工具。

    1. 执行以下命令创建工具安装路径。

      mkdir livy安装路径

      例如新建路径/opt/livy:mkdir /opt/livy。后续操作步骤均默认以/opt/livy安装路径演示,请根据实际情况修改。

    2. 解压工具压缩包到安装路径。

      tar --extract --file apache-livy-0.7.2.0107-bin.tar.gz --directory /opt/livy --strip-components 1 --no-same-owner

    3. 执行以下命令修改配置文件名称。

      cd /opt/livy/conf

      mv livy-client.conf.template livy-client.conf

      mv livy.conf.template livy.conf

      mv livy-env.sh.template livy-env.sh

      mv log4j.properties.template log4j.properties

      mv spark-blacklist.conf.template spark-blacklist.conf

      touch spark-defaults.conf

修改DLI Livy工具配置文件

  1. 上传指定的DLI Livy工具jar资源包到OBS桶路径下。

    1. 登录OBS控制台,在指定的OBS桶下创建一个存放Livy工具jar包的资源目录。例如:“obs://bucket/livy/jars/”。
    2. 进入3.a中DLI Livy工具所在ECS服务器的安装目录,获取以下jar包,将获取的jar包上传到1.a创建的OBS桶资源目录下。
      例如,当前Livy工具安装路径为“/opt/livy”,则当前需要上传的jar包名称如下:
      /opt/livy/rsc-jars/livy-api-0.7.2.0107.jar
      /opt/livy/rsc-jars/livy-rsc-0.7.2.0107.jar
      /opt/livy/repl_2.11-jars/livy-core_2.11-0.7.2.0107.jar
      /opt/livy/repl_2.11-jars/livy-repl_2.11-0.7.2.0107.jar

  2. 修改DLI Livy工具配置文件。

    1. 编辑修改配置文件“ /opt/livy/conf/livy-client.conf”。

      vi /opt/livy/conf/livy-client.conf

      添加如下内容,并根据注释修改配置项。
      #当前ECS的私有IP地址,也可以使用ifconfig命令查询。
      livy.rsc.launcher.address = X.X.X.X
      #当前ECS服务器放通的端口号
      livy.rsc.launcher.port.range = 30000~32767
    2. 编辑修改配置文件“ /opt/livy/conf/livy.conf”。

      vi /opt/livy/conf/livy.conf

      添加如下内容。根据注释说明修改具体的配置项。
      livy.server.port = 8998
      livy.spark.master = yarn
       
      livy.server.contextLauncher.custom.class=org.apache.livy.rsc.DliContextLauncher
      livy.server.batch.custom.class=org.apache.livy.server.batch.DliBatchSession
      livy.server.interactive.custom.class=org.apache.livy.server.interactive.DliInteractiveSession
      livy.server.sparkApp.custom.class=org.apache.livy.utils.SparkDliApp
       
      livy.server.recovery.mode = recovery
      livy.server.recovery.state-store = filesystem
      #以下文件路径请根据情况修改
      livy.server.recovery.state-store.url = file:///opt/livy/store/
       
      livy.server.session.timeout-check = true
      livy.server.session.timeout = 1800s
      livy.server.session.state-retain.sec = 1800s
       
      livy.dli.spark.version = 2.3.2
      livy.dli.spark.scala-version = 2.11
       
      # 填入存储livy jar包资源的OBS桶路径。
      livy.repl.jars = obs://bucket/livy/jars/livy-core_2.11-0.7.2.0107.jar, obs://bucket/livy/jars/livy-repl_2.11-0.7.2.0107.jar
      livy.rsc.jars = obs://bucket/livy/jars/livy-api-0.7.2.0107.jar, obs://bucket/livy/jars/livy-rsc-0.7.2.0107.jar
    3. 编辑修改配置文件“/opt/livy/conf/spark-defaults.conf”。

      vi /opt/livy/conf/spark-defaults.conf

      添加如下必选参数内容。配置项参数填写说明,详见表1

      # 以下参数均支持在提交作业时覆盖。
      spark.yarn.isPython=true
      spark.pyspark.python=python3
       
      # 当前参数值为生产环境web地址
      spark.dli.user.uiBaseAddress=https://console.huaweicloud.com/dli/web
      # 队列所在的region。
      spark.dli.user.regionName=XXXX
       
      # dli endpoint 地址。
      spark.dli.user.dliEndPoint=XXXX
       
      # 用于指定队列,填写已创建DLI的队列名。
      spark.dli.user.queueName=XXXX
       
      # 提交作业使用的access key。
      spark.dli.user.access.key=XXXX
      # 提交作业使用的secret key。
      spark.dli.user.secret.key=XXXX
       
      # 提交作业使用的projectId。
      spark.dli.user.projectId=XXXX
      表1 spark-defaults.conf必选参数说明

      参数名

      参数填写说明

      spark.dli.user.regionName

      DLI队列所在的区域名。

      地区和终端节点获取,对应“区域”列就是regionName。

      spark.dli.user.dliEndPoint

      DLI队列所在的终端节点。

      地区和终端节点获取,对应的“终端节点(Endpoint)”就是该参数取值。

      spark.dli.user.queueName

      DLI队列名称。

      spark.dli.user.access.key

      对应用户的访问密钥。该用户需要有Spark作业相关权限,权限说明详见权限管理

      密钥获取方式请参考获取AK/SK

      spark.dli.user.secret.key

      spark.dli.user.projectId

      参考获取项目ID获取项目ID。

      以下参数为可选参数,请根据参数说明和实际情况配置。详细参数说明请参考Spark Configuration

      表2 spark-defaults.conf可选参数说明

      Spark作业参数

      对应Spark批处理参数

      备注

      spark.dli.user.file

      file

      如果是对接notebook工具场景时不需要设置。

      spark.dli.user.className

      class_name

      如果是对接notebook工具场景时不需要设置。

      spark.dli.user.scType

      sc_type

      推荐使用livy原生配置。

      spark.dli.user.args

      args

      推荐使用livy原生配置。

      spark.submit.pyFiles

      python_files

      推荐使用livy原生配置。

      spark.files

      files

      推荐使用livy原生配置。

      spark.dli.user.modules

      modules

      -

      spark.dli.user.image

      image

      提交作业使用的自定义镜像,仅容器集群支持该参数,默认不设置。

      spark.dli.user.autoRecovery

      auto_recovery

      -

      spark.dli.user.maxRetryTimes

      max_retry_times

      -

      spark.dli.user.catalogName

      catalog_name

      访问元数据时,需要将该参数配置为dli。

启动DLI Livy工具

  1. 进入到工具安装目录。

    例如:cd /opt/livy

  2. 执行以下命令启动DLI Livy。

    ./bin/livy-server start

通过DLI Livy工具提交Spark作业到DLI

本示例演示通过curl命令使用DLI Livy工具将Spark作业提交到DLI。

  1. 将开发好的Spark作业程序jar包上传到OBS路径下。

    例如,本示例上传“spark-examples_2.11-XXXX.jar”到“obs://bucket/path”路径下。

  2. 以root用户登录到安装DLI Livy工具的ECS服务器。
  3. 执行curl命令通过DLI Livy工具提交Spark作业请求到DLI。

    ECS_IP为当前安装DLI Livy工具所在的弹性云服务器的私有IP地址。

    curl --location --request POST 'http://ECS_IP:8998/batches' \
    --header 'Content-Type: application/json' \
    --data '{
        "driverMemory": "3G",
        "driverCores": 1,
        "executorMemory": "2G",
        "executorCores": 1,
        "numExecutors": 1,
        "args": [
            "1000"
        ],
        "file": "obs://bucket/path/spark-examples_2.11-XXXX.jar",
        "className": "org.apache.spark.examples.SparkPi",
        "conf": {
            "spark.dynamicAllocation.minExecutors": 1,
            "spark.executor.instances": 1,
            "spark.dynamicAllocation.initialExecutors": 1,
            "spark.dynamicAllocation.maxExecutors": 2
        }
    }'