[spark]spark 编程教程
参考:
英文: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
[spark]spark 编程教程的更多相关文章
- Spark Graphx编程指南
问题导读1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图?2.PageRank算法在图中发挥什么作用?3.三角形计数算法的作用是什么?Spark中文手册-编程指南Spark之一个快 ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- 实验5 Spark SQL编程初级实践
今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...
- Spark Streaming编程示例
近期也有开始研究使用spark streaming来实现流式处理.本文以流式计算word count为例,简单描述如何进行spark streaming编程. 1. 依赖的jar包 参考<分别用 ...
- <译>Spark Sreaming 编程指南
Spark Streaming 编程指南 Overview A Quick Example Basic Concepts Linking Initializing StreamingContext D ...
- 03、IDEA下Spark API编程
03.IDEA下Spark API编程 3.1 编程实现Word Count 3.1.1 创建Scala模块 3.1.2 添加maven支持,并引入spark依赖 <?xml version=& ...
- Spark SQL 编程API入门系列之SparkSQL的依赖
不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...
- 实验 5 Spark SQL 编程初级实践
实验 5 Spark SQL 编程初级实践 参考厦门大学林子雨 1. Spark SQL 基本操作 将下列 json 数据复制到你的 ubuntu 系统/usr/local/spark 下,并 ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- Spark—RDD编程常用转换算子代码实例
Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U] ...
随机推荐
- OpenCV —— 轮廓
把检测出的边缘像素组装成轮廓 —— cvFindContours OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储 ...
- JS实现下拉菜单的功能
<!DOCTYPE html> <html> <head> <meta charset = "utf8"> <title> ...
- 简单的WINFORM窗口,体验WINFORM带来的快感
当习惯成为一种自然,就不再喜欢那种条条框框的规则 using System; using System.Windows.Forms; namespace Window{ class Window{ s ...
- “此文件来自其他计算机,可能被阻止以帮助保护该计算机” 教你win7解除阻止程序运行怎么操作
win7 批量解除可执行文件的锁定 "此文件来自其他计算机,可能被阻止以帮助保护该计算机" http://blog.csdn.net/gscsnm/article/details/ ...
- 34.node.js之Url & QueryString模块
转自:https://i.cnblogs.com/posts?categoryid=1132005&page=6//引用 var url = require("url"); ...
- 关于mybatis里面的Executor--转载
原文地址:http://blog.csdn.net/w_intercool/article/details/7893344 使用mybatis查寻数据,跟踪其执行流程 最开始执行的语句 this.ge ...
- Mysql数据库的瓶颈处理一点建议
Mysql数据库的瓶颈处理一点建议 我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈的出 ...
- 配置spotlight连接linux服务器
本文转自(https://blog.csdn.net/qq_31391261/article/details/79429098) 一.配置spotlight连接linux服务器 1.以管理员身份运行软 ...
- POJ——T 1006 Biorhythms
http://poj.org/problem?id=1006 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 138219 ...
- OpenShift 自定义 OPENSHIFT_DOCUMENT_ROOT 变量,替换网站根目录路径!
OpenShift 自定义 OPENSHIFT_DOCUMENT_ROOT 变量,替换网站根目录路径! 预先定义的子目录 :) DIY: DocumentRoot=${OPENSHIFT_RE ...