什么是 Spark 作业?

Posted

技术标签:

【中文标题】什么是 Spark 作业?【英文标题】:What is Spark Job ? 【发布时间】:2015-05-12 10:41:19 【问题描述】:

我已经完成了 spark 的安装并执行了一些设置主节点和工作节点的测试用例。也就是说,我对 Spark 上下文(而不是 SparkContext)中的工作到底意味着什么感到非常困惑。我有以下问题

工作与驱动程序有何不同。 应用程序本身是驱动程序的一部分吗? Spark 提交在某种程度上是一项工作?

我阅读了Spark documention,但我仍然不清楚这件事。

话虽如此,我的实现是以编程方式编写火花作业,这将提交给火花。

如果可能,请提供一些示例。这会很有帮助。

注意:请不要发布火花链接,因为我已经尝试过了。尽管这些问题听起来很幼稚,但我仍然需要更清楚地理解。

【问题讨论】:

【参考方案1】:

嘿,这是我以前做过的事情,希望对你有用:

#!/bin/bash
# Hadoop and Server Variables
HADOOP="hadoop fs"
HDFS_HOME="hdfs://ha-edge-group/user/max"
LOCAL_HOME="/home/max"

# Cluster Variables
DRIVER_MEM="10G"
EXECUTOR_MEM="10G"
CORES="5"
EXECUTORS="15"

# Script Arguments
SCRIPT="availability_report.py" # Arg[0]
APPNAME="Availability Report" # arg[1]

DAY=`date -d yesterday +%Y%m%d`

for HOUR in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
        #local directory to getmerge to
        LOCAL_OUTFILE="$LOCAL_HOME/availability_report/data/$DAY/$HOUR.txt"

        # Script arguments
        HDFS_SOURCE="webhdfs://1.2.3.4:0000/data/lbs_ndc/raw_$DAY'_'$HOUR" # arg[2]
        HDFS_CELLS="webhdfs://1.2.3.4:0000/data/cells/CELLID_$DAY.txt" # arg[3]
        HDFS_OUT_DIR="$HDFS_HOME/availability/$DAY/$HOUR" # arg[4]

        spark-submit \
        --master yarn-cluster \
        --driver-memory $DRIVER_MEM \
        --executor-memory $EXECUTOR_MEM \
        --executor-cores $CORES \
        --num-executors $EXECUTORS \
        --conf spark.scheduler.mode=FAIR \
        $SCRIPT $APPNAME $HDFS_SOURCE $HDFS_CELLS $HDFS_OUT_DIR

        $HADOOP -getmerge $HDFS_OUT_DIR $LOCAL_OUTFILE
done

【讨论】:

【参考方案2】:

好吧,术语总是很困难,因为它取决于上下文。在许多情况下,您可以习惯于“向集群提交作业”,这对于 spark 来说就是提交驱动程序。

也就是说,Spark 对“工作”有自己的定义,直接来自词汇表:

Job 由多个任务组成的并行计算 为响应 Spark 操作(例如保存、收集)而生成;你会看到的 驱动程序日志中使用的这个术语。

所以在这种情况下,假设您需要执行以下操作:

    将包含人员姓名和地址的文件加载到 RDD1 中 将包含人名和电话的文件加载到 RDD2 中 通过名字连接RDD1和RDD2,得到RDD3 在 RDD3 上映射,为每个人获得一张漂亮的 html 演示卡,作为 RDD4 将 RDD4 保存到文件中。 映射RDD1,从地址中提取邮政编码得到RDD5 在 RDD5 上进行聚合,以计算每个邮政编码上有多少人居住在 RDD6 上 收集 RDD6 并将这些统计信息打印到标准输出。

所以,

    驱动程序就是这段完整的代码,运行所有 8 个步骤。 在步骤 5 中生成整个 HTML 卡片集是一个作业(很清楚,因为我们使用的是 save 操作,而不是转换) .与第 8 步中的 collect 相同 其他步骤将被组织成阶段,每个作业都是一系列阶段的结果。对于简单的事情,一个作业可以有一个阶段,但是需要重新分区数据(例如,步骤 3 中的连接)或任何破坏数据局部性的事情通常会导致出现更多阶段。您可以将阶段视为产生中间结果的计算,实际上可以持久化。例如,我们可以持久化 RDD1,因为我们会多次使用它,避免重新计算。 以上所有 3 个基本上都在讨论如何破坏给定算法的 逻辑。相比之下,任务是特定的数据片段,它将在给定的执行者上经历给定的阶段。

希望它能让事情更清楚;-)

【讨论】:

现在对我来说很清楚 :) 但是我对如何编写作业调度有疑问。我已阅读文档但无法了解代码。 嗯,这在很大程度上取决于您拥有的基础架构类型(例如,您是否在 Yarn 上使用 Spark?)不是我的强项,但原则上,我从 Bash 脚本启动所有驱动程序(为了记住参数,创建输出文件夹等)。恕我直言,任何能够运行控制台命令的正常调度工具都应该可以工作。如果每个作业都使用集群中的所有资源,那么您只需提交程序,它们就会等待资源被释放。 @DanielLangdon step 1,将文件加载到 RDDq 也是一项工作?? @akashpatel 不,不是。作业是指 Spark 操作(例如保存、收集)以及需要运行以评估该操作的任何任务

以上是关于什么是 Spark 作业?的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL 作业的 Spark 修复任务号

实时监控 Spark 作业

为啥 Spark 作业失败并显示“退出代码:52”

如何在特定节点上运行 Spark 作业

提交火花作业时获取 java.lang.NoSuchMethodError

为啥 spark 作业服务器中不支持带有 namedObject 的 sparkSession?