参考:

英文:https://spark.apache.org/docs/latest/programming-guide.html

中文:http://www.cnblogs.com/lujinhong2/p/4651025.html 1.2.1版本的

 

(一)快速入门

老规矩,先看一个简单示例,有个认识。这个示例来自官方example的SparkPi:

package org.lujinhong.demo.spark

/*
* 官方的sparkPi示例
*/ import scala.math.random import org.apache.spark._ /** Computes an approximation to pi */
object SparkPi {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Spark Pi").setMaster("local")
val spark = new SparkContext(conf)
val slices = if (args.length > 0) args(0).toInt else 2
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
val count = spark.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)
println("Pi is roughly " + 4.0 * count / n)
spark.stop()
} }
 
注意以上的setMaster(“local”)是自己加上去的,方便直接在本地运行。如果在集群上运行,则通过spark-submit的—master参数指定。
写好代码后,就可以直接在eclipse中右键—>运行了。

 

 (二)理论介绍

 

1、spark中的所有操作都与RDD相关,包括创建RDD,transformation(将RDD转换为另一个RDD)和action(触发RDD的计算,以及输出等)。

In Spark all work is expressed as either creating new RDDs, transforming existing RDDs, or calling operations on RDDs to compute a result.

 2、RDD是一个不可变的分布式对象集合,每个RDD会被分成多个分区,它们分别在不同的机器上被计算。它可以是任何的python/java/scala对象,包括你自己创建的对象。

注意RDD是不可变的,因此若需要改变现有RDD的内容,只能通过创建一个新的RDD来实现,这也是transformation的作用。

RDD是一个集合,因此可以通过一些迭代方法对内容进行处理

 3、RDD操作类型:对RDD的操作可以分为2种类型

(1)Transformation: 将一个RDD转化为另一个RDD,如map, filter等操作

(2)Action:返回计算结果给driver,写入存储等操作。

最明显的区别:transformation返回一个RDD, action返回其它数据类型

 

(三)Spark应用的主要4个工作流程如下:

1、create:     通过读取外部数据源来创建RDD。(虽然说也可以将list/set等转化为RDD,但实际上这对于处理大数据没什么作用,一般只用作demo)

2、transformation:  将RDD将化为另一个RDD,如filter()等。

3、cache:  将RDD缓存下来,方便之后再使用,如persitst()等。

4、action:   执行真正的工作,计算结果并输出,如count(),first()等。

几个注意点

1、创建RDD有2种方法:

(1)从外部数据集中创建,如从文件,socket,kafka, flume等数据源

(2)将list/set等集合转化为RDD。scala> val lines = sc.parallelize(List("apple","pear"));

2、执行transformation只定义了操作,spark执行的是懒计算原则,即transformation不会触发真正的计算,而是等到第一个action出现时才开始真正的计算。这对于大数据量时成为重要。如读取一份大文件时,若马上将其读入内存,会占用大量的内存空间,而有可能过很长时间也会开始计算。另一方面,如果只是执行first()类似的计算,这个文件完全没必要全部读入内存,而是只读取到第一行就可以了。

3、默认情况下,对于每一个action,spark会重新计算它用到的RDD,若一个RDD会被之后的多个action用到,可以将其缓存到内存(当作也可以到磁盘等),如读取一个文件后,先经过filter,过滤出只包括”spark”的行,此时可以将这个RDD保存到内存中,再分别计算它的count(),first()等操作。

cache() is the same as calling persist() with the default storage level.

4、action会触发真正的计算。

看一个示例:

$ bin/spark-shell

 
(1)创建RDD

