Spark编程指南(三)

共享变量

通常,当一个函数传递给在远程集群节点上执行的Spark操作(如mapreduce)时,函数使用的是所有变量的独立副本。这些变量会拷贝到每台机器上,并且远程机器上的变量没有更新到驱动程序中。跨任务读写共享变量是无效的。Spark为两种常见的使用模式提供两种类型的共享变量:广播变量和累加器。

广播变量

广播变量允许开发者保留一个只读变量缓存到每台机器上,而不是传递变量的拷贝。广播变量可用于高效地给每个节点一份大输入数据集的拷贝。Spark也在尝试使用高效的广播算法来分发广播变量,以减少通信成本。

Spark actions通过一系列阶段执行,以”shuffle”操作分隔。Spark会在每个阶段自动广播任务需要的公共数据。这种方式广播的数据会以序列化形式缓存,在每个任务执行之前进行反序列化。这就是说,只有跨阶段的任务需要相同的数据或者以反序列化形式缓存数据很重要时,才会显式地创建广播变量。

广播变量可通过调用SparkContext.broadcast(v)从变量v创建。广播变量是v的wrapper,可通过value方法访问。代码如下:

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

创建广播变量后,不要在集群上运行任何函数中使用v,以免v会被发送节点多次。另外,对象v在广播之后不能被修改,这样才能保证所有节点都获取到的是相同的值。

累加器

累加器只是通过关联和交换操作进行累加的变量,并且有效地支持并行。累加器可用于实现counters(如在MapReduce中)和sums。Spark支持数值类型的累加器,开发者可以添加对新类型的支持。

作为用户,可以创建命名或非命名的累加器。如下图所示,一个命名的累加器(counter)会在修改累加器的阶段显示在web UI上。

image.png
在UI中跟踪累加器对于理解运行阶段的过程非常有用。(注意:目前在Python中不支持)。

数值累加器可通过调用SparkContext.longAccumulator()SparkContext.doubleAccumulator()创建,分别用于累加Long或Double类型的值。运行在集群上的任务之后可使用add方法进行累加操作。但是,这些任务并不能读取累加器的值,只有驱动程序使用value方法能读取累加器的值。

下面展示了累加器累加了一个数组:

scala> val accum = sc.longAccumulator("My Accumulator")
accum: org.apache.spark.util.LongAccumulator = LongAccumulator(id: 0, name: Some(My Accumulator), value: 0)

scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s

scala> accum.value
res2: Long = 10

上面代码使用了内置支持的Long类型累加器,开发者也可以通过AccumulatorV2创建自己的类型。AccumulatorV2抽象类由多个方法,其中必须重写的是:reset,用于充值累加器为0,add用于向累加器加一个值,merge用于合并另一个同类型的累加器到当前累加器,其它必须重写的方法参见API documentation。例如,假设我们有一个MyVector类代表数学向量,可以这样写:

class VectorAccumulatorV2 extends AccumulatorV2[MyVector, MyVector] {

  private val myVector: MyVector = MyVector.createZeroVector

  def reset(): Unit = {
    myVector.reset()
  }

  def add(v: MyVector): Unit = {
    myVector.add(v)
  }
  ...
}

// Then, create an Accumulator of this type:
val myVectorAcc = new VectorAccumulatorV2
// Then, register it into spark context:
sc.register(myVectorAcc, "MyVectorAcc1")

注意,当开发者定义了自己类型的AccumulatorV2,结果类型可以与添加元素的类型不同。

对于只在actions执行更新操作的累加器,Spark会保证任务对累加器的更新操作只会应用一次,例如,重启任务不会更新累加器的值。在transformations中,用户应该意识到,如果任务或作业阶段重新执行,每个任务的更新操作会应用多次。

累加器没有改变Spark的懒计算模型,如果累加器在RDD的操作中更新了,累加器的值只会在RDD作为action的一部分被计算时更新。所以,在懒transformation中(如map()),累加器的更新不能保证被执行。下面的代码说明这个特性:

val accum = sc.longAccumulator
data.map { x => accum.add(x); x }
// Here, accum is still 0 because no actions have caused the map operation to be computed.

部署到集群

application submission guide描述了如何提交向集群提交应用,简单来说,一旦你打包好了应用(对于Java和Scala打包为JAR,对于Python打包为一组.py或者.zip),bin/spark-submit脚本可将包提交到任何支持的集群管理器。

