大数据之 Spark 提交作业的方法

Apache Spark 提交作业可以通过命令行或通过编程方式进行。以下分别是两种方式的基本步骤:

1. 命令行提交(Spark Submit)

在集群模式下,你通常会在安装了Spark和Hadoop环境的服务器上运行spark-submit命令来提交作业。

./bin/spark-submit \
--class <你的主类名> \
--master <集群模式> \
--deploy-mode <部署模式(client 或 cluster)> \
--executor-memory <executor内存大小> \
--num-executors <executor数量> \
--conf <自定义配置项> \
<你的应用jar包路径> \
[应用参数]

例如:

./bin/spark-submit \
--class com.example.MainClass \
--master yarn \
--deploy-mode cluster \
--executor-memory 4g \
--num-executors 5 \
--conf spark.yarn.jar=hdfs:///path/to/your/jarfile.jar \
hdfs:///path/to/your/application.jar \
arg1 arg2 arg3

2. 编程方式提交(使用SparkContext或SparkSession)

如果你在本地开发或者希望在代码中直接创建SparkContext并提交任务,可以使用Java、Scala或Python API:

Scala示例:

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object Main {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("MyApp").setMaster("local[*]")
    val spark = SparkSession.builder.config(conf).getOrCreate()

    // 你的Spark作业代码
    val df = spark.read.parquet("mydata.parquet")
    df.show()

    spark.stop() // 在程序结束时关闭SparkSession
  }
}

然后,你可以编译这个 Scala 应用,并生成一个 JAR 包,之后通过 spark-submit 命令提交到集群。

Python示例:

from pyspark.sql import SparkSession

def main():
    spark = SparkSession.builder.appName('MyApp').master('local[*]').getOrCreate()

    # 你的Spark作业代码
    df = spark.read.parquet('mydata.parquet')
    df.show()

    spark.stop()  # 在程序结束时关闭SparkSession

if __name__ == "__main__":
    main()

