在项目中,您可以创建Shell、Hive、Hive SQL、Spark、SparkSQL、Spark Shell、Spark Streaming、MapReduce、Sqoop、Pig 、Flink、Streaming SQL等类型的作业。

新建作业

  1. 通过主账号登录阿里云 E-MapReduce 控制台
  2. 单击上方的数据开发页签,进入项目列表页面。
  3. 单击待编辑项目所在行的作业编辑,进入作业编辑页面。
  4. 在页面左侧,在需要操作的文件夹上单击右键,选择新建作业
  5. 新建作业对话框中,输入作业名称作业描述,选择作业类型

    创建作业时作业类型一经确定,不能修改。

  6. 单击确定
    说明 您还可以通过在文件夹上单击右键,进行新建子文件夹重命名文件夹删除文件夹操作。

开发作业

各类作业的作业内容开发,请参见作业部分。 以下介绍的是作业的基础设置、高级设置和告警设置。
说明 插入OSS路径时,如果选择OSSREF文件前缀,系统会把OSS文件下载到集群本地,并添加到classpath中。
  1. 新建作业完成后,单击页面右上角的作业设置,弹出作业设置页面。
  2. 基础设置页面,设置作业的基础配置项。
    配置项 说明
    失败重试次数 设置在工作流运行到该作业失败时,最大支持重试的次数。
    说明 如果直接在作业页面运行作业,该选项不会生效。
    失败策略 设置在工作流运行到该作业失败时,是继续执行下一个工作流节点还是暂停当前工作流。
    运行资源 添加作业执行所依赖的jar包或UDF等资源。您需要将资源先上传至OSS,然后在运行资源中直接添加即可。
    配置参数 指定作业代码中所引用的变量的值。您可以在代码中引用变量,格式为${变量名}

    单击右侧的加号图标,添加Key和Value。其中,Key为变量名,Value为变量的值。另外,您还可以根据调度启动时间自定义时间变量, 规则如下:

    • yyyy:表示4 位的年份。
    • MM:表示月份。
    • dd:表示天。
    • HH:表示24小时制,12小时制使用hh。
    • mm:表示分钟。
    • ss:表示秒。

    时间变量可以是包含yyyy年份的任意时间组合,同时支持用+和-计算符号来分别表示提前和延后。例如,变量 ${yyyy-MM-dd} 表示当前日期,则:

    • 后1年的表示方式:${yyyy+1y}或者${yyyy-MM-dd hh:mm:ss+1y}
    • 后3月的表示方式:${yyyyMM+3m}或者${hh:mm:ss yyyy-MM-dd+3m}
    • 前5天的表示方式:${yyyyMMdd-5d}或者${hh:mm:ss yyyy-MM-dd-5d}
    注意

    时间变量参数必须以yyyy开始,例如${yyyy-MM}。如果需要单独获取月份等特定时间区域的值,您可在作业内容中使用如下两个函数提取:

    • parseDate(<参数名称>, <时间格式>):将给定参数转换为 Date 对象。其中,参数名称为上述配置参数中设置的一个变量名,时间格式为设置该变量时所使用的时间格式。例如,设置一个变量 current_time = ${yyyyMMddHHmmss-1d},则此处时间格式应设置为 yyyyMMddHHmmss
    • formatDate(<Date对象>, <时间格式>):将给定 Date 对象转换为给定格式的时间字符串。

    函数使用示例:

    • 获取 current_time 变量的小时字面值:${formatDate(parseDate(current_time, 'yyyyMMddHHmmss'), 'HH')}
    • 获取 current_time 变量的年字面值:${formatDate(parseDate(current_time, 'yyyyMMddHHmmss'), 'yyyy')}
  3. 基本设置完成后,单击高级设置,设置作业的高级配置项。
    配置项 说明
    模式 包括以下两种模式:
    • 在 Worker 节点提交:作业通过Launcher在YARN上分配资源进行提交。
    • 在 Header/Gateway 节点提交:作业在分配的机器上直接运行。

    作业提交模式的详细说明请参见作业提交模式说明

    环境变量 添加作业执行的环境变量,也可以在作业脚本中直接export环境变量。
    • 示例一:一个shell类型的任务,内容是echo ${ENV_ABC}。如果此处设置了一个环境变量 ENV_ABC=12345,则echo命令的输出结果为 12345
    • 示例二:一个shell类型的作业,内容是java -jar abc.jar,其中abc.jar的内容是:
      public static void main(String[] args) {System.out.println(System.getEnv("ENV_ABC"));}
      您得到结果是12345。此处环境变量的设置相当于执行了以下脚本:
      export ENV_ABC=12345
      java -jar abc.jar
    调度参数 设置作业运行YARN 队列、内存、虚拟核数、优先级和执行用户等信息。当未设置这些参数时,作业会直接采用Hadoop集群的默认值。
  4. 高级设置完成后,单击告警设置,设置作业的告警配置项。
    配置项 说明
    执行失败 设置作业执行失败时,是否通知到用户告警组或钉钉告警组。
    启动超时 设置作业启动失败时,是否通知到用户告警组或钉钉告警组。