从Java/Scala运行Spark作业

org.apache.spark.launcher包使用简单的Java API提供了将Spark作业作为子进程运行的类。

单元测试

Spark可使用任意流行的单元测试框架。将master URL设置为local,简单滴创建一个SparkContext在你的测试中,执行你的操作,然后调用SparkContext.stop()结束。确保在finally块或者测试框架的tearDown方法中stop context,Spark不支持在同一个程序中同时运行两个上下文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一本关于使用Python编写Spark程序的指南,旨在帮助读者掌握Spark的基本概念和编程技巧。本书包含了Spark的安装、配置、数据处理、机器学习等方面的内容,适合初学者和有一定编程基础的读者阅读。通过学习本书,读者可以了解到如何使用Python编写高效、可扩展的Spark程序,从而更好地应对大数据处理的挑战。 ### 回答2: Apache Spark是目前最流行的大数据处理框架之一,而Python作为一门非常流行的编程语言,作为Spark编程的语言之一也颇受欢迎。这便催生了Python版Spark编程指南。 这个指南主要分为以下几个部分:Spark发行版安装,Python和Spark基础教程,Spark DataFrames,机器学习库(如MLlib和Spark Streaming),性能优化等。 首先,安装Spark发行版是指南的第一个部分。Python对于Spark发行版的安装步骤与Java和Scala类似,安装过程中需要指定PySpark,即Spark的Python API。 然后,Python和Spark基础教程是指南的第二部分。Python的开发人员可以使用PySpark API来编写Spark程序,而这个部分主要介绍了Python和Spark的基础知识以及如何使用PySpark编写Spark程序。 Spark DataFrames是指南的第三部分,它是一种基于分布式内存和RDD的数据结构,使得数据处理更加高效,易于管理和操纵。Spark DataFrames与Pandas DataFrames很相似,但具有更高的性能和可扩展性。 机器学习库是指南的第四部分,主要介绍MLlib和Spark Streaming。MLlib是Spark提供的机器学习库,包括了各种常见的机器学习算法,如分类、聚类、回归等。Spark Streaming是Spark的实时数据处理引擎,可以将实时数据流转换为批处理数据并进行分析和处理。 性能优化是指南的最后一部分,重点介绍如何通过调整Spark参数和改进算法和程序设计来提高Spark程序的性能。 总的来说,Python版Spark编程指南为Python开发人员提供了一个良好的入门指南,使他们可以使用Python编写高性能、可扩展和易于管理的Spark程序。 ### 回答3: Spark是目前最流行的大数据处理框架之一,其高效的计算能力和灵活的处理方式得到了广泛的应用。在Spark的语言支持中,Python也是一种重要的选项。由于Python简单易学、易读易写、生态圈完备等优势,Python在数据处理领域也逐渐成为重要的语言之一。 针对Python语言的Spark编程Spark官方提供了Python版的Spark编程指南,为Python用户提供了基于Spark的大数据处理和分析的编程教程和指南。 一个基于Spark的Python程序通常分为以下几个步骤: 1. 创建Spark Context 在使用Spark之前需要先创建Spark Context,它负责连接Spark集群和应用程序,可以通过pyspark模块创建。 2. 加载数据 Spark可以处理多种数据源,Python程序中的数据可以从HDFS、本地文件系统、HBase、Cassandra、JSON、CSV文件等多种数据源中加载进来,Spark支持多种格式数据的读取,为Python程序提供了灵活的数据处理方式。 3. 数据清洗 数据清洗是数据处理的重要一环,Python程序中需要使用各种数据清洗函数对数据进行清洗、处理、转换和过滤等操作。 4. 数据分析 Spark中提供了丰富的数据分析工具和API,Python程序可以通过调用Spark的数据分析API实现数据的分析、聚合、统计和建模等操作。Spark提供了Python版的MLlib机器学习库,Python程序可以用它来实现比较常用的机器学习算法。 5. 结果输出 Python程序分析数据后需要将结果输出,可以将结果写入到文件、HDFS、数据库或直接展示在Web界面中,Spark提供了多种方式输出结果数据。 总之,Spark Python编程指南为Python用户提供了快速入门、基础知识、编程模型、数据分析、机器学习等方面的指南和示例,对于熟悉Python语言的开发者来说,这是一个快速掌握Spark编程的有效工具,有助于更深层次的学习和应用Spark技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值