当前位置:   article > 正文

Spark核心名词解释与编程

Spark核心名词解释与编程

Spark核心概念

名词解释

1)ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内spark主要基于yarn集群运行,欧美主要基于mesos来运行)。

2)Application:Spark的应用程序,包含一个Driver program和若干Executor。

3)SparkConf:负责存储配置信息。作用相当于hadoop中的Configuration。

4)SparkContext:Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor。

5)Worker:从节点,负责控制计算节点,启动Executor。在YARN模式中为NodeManager,负责计算节点的控制,启动的进程叫Container。

6)Driver:运行Application的main()函数并创建SparkContext(是spark中最重要的一个概念,是spark编程的入口,作用相当于mr中的Job)。

7)Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。

8)RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。

9)RDD是弹性式分布式数据集,理解从3个方面去说:弹性、数据集、分布式。是Spark的第一代的编程模型。

10)DAGScheduler:实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Taskset放到TaskScheduler中。DAGScheduler就是Spark的大脑,中枢神经。

11)TaskScheduler:将任务(Task)分发给Executor执行。

12)Stage:一个Spark作业一般包含一到多个Stage。

13)Task:一个Stage包含一到多个Task,通过多个Task实现并行运行的功能。task的个数由rdd的partition分区决定,spark是一个分布式计算程序,所以一个大的计算任务,就会被拆分成多个小的部分,同时进行计算。一个partition对应一个task任务。

14)Transformations:转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。

15)Actions:操作/行动(Actions)算子 (如:count, collect, foreach等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。

Spark官网组件说明

官网组件说明如图-18所示:

图-18 Spark组件通信架构图

Spark应用程序作为集群上的独立进程集运行,由主程序(称为驱动程序)中的SparkContext对象协调。

具体来说,要在集群上运行,SparkContext可以连接到几种类型的集群管理器(Spark自己的独立集群管理器、Mesos或YARN),这些管理器可以跨应用程序分配资源。一旦连接,Spark将获取集群中节点上的执行器,这些执行器是为应用程序运行计算和存储数据的进程。接下来,它将应用程序代码(由传递给SparkContext的JAR或Python文件定义)发送给执行器。最后,SparkContext将任务发送给执行器以运行。

Spark编程体验

项目依赖管理

  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.scala-lang</groupId>
  4.         <artifactId>scala-library</artifactId>
  5.         <version>2.12.10</version>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>org.apache.spark</groupId>
  9.         <artifactId>spark-core_2.12</artifactId>
  10.         <version>3.2.1</version>
  11.     </dependency>
  12.     <dependency>
  13.         <groupId>org.apache.spark</groupId>
  14.         <artifactId>spark-sql_2.12</artifactId>
  15.         <version>3.2.1</version>
  16.     </dependency>
  17.     <dependency>
  18.         <groupId>mysql</groupId>
  19.         <artifactId>mysql-connector-java</artifactId>
  20.         <version>8.0.23</version>
  21.     </dependency>
  22.     <dependency>
  23.         <groupId>org.apache.spark</groupId>
  24.         <artifactId>spark-hive_2.12</artifactId>
  25.         <version>3.2.1</version>
  26.     </dependency>
  27.     <dependency>
  28.         <groupId>org.apache.spark</groupId>
  29.         <artifactId>spark-streaming_2.12</artifactId>
  30.         <version>3.2.1</version>
  31.     </dependency>
  32.     <dependency>
  33.         <groupId>org.apache.spark</groupId>
  34.         <artifactId>spark-streaming-kafka-0-10_2.12</artifactId>
  35.         <version>3.2.1</version>
  36.     </dependency>
  37. </dependencies>
  38. <build>
  39.     <finalName>chapter1.WordCount</finalName>
  40.     <plugins>
  41.         <plugin>
  42.             <groupId>net.alchim31.maven</groupId>
  43.             <artifactId>scala-maven-plugin</artifactId>
  44.             <version>3.4.6</version>
  45.             <executions>
  46.                 <execution>
  47.                     <goals>
  48.                         <goal>compile</goal>
  49.                         <goal>testCompile</goal>
  50.                     </goals>
  51.                 </execution>
  52.             </executions>
  53.         </plugin>
  54.     </plugins>
  55. </build>

项目编码

spark入门程序wordcount:

  1. package com.fesco.bigdata.spark
  2. import org.apache.spark.rdd.RDD
  3. import org.apache.spark.{SparkConf, SparkContext}
  4. /**
  5.  * scala版本的wordcount
  6.  */
  7. object ScalaWordCountApp {
  8. def main(args: Array[String]): Unit = {
  9. val conf = new SparkConf()
  10. .setAppName(s"${ScalaWordCountApp.getClass.getSimpleName}")
  11. .setMaster("local[*]")
  12. val sc = new SparkContext(conf)
  13. //加载数据
  14. val file: RDD[String] = sc.textFile("file:/E:/data/spark/hello.txt")
  15.    //按照分隔符进行切分
  16. val words:RDD[String] = lines.flatMap(line => line.split("\\s+"))
  17. //每个单词记为1
  18. val pairs:RDD[(String, Int)] = words.map(word => (word, 1))
  19. //聚合数据
  20. val ret:RDD[(String, Int)] = pairs.reduceByKey(myReduceFunc)
  21. //export data to external system
  22. ret.foreach(println)
  23. }
  24. sc.stop()
  25. }
  26. def myReduceFunc(v1: Int, v2: Int): Int = {
  27. v1 + v2
  28. }
  29. }

