概述

在高层次上,每个Spark应用程序都由一个运行用户main方法的driver program组成,并在集群上执行各种 parallel operations。Spark提供的主要抽象是resilient distributed dataset (RDD),它是可以并行操作的群集节点之间分配的元素的集合。RDD是由Hadoop文件系统(或任何其他Hadoop支持的文件系统)中的文件或驱动程序中的现有Scala集合开始,并进行转换创建的。用户还可以要求Spark在内存中保留RDD,从而在并行操作中有效地重用RDD。最后,RDD自动从节点故障中恢复。

Spark中的第二个抽象是可以在并行操作中使用的共享变量。默认情况下,当Spark将并行功能作为一组任务在不同节点上运行时,它会将功能中使用的每个变量的副本发送到每个任务。有时,需要在任务之间或任务和驱动程序之间共享一个变量。Spark支持两种类型的共享变量:广播变量,可用于缓存所有节点上的内存中的值,以及累加器,它们只是“添加”到诸如计数器和总和之间的变量。

本指南显示了Spark支持的每种语言中的每个功能。可以通过启动Spark的交互式shell 进行学习- Scala shell的bin / spark-shell或Python的bin / pyspark。

依赖

Spark 1.5.0适用于Java 7及更高版本。如果您使用Java 8,Spark可以简单地编写函数来支持lambda表达式,否则可以使用org.apache.spark.api.java.function包中的类。

要在Java中编写Spark应用程序,需要在Spark上添加依赖关系。Spark可通过Maven Central获得:

groupId = org.apache.spark
artifactId = spark-core_2.10
version = 1.5.0

另外,如果您希望访问HDFS群集,则需要为您的HDFS版本的hadoop-client添加依赖关系。一些常见的HDFS版本标签列在第三方发行版页面上。

groupId = org.apache.hadoop
artifactId = hadoop-client
version = <your-hdfs-version>

最后,您需要将一些Spark类导入到程序中。添加以下行:

import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.api.java.JavaRDD
import org.apache.spark.SparkConf

Resilient Distributed Datasets (RDDs)

Spark围绕着弹性分布数据集(RDD)的概念,RDD是一种容错的并行操作元素集合。创建RDD有两种方法:并行化驱动程序中的现有集合,或者在外部存储系统(如共享文件系统,HDFS,HBase或提供Hadoop InputFormat的任何数据源)中引用数据集。

Parallelized Collections

External Datasets

Spark可以从Hadoop支持的任何存储源创建分布式数据集,包括本地文件系统,HDFS,Cassandra,HBase,Amazon S3等。Spark支持文本文件,SequenceFiles和任何其他Hadoop InputFormat。