scala> val fileContent = sc.textFile("file:///home/hadoop/spark/README.md”)
 
(2)过滤RDD
scala> val pythonLine = fileContent.filter(line => line.contains("spark”))
 
(3)计算行数
scala> pythonLine.count
最后的输出如下:
15/07/21 11:20:43 INFO scheduler.DAGScheduler: Job 2 finished: count at <console>:26, took 1.495956 s
res5: Long = 11
 
可以看出使用了1.5秒左右。
 
(4)我们试一下缓存后再计算
scala> pythonLine.cache()
scala> pythonLine.count
15/07/21 11:22:18 INFO scheduler.DAGScheduler: Job 3 finished: count at <console>:26, took 0.123537 s
res7: Long = 11
只使用了0.12秒
 
(5)继续执行其它action
scala> pythonLine.first()
。。。。。

 

 

 

[spark]spark 编程教程的更多相关文章

  1. Spark Graphx编程指南

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

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

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

  3. 实验5 Spark SQL编程初级实践

    今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...

  4. Spark Streaming编程示例

    近期也有开始研究使用spark streaming来实现流式处理.本文以流式计算word count为例,简单描述如何进行spark streaming编程. 1. 依赖的jar包 参考<分别用 ...

  5. <译>Spark Sreaming 编程指南

    Spark Streaming 编程指南 Overview A Quick Example Basic Concepts Linking Initializing StreamingContext D ...

  6. 03、IDEA下Spark API编程

    03.IDEA下Spark API编程 3.1 编程实现Word Count 3.1.1 创建Scala模块 3.1.2 添加maven支持,并引入spark依赖 <?xml version=& ...

  7. Spark SQL 编程API入门系列之SparkSQL的依赖

    不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...

  8. 实验 5 Spark SQL 编程初级实践

    实验 5  Spark SQL 编程初级实践    参考厦门大学林子雨 1. Spark SQL 基本操作 将下列 json 数据复制到你的 ubuntu 系统/usr/local/spark 下,并 ...

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

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

  10. Spark—RDD编程常用转换算子代码实例

    Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U]  ...

随机推荐

  1. #学习笔记#——JavaScript 数组部分编程(六)

    14. 题目描述 实现一个打点计时器,要求 1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2.返回的对象中需 ...

  2. C++标准库概述

    一.C++标准库的主要组件: 1.标准C库 2.I/O流技术(对标准输入输出设备称为标准I/O,对在外磁盘上文件的输入输出称为文件I/O,对内存中指定的字符串存储空间的输入输出称为串I/O) 3.st ...

  3. c# array arraylist 泛型list

    1 array 数组  是存储相同类型元素的固定大小的数据的顺序集合.在内存中是连续存储的,所以索引速度非常快,而且赋值和修改元素也非常简单. //定义字符串数组 大小为3 string[] str1 ...

  4. ManagementObjectSearcher 对象获取串口列表

    首先,需引用using System.Management; 可先建个枚举类,如下 #region WIN32 API /// <summary> /// 枚举win32 api /// ...

  5. Mindjet MindManager 思维导图软件-使用思维导图跟踪调用流程,绘制软件框架

    思维导图.据说是每一个产品经理必备的软件.假设你阅读大型源码.使用思维导图跟踪调用流程,绘制软件框架将会很方便. 特点:没什么好说的.用过的都说好. 软件截图: 下载:http://www.mindm ...

  6. 小胖说事29-----iOS中Navigation中左滑pop页面的三种方法

    第三中类型.自己定义任何位置返回页面的方式,上边的类就是.m,大家能够贴过去使用.这个类是继承NavigationController的.用这个类初始化rootController就能够了.这里还有源 ...

  7. 洛谷 P2640 神秘磁石

    P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...

  8. Hi35xx NVR GDB调试

    Hi35xx NVR GDB调试   1. 下载gdb源代码 嵌入式Linux 的GDB 调试环境由Host 和Target 两部分组成,Host 端使用arm-linuxgdb,Target Boa ...

  9. Hibernate之API初识及增删改查实现

    声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习, ...

  10. bootstrap课程10 从外部引入视频到页面用什么标签

    bootstrap课程10 从外部引入视频到页面用什么标签 一.总结 一句话总结:a.iframe标签:b.embed标签:c.video标签 1.bootstrap具有响应式特性的嵌入内容如何实现? ...