作业提交模式说明

spark-submit 进程(在数据开发模块中为启动器 Launcher)是 Spark 的作业提交命令,用于提交 Spark 作业,一般占用 600 MB 以上内存。作业配置面板中的内存设置,用于设置 Launcher 的内存配额。

新版作业提交模式包括以下两种:
  • 在 Header/Gateway 节点提交:spark-submit 进程运行在 Header 节点上,不受 YARN 监控。spark-submit 内存消耗大,作业过多会造成 Header 节点资源紧张,进而会导致整个集群不稳定。
  • 在 Worker 节点提交: spark-submit 进程运行在 Worker 节点上,占用 YARN 的一个 Container,受 YARN 监控。此模式可缓解 Header 节点的资源使用。

在 E-MapReduce 集群中,作业实例消耗内存 = Launcher 消耗内存 + 用户作业(Job)消耗内存。对于 Spark 作业,Job 消耗内存又可以进一步细分,即 Job 消耗内存 = spark-submit(指逻辑模块,非进程)消耗内存 + driver 端消耗内存 + executor 端消耗内存。作业配置不同,driver 端消耗的物理内存的位置也不同,详细说明如下:

  • 如果 Spark 使用 yarn-client 模式,则 spark-submit + driver 是在同一个进程中。在作业提交中,如果这个进程使用 LOCAL 模式,则这个进程是 Header 节点上的一个进程,不受 YARN 监控。如果这个进程使用 YARN 模式,则这个进程是 Worker 节点上的一个进程,占用 YARN 的一个 Container,受 YARN 监控。
  • 如果 Spark 使用 yarn-cluster 模式,则 driver 是独立的一个进程,占用 YARN 的一个 Container,与 spark-submit 不在一个进程中。

综上所述,作业的提交节点决定了spark-submit 进程是在 Header 节点还是 Worker 节点上运行,以及是否受 YARN 监控。Spark 的 yarn-client 和 yarn-cluster 模式,决定了 driver 是否与 spark-submit 在同一个进程中。

作业执行

作业开发和配置完成后,您可以单击右上角的运行来执行作业。

查看日志

作业运行后,您可以在页面下方的运行记录页面中查看作业的运行日志。单击某次运行记录后面的详情即可跳转至详细日志页面,在详细日志页面可以查看作业的提交日志和 YARN Container 日志。

常见问题

Q:流式作业的日志过多,导致磁盘空间不足。

A:Spark Streaming 等流式作业的场景,建议您开启日志 Rolling,防止因为运行的时间过长而导致日志过大以及磁盘空间不足,具体开启方法如下:
  1. 通过主账号登录阿里云 E-MapReduce 控制台
  2. 单击上方的数据开发页签,进入项目列表页面。
  3. 单击待处理项目所在行的作业编辑,进入作业编辑页面。
  4. 单击页面右上角的作业设置,弹出作业设置页面。
  5. 单击高级设置页签。
  6. 单击 环境变量加号图标,添加以下环境变量。
    FLOW_ENABLE_LOG_ROLLING = true
  7. 完成上述参数配置后,重启作业。
    说明 如果作业日志过多,而您又不想重启作业,则可先通过echo > /path/to/log/dir/stderr 命令清空作业日志。