什么是 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 作业?的主要内容,如果未能解决你的问题,请参考以下文章