文本文件RDD可以使用SparkContext的textFile方法创建。该方法获取文件的URI(机器上的本地路径,或hdfs://,s3n://,etc URI),并将其作为行的集合读取。这是一个示例调用:



JavaRDD<String> distFile = sc.textFile("data.txt");

 一旦创建,distFile可以通过数据集操作来执行。例如,我们可以使用map来添加所有行的大小,并按如下所示减少操作:distFile.map(s - > s.length())。reduce((a,b) - > a b)。

有关Spark的阅读文件的一些注意事项:

RDD Persistence

Spark中最重要的功能之一是在操作中持久(或缓存)内存中的数据集。当您持有RDD时,每个节点都会将其计算的任何分区存储在内存中,并将在action操作重用该数据集(或从其导出的数据集)。这可以使未来的动作快得多(通常超过10倍)。缓存是迭代算法和快速交互使用的关键工具。

您可以使用其上的persist()或cache()方法标记要持久化的RDD。第一次action时,它将被保存在节点的内存中。Spark的缓存是容错的 - 如果RDD的任何分区丢失,它将使用最初创建的转换自动重新计算。

此外,可以使用不同的存储级别存储每个持久化的RDD,从而允许您将数据集保留在磁盘上,或者将其作为序列化的Java对象保存在内存中(以节省空间),将其跨节点复制。通过将StorageLevel对象(Scala,Java,Python)传递给persist()来设置这些级别。cache()方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY(在内存中存储反序列化的对象)。全套存储级别为:

Storage Level Meaning
MEMORY_ONLY Store RDD as deserialized Java objects in the JVM. If the RDD does not fit in memory, some partitions will not be cached and will be recomputed on the fly each time they're needed. This is the default level.
MEMORY_AND_DISK Store RDD as deserialized Java objects in the JVM. If the RDD does not fit in memory, store the partitions that don't fit on disk, and read them from there when they're needed.
MEMORY_ONLY_SER 
(Java and Scala)
Store RDD as serialized Java objects (one byte array per partition). This is generally more space-efficient than deserialized objects, especially when using a fast serializer, but more CPU-intensive to read.
MEMORY_AND_DISK_SER 
(Java and Scala)
Similar to MEMORY_ONLY_SER, but spill partitions that don't fit in memory to disk instead of recomputing them on the fly each time they're needed.
DISK_ONLY Store the RDD partitions only on disk.
MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc. Same as the levels above, but replicate each partition on two cluster nodes.
OFF_HEAP (experimental) Similar to MEMORY_ONLY_SER, but store the data in off-heap memory. This requires off-heap memory to be enabled.

即使没有用户调用persist,Spark也会自动将shuffle操作中的一些中间数据(例如reduceByKey)保留下来。这样做是为了避免重新计算整个输入,如果在shuffle期间节点出现故障。如果计划重用它,我们仍然建议用户在生成的RDD上调用persist 。

Which Storage Level to Choose?

Spark的存储级别旨在提供内存使用和CPU效率之间的不同权衡。我们建议您通过以下过程来选择一个:

如果您的RDD适合于默认存储级别(MEMORY_ONLY),默认使用这种方式。这是CPU效率最高的选项,允许RDD上的操作尽可能快地运行。

其他情况,请尝试使用MEMORY_ONLY_SER并选择一个快速序列化库,使对象更加节省空间,但仍然能够快速访问。(Java和Scala)

不要溢出到磁盘,除非计算您的数据集的功能是昂贵的,或者它们过滤大量的数据。否则,重新计算分区可能与从磁盘读取分区一样快。

如果您想要快速故障恢复,请使用复制的存储级别(例如,如果使用Spark来提供来自Web应用程序的请求)。所有存储级别通过重新计算丢失的数据来提供完整的容错能力,但复制的数据可让您继续在RDD上运行任务,而无需重新计算丢失的分区。

Removing Data

Spark会自动监视每个节点的缓存使用情况,并以最近最少使用(LRU)方式丢弃旧的数据分区。如果您想手动删除RDD,而不是等待它脱离缓存,请使用RDD.unpersist()方法。

共享变量

Broadcast Variables

广播变量允许程序员在每个机器上保留缓存的只读变量,而不是使用任务运送副本。例如,可以使用它们以有效的方式为每个节点提供大型输入数据集的副本。Spark还尝试使用高效的广播算法分发广播变量,以降低通信成本。

Spark action由“shuffle”操作拆分成不同stage执行。Spark自动广播每个阶段任务所需的公共数据。以这种方式广播的数据以序列化形式缓存,并在运行每个任务之前反序列化。这意味着,显式创建广播变量仅在跨多个阶段的任务需要相同数据或者以反序列化格式缓存数据很重要时才有用。

广播变量通过调用SparkContext.broadcast(v)从变量v创建。广播变量是围绕v的包装器,其值可以通过调用value方法来访问。下面的代码显示:

Broadcast<int[]> broadcastVar = sc.broadcast(new int[] {, , });

broadcastVar.value();

创建广播变量后,应在群集中运行的任何函数中使用它而不是值v,以便v不会多次发送到节点。另外,在广播之后不应修改对象v,以便确保所有节点获得与广播变量相同的值(例如,如果该变量稍后发送到新节点)。

Spark官方2 ---------Spark 编程指南(1.5.0)的更多相关文章

  1. Spark编程指南V1.4.0(翻译)

    Spark编程指南V1.4.0 ·        简单介绍 ·        接入Spark ·        Spark初始化 ·        使用Shell ·        在集群上部署代码 ...

  2. 【译】Spark官方文档——编程指南

    本文翻自官方博客,略有添加:https://github.com/mesos/spark/wiki/Spark-Programming-Guide Spark发指南 从高的面看,其实每一个Spark的 ...

  3. Spark官方3 ---------Spark Streaming编程指南(1.5.0)

    Design Patterns for using foreachRDD dstream.foreachRDD是一个强大的原语,允许将数据发送到外部系统.然而,了解如何正确有效地使用该原语很重要.避免 ...

  4. Spark官方1 ---------Spark SQL和DataFrame指南(1.5.0)

    概述 Spark SQL是用于结构化数据处理的Spark模块.它提供了一个称为DataFrames的编程抽象,也可以作为分布式SQL查询引擎. Spark SQL也可用于从现有的Hive安装中读取数据 ...

  5. 运行spark官方的graphx 示例 ComprehensiveExample.scala报错解决

    运行spark官方的graphx 示例 ComprehensiveExample.scala报错解决 在Idea中,直接运行ComprehensiveExample.scala,报需要指定master ...

  6. Spark Graphx编程指南

    问题导读1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图?2.PageRank算法在图中发挥什么作用?3.三角形计数算法的作用是什么?Spark中文手册-编程指南Spark之一个快 ...

  7. Spark结构式流编程指南

    Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...

  8. Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  9. Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN

    Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...

随机推荐

  1. 记一次JavaWeb网站技术架构总结

    题记 工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充. 俗话说的好,冰冻三尺非一日之寒, ...

  2. App测试中 ----------------Android和IOS测试区别

    1 . Android长按home键呼出应用列表和切换应用,然后右滑则终止应用:2. 多分辨率测试,Android端20多种,ios较少:3. 手机操作系统,Android较多,ios较少且不能降级, ...

  3. IOS学习【xcode 7新特性url链接】

    由于xcode7的更新,在访问http链接的时候会输出错误信息 The resource could not be loaded because the App Transport Security ...

  4. 文件系统的几种类型:ext3, s…

    分类: 架构设计与优化 1.  ext3 在异常断电或系统崩溃(不洁关机, unclean system shutdown  ).每个已挂载ext2文件系统计算机必须使用e2fsck程序来检查其一致性 ...

  5. 必应词典--英语学习APP案例分析

    一.调研,评测 1.个人上手体验 这还是第一次听说必应词典,只能说知名度有待提高啊.首先,下载打开必应词典的第一感觉就是不够美观,个人感觉不论图标还是界面的美感都不足,既繁琐有简洁,给人的最直观感受就 ...

  6. 个人作业(3)----个人总结(Alpha阶段)

    一.个人总结. 个人完成的任务:在此阶段我完成了用户调研.部分测试以及部分博客书写. 个人及团队心得:经过几周Alpha阶段开发后,我大致了解了开发软件的过程,开发一个软件并没有以往想象中那么简易,在 ...

  7. 团队作业4——第一次项目冲刺(Alpha版本) Day5

    首先和助教及老师表示抱歉,博客确实当时就写了,但是一直不算写好,因为这几天卡住了,预计实现的功能实现不了,进度跟不上,现在也在寻求解决方法. 1.站立式会议: 2. Leangoo任务分解图: 3.任 ...

  8. C语言中变量的作用域和生命周期

    变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...

  9. 201521123024 《Java程序设计》第2周学习总结

    1. 本周学习总结 1.Scanner扫描器的用法 2.各种数据类型的使用 3.运算符和表达式的使用 4.枚举类.String类的应用 5.了解用package和import管理类别 2.书面作业 1 ...

  10. 201521123122《Java程序设计》第1周学习总结

    1. 本周学习总结 因为寒假里也没有好好预习java,第一周上课还是有点懵逼. ①.了解了JVM,JRE,JDK的区别,能够熟练安装JDK. ②.编了我人生中的第一个java程序"hello ...