Master URL说明

首先在编程过程中,至少需要给spark程序传递一个参数master-url,通过sparkConf.setMaster来完成。改参数,代表的是spark作业的执行方式,或者指定的spark程序的cluster-manager的类型。

表-1 模式选择

master

含义

local

程序在本地运行,同时为本地程序提供一个线程来处理

local[M]

程序在本地运行,同时为本地程序分配M个工作线程

来处理

local[*]

程序在本地运行,同时为本地程序分配机器可用的CPU core的个数工作线程来处理

local[M, N]

程序在本地运行,同时为本地程序分配M个工作线程来处理,如果提交程序失败,会进行最多N次的重试

spark://ip:port

基于standalone的模式运行,提交撑到ip对应的master上运行

spark://ip1:port1,ip2:port2

基于standalone的ha模式运行,提交撑到ip对应的master上运行

yarn/启动脚本中的deploy-mode配置为cluster

基于yarn模式的cluster方式运行,SparkContext的创建在NodeManager上面,在yarn集群中

yarn/启动脚本中的deploy-mode配置为client

基于yarn模式的client方式运行,SparkContext的创建在提交程序的那台机器上面,不在yarn集群中

spark程序的其他提交方式

加载hdfs中的文件:

  1. object RemoteSparkWordCountOps {
  2. def main(args: Array[String]): Unit = {
  3.     //创建程序入口
  4.     val conf = new SparkConf().setAppName("wc").setMaster("local[*]")
  5.     val sc = new SparkContext(conf)
  6.     //设置日志级别
  7.     sc.setLogLevel("WARN")
  8.     //加载数据
  9.     val file = sc.textFile("hdfs://hadoop101:8020//wordcount//words.txt")
  10.     //切分
  11.     val spliFile: RDD[String] = file.flatMap(_.split(" "))
  12.     //每个单词记为1
  13.     val wordAndOne: RDD[(String, Int)] = spliFile.map((_, 1))
  14.     //聚合
  15.     val wordAndCount: RDD[(String, Int)] = wordAndOne.reduceByKey(_ + _)
  16.     //打印输出
  17.     wordAndCount.foreach(println)
  18.     //释放资源
  19.     sc.stop()
  20. }
  21. }

提交spark程序到集群中

首先需要将spark-core模块进行打包,其次上传到集群中,才可以进行提交作业到spark或者yarn集群中运行。

1)Client:

  1. bin/spark-submit \
  2. --class chapter1.WordCount \
  3. --master spark://hadoop101:7077 \
  4. /root/word.jar \
  5. hdfs://hadoop101:8020/wordcount/words.txt

2)Cluster:

  1. bin/spark-submit \
  2. --class chapter1.WordCount \
  3. --master spark://hadoop101:7077 \
  4. /root/word.jar \
  5. hdfs://hadoop101:8020/wordcount/words.txt \
  6. hdfs://hadoop101:8020/wordcount/output1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/526913
推荐阅读
相关标签
  

闽ICP备14008679号