c语言sscanf函数的用法是什么
286
2022-11-29
spark学习
一、spark学习
Spark 现在已经广泛使用在各个企业中,常见的应用模式有两种,分别是独立集群模式,以及与 Yarn 整合使用模式,下面分别介绍这两种模式的使用。
一)spark集群运行架构
从集群部署的角度看,Spark 集群由集群管理器(Cluster Manager)、工作节点(Worker)、执行器(Executor)、驱动器(Driver)、应用程序(Application)等部分组成,其整体关系如下图所示:
分布式计算框架和分布式存储框架是大数据分析的两大基石。这就是MapReduce和Hadoop成功的原因。
当前流行的分布式编程模型的数据流是从分布式存储到分布式存储。例如MapReduce
1、Cluster Manager
Spark 的集群管理器,主要负责整个集群资源的分配与管理。Cluster Manager 在 Yarn 部署模式下为 ResourceManager;在 Mesos 部署模式下为 Mesos Master;在 Standalone 部署模式下为 Master。Cluster Manager 分配的资源属于一级分配,它将各个 Worker 上的内存、CPU 等资源分配给 Application,但是并不负责对 Executor 的资源分配。Standalone 部署模式下的 Master 会直接给 Application 分配内存、CPU 及 Executor 等资源。目前,Standalone、Yarn、Mesos、EC2 等都可以作为 Spark 的集群管理器。
2、worker
Worker 是 Spark 的工作节点,在 Yarn 部署模式下实际由 NodeManager 替代。Worker 节点主要负责以下工作:
将自己的内存、CPU 等资源通过注册机制告知 Cluster Manager;创建 Executor,将资源和任务进一步分配给 Executor;同步资源信息、Executor 状态信息给 Cluster Manager。
在独立部署模式下,Master 将 Worker 上的内存、CPU 及 Executor 等资源分配给 Application 后,将命令 Worker 启动 CoarseGrainedExecutorBackend 进程(此进程会创建 Executor 实例)。
3、Executor
Executor 是 Spark 任务(Task)的执行单元,运行在 worker 上,实际上它是一组计算资源(CPU 核心、Memory)的集合。一个 Worker 上的 Memory、CPU 由多个 Executor 共同分摊。同时,Executor 还负责与 Worker、Driver 的信息同步。其实这个 Executor 跟 Yarn 资源管理器中的 Container 实现的功能类似。
4、Driver
Driver 可以理解为 Application 的驱动程序,Application 通过 Driver 与 Cluster Manager、Executor 进行通信。Driver 可以运行在 Application 中,也可以由 Application 提交给 Cluster Manager,并由 Cluster Manager 安排在 Worker 中运行。
5、Application
用户使用 Spark 提供的 API 编写的应用程序,Application 通过 Spark API 将进行 RDD 的转换和 DAG 的构建,并通过 Driver 将 Application 注册到 Cluster Manager。Cluster Manager 将会根据 Application 的资源需求,通过一级分配将 Executor、内存、CPU 等资源分配给 Application。Driver 通过二级分配将 Executor 等资源分配给每一个任务,Application 最后通过 Driver 告诉 Executor 运行任务。
二)spark-shell、SparkSQL 与 Spark-Submit 的使用
1、SparkSql与Hive整合
Spark 集群搭建起来后,如何提交任务到 Spark 上呢,这就是接下来要介绍的内容,执行 Spark 任务常见的有 spark-shell、SparkSQL 与 Spark-Submit 几种方式,下面分别进行介绍。
Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了一个编程抽象作为分布式 SQL 的查询引擎,Spark SQL 跟 Hive 有点类似,但比 Hive 查询性能高很多。因此,在实际的应用中,如果你已经在使用 Hive,那么 Spark SQL 可以通过 Hive metastore 获取 Hive 表的元数据。
当然,Spark SQL 自己也可创建元数据库,并不一定要依赖 Hive 的元数据库,但在具体使用中,我们一般是维护一份元数据,因此,可以让 Spark SQL 共享 Hive 的元数据,如果仅仅是执行查询,那么只需要连接到 Hive 元数据库即可,不需要启动 Hiveserver2 服务。但是如果要像 Hive 一样持久化文件与表的关系,就要使用 Hiveserver2 服务。
要实现 Spark SQL 访问 Hive 元数据,需要执行两个步骤的操作,第一步是将 Hive 安装包中 conf/hive-site.xml 配置文件复制到 Spark 安装包的 conf 目录下;第二步是将 Hive 中连接MySQL 的驱动 jar 包复制到 Spark 安装目录下的 jars 目录下。
执行完成上面两个步骤,即可启动 spark-sql 了,下面这段代码展示了它的操作过程:
[hadoop@slave002 ~]$ spark-sql --master spark://nnmaster.cloud:7077
spark-sql> select count(1) FROM test_table_002;
正常情况下,应该很快得到查询结果。
Spark SQL 模式提交 Spark 任务一般用于测试、开发等临时应用的交互场景。
2、 spark-shell
Spark 的 shell 作为一个强大的交互式数据分析工具,提供了一个简单的方式学习 API。它可以使用 Scala 或 Python,使用 spark-shell 的两种模式,分别是本地模式和集群模式,先看本地模式的使用方法
[hadoop@slave002 ~]$ spark-shell --master localscala> val textFile = sc.textFile( "file:///home/hadoop/weblog010" )scala> textFile.count()res0: Long = 140207
注意:file:///home/hadoop/weblog010,首部的 file 代表本地目录,注意 file: 后有三个斜杠 (/)。 要使用本地文件,spark-shell 必须运行在本地模式下。如果运行在本地模式下,就不会在 Master 的 8080 页面显示 Application 运行状态。
接着,使用集群模式启动 spark-shell,执行如下命令:
[hadoop@SparkWorker2 jars]$ spark-shell --master spark://nnmaster.cloud:7077Spark context available as 'sc' (master = spark://nnmaster.cloud:7077, app id = app-20200601175518-0009).Spark session available as 'spark'.scala> val textFile = sc.textFile("/logs/weblog003")scala> textFile.count()res0: Long = 140741scala> textFile.first()res1: String = # Apache Spark
这里的路径:/logs/weblog003 是 HDFS 文件系统的路径。其中,count 代表 RDD 中的总数据条数;first 代表 RDD 中的第一行数据。
从上面的 spark-shell 输出,可以看出此任务的 APP id = app-20200601175518-0009,打开 Spark 的 8080 状态界面,可以发现一个 app-20200601175518-0009 正在运行。
还有下面的用法,这是对指定的一个目录进行统计分析:
scala> val textFile = sc.textFile(“/logs/web*")scala> textFile.count()res1: Long = 212674560
spark-shell 跟 spark-sql 类似,主要用于做交互式分析,生产环境一般不使用这种方式。
3、Spark-Submit
Spark-Submit 用来提交在 IDEA 中编写并且打包成 jar 的包到集群中运行。一般在生产环境使用这种方式。下面是一个 Spark 自带的例子:
[hadoop@slave002 jars]$ spark-submit --executor-memory 5g --total-executor-cores 10 --class org.apache.spark.examples.SparkPi --master spark://nnmaster.cloud:7077 /opt/bigdata/spark/current/examples/jars /spark-examples_2.11-2.3.1.jar
这个例子中用了几个参数,主要是对资源参数的设置,含义如下:
--executor-memory:指定每个 Executor 的内存,此值可在 spark-env.sh 中进行配置,也可在执行 Spark 任务时指定,如果不指定则默认读取 spark-env.sh 中的设置。--total-executor-cores:指定运行此任务需要所有 Executor 总共使用的 CPU 核数。
除此之外,还可以通过 --executor-cores 指定每个 Executor 所占用 core 的数量。除了 spark-submit,spark-sql、spark-shell 运行任务时也可以指定这些参数来设置任务运行时需要的资源。
三)Spark 多种运行模式分析
在 Spark 独立集群模式下,可以在本地模式、客户端模式以及完全集群模式下执行 Spark 任务,每个运行模式都有相关应用场景和细微区别,下面我将分别介绍。
1、本地或者单机运行模式
该模式被称为 Local 模式,是用单机的多个线程来模拟 Spark 分布式计算,通常用来验证开发出来的应用程序逻辑上是否有问题。运行该模式非常简单,只需要把 Spark 的安装包解压后,改一些常用的配置即可使用,而不用启动 Spark 的 Master、Worker 守护进程(只有使用独立集群模式时,才需要这两个角色),也不用启动 Hadoop 的各服务(除非你要用到 HDFS),这是和其他模式的区别。
我们用如下命令提交作业:
[hadoop@slave002 ~]$ spark-submit --master local --class org.apache.spark.examples.SparkPi /opt/bigdata/spark/current/examples/jars/spark-examples_2.12-3.0.0-preview2.jar
在程序执行过程中,可以看到,只会生成一个 SparkSubmit 进程。这个 SparkSubmit 进程既是客户提交任务的 Client 进程、又是 Spark 的 driver 程序、还充当着 Spark 执行 Task 的 Executor 角色。
2、Spark 客户端集群模式
和单机运行的模式不同,在使用客户端集群模式时,必须在执行任务前,先启动 Spark 的 Master 和 Worker 守护进程。在这种运行模式,可以使用 Spark 的 8080 web ui 来观察集群资源和应用程序的执行情况。
看下面一个例子:
[hadoop@slave002 conf]$ spark-submit --master spark://nnmaster.cloud:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi /opt/bigdata/spark/current/examples/jars/spark-examples_2.12-3.0.0-preview2.jar
Pi is roughly 3.133655668278341
此命令执行后,执行结果会输出到屏幕。此例子是 spark-submit 在独立集群中以 Client 模式来运行的。可以看到这里添加了“--deploy-mode client”这个参数,其实如果不指定“--deploy-mode”模式,默认就是 Client 模式。
在客户端集群模式下,程序运行期间,会在执行此程序的客户端机器上生成一个 SparkSubmit 进程,并运行 4040 端口,此进程作为 Client 端并运行 driver 程序,通过访问此客户端的 4040 端口,可以看到 driver 运行在哪个节点,如下图所示:
上面的操作我是在 slave002 节点进行的,因此 driver 程序就运行在此节点上,还可以看到每个 Executor 的资源使用情况。当任务运行完毕后,4040 端口会自动关闭。
下面分析下客户端集群模式下,Spark 任务的执行过程,叙述如下:
任务提交后,在客户端(slave002)上会生成一个 SparkSubmit 进程,同时 driver 程序也运行在此客户端上;driver 程序运行起来后,就会在其他 work 节点启动 CoarseGrainedExecutorBackend 进程,此进程用来创建和维护 Executor,CoarseGrainedExecutorBackend 和 Executor 是一一对应的关系;Executor 创建起来后,就开始处理 Task 对象,Executor 内部通过线程池的方式来完成 Task 的计算;所以任务执行完成后,CoarseGrainedExecutorBackend 进程自动退出,客户端上的 driver 程序也自动退出。
3、Spark 完全集群模式
此运行模式需要启动 Spark 的 Master、Worker 守护进程,然后执行如下命令:
[hadoop@slave002 conf]$ spark-submit --master spark://nnmaster.cloud:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi /opt/bigdata/spark/current/examples/jars/spark-examples_2.12-3.0.0-preview2.jar
此命令执行完毕后,直接退出命令行,执行结果不会输出到屏幕。要查看执行结果,可以到运行 driver 程序的节点对应的 stdout 输出中查看。下图是完全集群模式下 Spark 任务的运行状态:
从上图可以看到,master 选择了“worker-20200601142643-172.16.213.138-33869”这个节点来运行 driver 程序,点开这个节点连接,页面拉到最后,如下图所示:
上图显示的是已经完成的 driver 程序,查看第一个 driver,点开 Logs 列下面的 stdout 链接,如下图所示,这就是上面命令的执行结果。
下面分析下完全集群模式下,Spark 任务的执行过程,叙述如下:
任务提交后,此客户端(slave002)会生成一个 SparkSubmit 进程,此进程会在应用程序提交给集群之后就退出;Master 会在集群中选择一个 Worker 节点生成一个子进程 DriverWrapper 来启动 driver 程序,该 DriverWrapper 进程会占用 Worker 节点的一个 core;driver 程序运行起来后,就会在其他 work 节点启动 CoarseGrainedExecutorBackend 进程,此进程用来创建和维护 Executor,CoarseGrainedExecutorBackend 和 Executor 是一对一的关系;Executor创建起来后,就开始处理 Task 对象,Executor 内部通过线程池的方式来完成 Task 的计算;所有任务执行完成,CoarseGrainedExecutorBackend 进程自动退出。
总结
本课时主要讲解了 Spark 独立集群的部署以及 spark-sql、spark-shell 和 Spark-Submit 的使用,最后还分析了每种使用方式在 Spark 内部的执行流程,了解这些内部执行流程,对于故障排除和性能调优非常重要。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~