spark RDD 概述用法权威资料(建议收藏)点击这里看全文
文章目录
概述
在高层次上,每个Spark应用程序由一个驱动程序组成,该驱动程序运行用户的主函数并在集群上执行各种并行操作。Spark提供的主要抽象是弹性分布式数据集(RDD),它是一个分区在集群节点上的元素集合,可以并行操作。RDD可以通过从Hadoop文件系统(或任何其他支持Hadoop文件系统)中的文件开始创建,或者通过在驱动程序中引用现有的Scala集合并对其进行转换来创建。用户还可以要求Spark将RDD保留在内存中,以便在并行操作之间高效地重用。最后,RDD可以自动从节点故障中恢复。
Spark中的第二个抽象是共享变量,可用于并行操作。默认情况下,当Spark将函数作为一组任务并行运行时,它会将函数中使用的每个变量的副本发送到每个任务。有时需要在任务之间共享变量,或在任务和驱动程序之间共享变量。Spark支持两种类型的共享变量:广播变量,可用于在所有节点上缓存一个值;累加器,用于“累加”变量,例如计数器和总和。
本指南展示了Spark在支持的每种语言中的这些功能。如果您使用Spark的交互式shell,可以更容易地跟随本指南,其中包括Scala shell的bin/spark-shell和Python shell的bin/pyspark。
与Spark的链接
Spark 3.5.0默认使用Scala 2.12构建和分发(尽管Spark也可以与其他版本的Scala一起使用)。如果您要用Scala编写应用程序,请确保使用兼容的Scala版本(例如2.12.X)。
要编写Spark应用程序,您需要在项目中添加对Spark的Maven依赖。Spark可以通过Maven Central获取:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.5.0</version>
</dependency>
如果您希望访问HDFS集群,则还需要根据您使用的HDFS版本添加对hadoop-client的依赖:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version><your-hdfs-version></version>
</dependency>
在Spark程序中,您需要导入必要的类:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
(注意:在Spark 1.3.0之前,您需要显式导入org.apache.spark.SparkContext._
以启用必要的隐式转换。)
按照这些步骤,您可以使用适当的依赖项和导入开始用Scala编写Spark应用程序。
初始化Spark
创建SparkContext对象是一个Spark程序必须做的第一件事情,它告诉Spark如何访问集群。要创建SparkContext,您首先需要构建一个包含有关应用程序信息的SparkConf对象。
每个JVM只能有一个活动的SparkContext。在创建新的SparkContext之前,必须停止活动的SparkContext。
val conf = new SparkConf().setAppName(appName).setMaster(master)
val sc = new SparkContext(conf)
appName参数是您的应用程序在集群UI上显示的名称。master是一个Spark、Mesos或YARN集群的URL,或者一个特殊的“local”字符串,用于在本地模式下运行。实际上,在集群上运行时,您不希望在程序中硬编码master,而是使用spark-submit启动应用程序并在其中接收它。但是,对于本地测试和单元测试,可以传递“local”以在本地进程中运行Spark。
使用Shell
在Spark shell中,已经为您创建了一个特殊的与解释器相关的SparkContext,存储在名为sc的变量中。因此,您不能自己创建SparkContext对象。您可以使用–master参数设置上下文连接到的主节点,并可以使用–jars参数将JAR文件添加到类路径中。还可以通过将逗号分隔的Maven坐标列表传递给–packages参数来向shell会话添加依赖项(例如Spark Packages)。任何其他存储依赖项可能存在的存储库(例如Sonatype)可以通过–repositories参数传递。例如,要在4个内核上运行bin/spark-shell,请使用以下命令:
$ ./bin/spark-shell --master local[4]
或者,如果还要将code.jar添加到类路径中,请使用以下命令:
$ ./bin/spark-shell --master local[4] --jars code.jar
要使用Maven坐标包含一个依赖项:
$ ./bin/spark-shell --master local[4] --packages "org.example:example:0.1"
有关完整选项列表,请运行spark-shell --help命令。在幕后,spark-shell调用更通用的spark-submit脚本。
弹性分布式数据集(RDD)
Spark围绕着弹性分布式数据集(RDD)的概念展开,它是一个容错的元素集合,可以并行操作。创建RDD有两种方式:在驱动程序中并行化现有集合,或者引用外部存储系统中的数据集,例如共享文件系统、HDFS、HBase或任何提供Hadoop InputFormat的数据源。
并行化集合
并行化集合是通过在驱动程序中对现有集合(Scala Seq)调用SparkContext的parallelize方法来创建的。集合的元素被复制以形成一个分布式数据集,可以并行操作。例如,下面是如何创建一个包含数字1到5的并行化集合:
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
一旦创建完成,分布式数据集(distData)就可以被并行操作。例如,我们可以调用distData.reduce((a, b) => a + b)来对数组的元素求和。后面我们会详细介绍对分布式数据集的操作。
并行集合的一个重要参数是将数据集划分为多少个分区。Spark将在集群上为每个分区运行一个任务。通常情况下