什么是星火作业?
What is Spark Job ?
我已经完成了 spark 安装并执行了几个设置主节点和工作节点的测试用例。也就是说,我对 Spark 上下文(而不是 SparkContext)中的工作到底意味着什么非常困惑。我有以下问题
- 作业与驱动程序有何不同。
- 应用程序本身是驱动程序的一部分?
- Spark 提交在某种程度上是一份工作?
我读了Spark documention,但我还是不太清楚。
话虽如此,我的实现是{以编程方式}编写 spark 作业,这将是一个 spark-submit。
如果可能,请提供一些示例。这将非常有帮助。
注意: 请不要post 触发链接,因为我已经试过了。尽管这些问题听起来很幼稚,但我仍然需要更清楚地理解。
好吧,术语总是很困难,因为它取决于上下文。很多时候,你可以习惯"submit a job to a cluster",对于spark来说就是提交一个驱动程序。
也就是说,Spark 对 "job" 有自己的定义,直接来自词汇表:
Job A parallel computation consisting of multiple tasks that gets
spawned in response to a Spark action (e.g. save, collect); you'll see
this term used in the driver's logs.
在这种情况下,假设您需要执行以下操作:
- 将包含人名和地址的文件加载到 RDD1
- 将包含人名和电话的文件加载到 RDD2
- 通过名称连接RDD1和RDD2,得到RDD3
- 在 RDD3 上映射,为每个人作为 RDD4
获得一张漂亮的 HTML 展示卡
- 将 RDD4 保存到文件。
- 映射 RDD1 以从地址中提取邮政编码以获得 RDD5
- 在 RDD5 上聚合以计算每个邮政编码上有多少人生活在 RDD6
- 收集 RDD6 并将这些统计信息打印到标准输出。
所以,
- 驱动程序就是整段代码,运行全部8个步骤。
- 在第 5 步制作整个 HTML 卡组是一个 工作 (很清楚,因为我们使用 保存 动作,不是转换)。与步骤 8collect 相同
- 其他步骤将组织成 阶段,每个作业都是一系列阶段的结果。对于简单的事情,作业可以有一个阶段,但需要重新分区数据(例如,步骤 3 中的连接)或任何破坏数据局部性的事情通常会导致出现更多阶段。您可以将阶段视为产生中间结果的计算,这些结果实际上可以持久化。例如,我们可以持久化 RDD1,因为我们将多次使用它,避免重新计算。
- 以上所有 3 个基本上都在谈论如何打破给定算法的 逻辑。相比之下,任务是特定的数据,它将经历给定的阶段,在给定的执行者。
希望它能让事情更清楚;-)
嘿,这是我以前做过的,希望对你有用:
#!/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
我已经完成了 spark 安装并执行了几个设置主节点和工作节点的测试用例。也就是说,我对 Spark 上下文(而不是 SparkContext)中的工作到底意味着什么非常困惑。我有以下问题
- 作业与驱动程序有何不同。
- 应用程序本身是驱动程序的一部分?
- Spark 提交在某种程度上是一份工作?
我读了Spark documention,但我还是不太清楚。
话虽如此,我的实现是{以编程方式}编写 spark 作业,这将是一个 spark-submit。
如果可能,请提供一些示例。这将非常有帮助。
注意: 请不要post 触发链接,因为我已经试过了。尽管这些问题听起来很幼稚,但我仍然需要更清楚地理解。
好吧,术语总是很困难,因为它取决于上下文。很多时候,你可以习惯"submit a job to a cluster",对于spark来说就是提交一个驱动程序。
也就是说,Spark 对 "job" 有自己的定义,直接来自词汇表:
Job A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you'll see this term used in the driver's logs.
在这种情况下,假设您需要执行以下操作:
- 将包含人名和地址的文件加载到 RDD1
- 将包含人名和电话的文件加载到 RDD2
- 通过名称连接RDD1和RDD2,得到RDD3
- 在 RDD3 上映射,为每个人作为 RDD4 获得一张漂亮的 HTML 展示卡
- 将 RDD4 保存到文件。
- 映射 RDD1 以从地址中提取邮政编码以获得 RDD5
- 在 RDD5 上聚合以计算每个邮政编码上有多少人生活在 RDD6
- 收集 RDD6 并将这些统计信息打印到标准输出。
所以,
- 驱动程序就是整段代码,运行全部8个步骤。
- 在第 5 步制作整个 HTML 卡组是一个 工作 (很清楚,因为我们使用 保存 动作,不是转换)。与步骤 8collect 相同
- 其他步骤将组织成 阶段,每个作业都是一系列阶段的结果。对于简单的事情,作业可以有一个阶段,但需要重新分区数据(例如,步骤 3 中的连接)或任何破坏数据局部性的事情通常会导致出现更多阶段。您可以将阶段视为产生中间结果的计算,这些结果实际上可以持久化。例如,我们可以持久化 RDD1,因为我们将多次使用它,避免重新计算。
- 以上所有 3 个基本上都在谈论如何打破给定算法的 逻辑。相比之下,任务是特定的数据,它将经历给定的阶段,在给定的执行者。
希望它能让事情更清楚;-)
嘿,这是我以前做过的,希望对你有用:
#!/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