对于Python应用,可以直接运行脚本或者打包成zip文件后通过spark-submit提交到集群。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【容器系统】之⼤数据容器化-基于Kubernetes构建现代⼤数据系统 Apache Spark 在⼤数据处理与分析领域,Apache Spark⽆疑占据着重要地位。它的特点是基于内存计算,⽀持各类资源管理平台,其中以YARN最为常 见,同时⼜与Hadoop平台集成,在集群节点以HDFS作为分布式⽂件存储系统。 我们可以先看⼀下搭建⼀个常见的Apache Spark⼤数据平台需要哪些步骤: 1.安装Hadoop集群 2.配置HDFS 3.配置YARN 4.安装Spark 5.配置Spark与YARN集成 事实上如果参阅官⽅⽂档,还有更多细节检查与配置,有过⼤数据相关领域从业经验的⼈都知道,要搭建⼀套可⽤的⼤数据环境并不容易, 再加上后期维护,就更吃⼒了,⽽⼀套稳定的⼤数据平台正是进⾏⼤数据应⽤开发的基础。根据笔者了解,有不少公司正是因为⼤数据平台 搭建及配置的复杂性等原因,不得不在多个测试环境中,共⽤⼀套⼤数据平台,这种⽅式长期看维护成本较⾼,也可能存在安全隐患。 ⼤数据领域需要⼀些变化,⽽Kubernetes的出现则提供了契机。 Kubernete(以下简称k8s)是容器集群管理系统,是⼀个开源的平台,可以实现容器集群的⾃动化部署、⾃动扩缩容、维护等功能。通过 Kubernetes你可以: · 快速部署应⽤ · 快速扩展应⽤ · ⽆缝对接新的应⽤功能 · 节省资源,优化硬件资源的使⽤ ⼤数据社区 随着K8s社区的发展壮⼤,微服务及容器化被越来越多的公司应⽤到⽣产环境。与此同时,K8s也成为容器编排的⾸选平台。⼤数据社区在 容器化进程中当然也是不⽢落后的。 Spark⾃2.3开始官⽅⽀持K8sFlink⾃1.9开始官⽅⽀持K8sHue官⽅Helm chart包Hive以MR3为执⾏引擎⽀持K8sAirflow⾃1.10开始⽀ 持K8sPresto⽀持K8s…… 可以看到整个⼤数据社区也在积极⽀持容器化,但⼤数据的容器化并不是⽣硬地将各个组件搬到K8s上,以Spark on YARN为例,核⼼组 件YARN作为资源调度器,其结构如下图所⽰ 下图讲述了Apache Spark on YARN的⼯作⽅式: YARN ResourceManager的功能为: 负责集群中所有资源的统⼀管理和分配,它接收来⾃各个节点(NodeManager)的资源汇报信息,并把这些信息按照⼀定的策略分配给各 个应⽤程序 了解K8s的同学可以看出YARN的功能其实与K8s Scheduler的功能⾮常类似 Kubernetes 调度器是⼀个策略丰富、拓扑感知、⼯作负载特定的功能,调度器显著影响可⽤性、性能和容量。调度器需要考虑个⼈和集体 的资源要求、服务质量要求、硬件/软件/政策约束、亲和⼒和反亲和⼒规范、数据局部性、负载间⼲扰、完成期限等。 所以与其将YARN⽣搬到K8s中(早期确实是这样做的),何不⽤K8s调度器替换掉YARN,使得Spark适应K8s呢? 事实上社区确实是在 这个⽅向努⼒尝试,并且⾃Spark 2.3开始,实验性⽀持使⽤K8s原⽣Scheduler替代YARN。 spark on k8s: 在该⽅案中 1.客户端通过 spark-submit 将任务提交到K8s集群中,并在集群中启动⼀个Spark Driver Pod; 2.Spark Driver启动相应的Executor Pod, 组成⼀个Spark Application集群并执⾏作业任务; 3.任务执⾏完成后,Executor Pod会被销毁, ⽽Driver Pod会持久化相关⽇志,并保持在'completed'状态,直到⽤户⼿清理或被K8s集群的 垃圾回收机制回收. Spark原⽣⽀持K8s的好处也是很明显的:可以更好的利⽤K8s的集群资源,通过K8s赋能,更好的进⾏资源的隔离。这个⽅案不太友好的 地⽅在于: spark-submit 在K8s集群之外,使⽤⾮声明式的提交接⼝,实际使⽤起来不够友好。 将Spark应⽤迁移到K8s环境中 Spark Operator是Google基于Operator模式开发的⼀款的⼯具, ⽤于通过声明式的⽅式向K8s集群提交Spark作业,并且负责管理Spark 任务在K8s中的整个⽣命周期,其⼯作模式如下 我们可通过Hem安装 spark-operator $ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator $ helm install incubator/sparkoperator --namespace spark-operator 创建服务⽤户及绑定权限 $ kubectl create serviceaccount
⼤数据平台架构 前⾯提到各种⼤数据技术的原理与架构,⼤数据计算通过将可执⾏的代码分发到⼤规模的服务器集群上进⾏分布式计算,以处理⼤规模的数 据,即所谓的移动计算⽐移动数据更划算。但是这样的计算⽅式必然不会很快,即使⼀个规模不太⼤的数据集上的⼀次简单计 算,MapReduce也可能需要⼏分钟,Spark快⼀点,也⾄少需要数秒的时间。 ⽽⽹站处理⽤户请求,需要毫秒级的响应,也就是说,要在1秒内完成计算,⼤数据计算必然不能实现这样的响应要求。但是⽹站应⽤⼜需 要使⽤⼤数据实现统计分析、数据挖掘、关联推荐、⽤户画像等⼀系列功能。 所以⽹站需要构建⼀个⼤数据平台,去整合⽹站应⽤和⼤数据系统之间的差异,将应⽤程序产⽣的数据导⼊到⼤数据系统,经过处理计算后 再导出给应⽤程序使⽤。⼀个典型的⽹站⼤数据平台架构如下图: ⼤数据平台可分为三个部分 数据采集 将应⽤程序产⽣的数据和⽇志等同步到⼤数据系统中,由于数据源不同,这⾥的数据同步系统实际上是多个相关系统的组合。数据库同步通 常⽤Sqoop,⽇志同步可以选择Flume,打点采集的数据经过格式化转换后通过Kafka传递。 不同的数据源产⽣的数据质量可能差别很⼤,数据库中的数据也许可以直接导⼊⼤数据系统就可以,⽽⽇志和爬⾍产⽣的数据就需要进⾏⼤ 量的清洗、转化处理才能有效使⽤。所以数据同步系统实际上承担着传统数据仓库ETL的⼯作。 数据处理 这⾥是⼤数据存储与计算的核⼼,数据同步系统导⼊的数据存储在HDFS。MapReduce、Hive、Spark等计算任务读取HDFS上的数据进 ⾏计算,再将计算结果写⼊HDFS。 MapReduce、Hive、Spark等进⾏的计算处理被称作是离线计算,HDFS存储的数据被称为离线数据。相对的,⽤户实时请求需要计算的 数据称为在线数据,这些数据由⽤户实时产⽣,进⾏实时在线计算,并把结果数据实时返回⽤户,这个计算过程中涉及的数据主要是⽤户⾃ ⼰⼀次请求产⽣和需要的数据,数据规模⾮常⼩,内存中⼀个线程上下⽂就可以处理。 在线数据完成和⽤户的交互后,被数据同步系统导⼊到⼤数据系统,这些数据就是离线数据,其上进⾏的计算通常针对(某⼀⽅⾯的)全体 数据,⽐如针对所有订单进⾏商品的关联性挖掘,这时候数据规模⾮常⼤,需要较长的运⾏时间,这类计算就是离线计算。 除了离线计算,还有⼀些场景,数据规模也⽐较⼤,要求的处理时间也⽐较短。⽐如淘宝要统计每秒产⽣的订单数,以便进⾏监控和宣传。 这种场景被称为⼤数据流式计算,通常⽤Storm、Spark Steaming等流式⼤数据引擎来完成,可以在秒级甚⾄毫秒级时间内完成计算。 数据输出与展⽰ ⼤数据计算产⽣的数据还是写⼊到HDFS中,应⽤程序不可能到HDFS中读取数据,所以必须要将HDFS中的数据导出到数据库中。数据同 步导出相对⽐较容易,计算产⽣的数据都⽐较规范,稍作处理就可以⽤Sqoop之类的系统导出到数据库。 这时,应⽤程序就可以直接访问数据库中的数据,实时展⽰给⽤户,⽐如展⽰给⽤户的关联推荐的商品。淘宝卖家的量⼦魔⽅之类的产品, 其数据都来⾃⼤数据计算产⽣。 除了给⽤户访问提供数据,⼤数据还需要给运营和决策层提供各种统计报告,这些数据也写⼊数据库,被相应的后台系统访问。很多运营和 管理⼈员,每天⼀上班,就是登录后台数据系统,查看前⼀天的数据报表,看业务是否正常。如果数据正常甚⾄上升,就可以稍微轻松⼀ 点,如果数据下跌,焦躁⽽忙碌的⼀天也马上就开始了。 将上⾯三个部分整合起来的是任务调度管理系统,不同的数据何时开始同步,各种MapReduce、Spark任务如何合理调度才能使资源利⽤ 最合理、等待的时间⼜不⾄于太久,临时的重要任务能够尽快执⾏,这些都需要任务调度管理系统完成。有时候对分析师和⼯程师开放的作 业提交、进度跟踪,数据查看等功能也集成在这个系统中。 对于每个公司的⼤数据团队,最核⼼开发维护的也就是这个系统,⼤数据平台上的其他系统⼀般都有成熟的开源软件可以选择,作业调度管 理会涉及很多个性化的需求,通常需要团队⾃⼰开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值