spark开发
1. 主要参考资料
http://spark.incubator.apache.org/docs/latest/scala-programming-guide.html
http://www.eecs.berkeley.edu/Pubs/TechRpts/2011/EECS-2011-82.pdf
2. 简介
每个Spark应用,都有一个驱动程序,它运行main函数,在集群上执行各种并行运算。Spark的最重要的抽象是RDD--Resilient Distributed Data(弹性分布式数据)。RDD存储数据,这些数据分布在Spark集群的各种节点上,这些数据可以进行并行计算。可以从一个HDFS文件或者类似的文件系统创建RDD,也可以从Scala的Collection创建RDD,也可以从另外一个RDD处理之后创建。RDD可以持久化到内存里。RDD可以自动从节点失效中恢复。
Spark第二个抽象是Shared Variables--共享变量,用于并行计算。Spark有两种共享变量:Broadcast varibles--广播变量,它在所有节点的内存里缓存一个值;Accumulators--累积量,它们只能被“加”起来,比如计数器或者是“求和”。
3. Spark程序的第一步是初始化SparkContext,它通知Spark如何获取一个集群:
val sc = new SparkContext(master, appName, [sparkHome], [jars])
参数master指明集群的地址,是字符串,master可以是"local"--在本地单机运行,也可以是Spark或者Mesos集群的URL。
参数appName是Spark应用的名称,会在集群的web界面里显示出来。
参数sparkHome是spark的安装目录,注意,集群内所有节点的Spark必须安装在同样的目录下。
参数jars是打包后的Spark应用,是本地目录,这些Jar包会被复制发送到集群内的所有节点执行。
如果是运行Spark Shell,那么它会自从创建一个SparkContext,变量名sc,不要在Spark Shell创建新的SparkContext,不会生效的。在运行Spark Shell之前,可以指定环境变量,让Spark知道使用哪个集群,也可以用ADD_JARS环境变量把JARS添加到classpath。比如,如果想在spakr-shell在本地4核的cpu运行,需要如下方式启动:
$MASTER=local[4] ./spark-shell
这里的4,是启动4个工作线程。
如果要添加JARS,可以如下:
$MASTER=local[4] ADD_JARS=code.jar ./spark-shell
4. Master URLs
Master的URL有4中:
local,本地,单线程
local[K],本地,K个线程
spark://HOST:PORT,在spark集群上运行。
mesos://HOST:PORT,在Mesos集群上运行。
5. RDD-弹性分布式数据
Spark以RDD为核心概念开发的,它的运行也是以RDD为中心。有两种RDD:第一种是并行Collections,它是Scala collection,可以进行并行计算;第二种是Hadoop数据集,它是并行计算HDFS文件的每条记录,凡是Hadoop支持的文件系统,都可以进行操作。这两种RDD都以同样的方式处理。
6. RDD之 并行Collections
并行Collections由SparkContext的parallelize方法,在一个已经存在的Scala collection上创建。这个collection上的成员会被copy成分布式数据库,也就是copy到所有节点,于是就可以进行并行计算了。举例如下:
#scala的collection
scala> val data = Array(1, 2, 3, 4, 5)
data: Array[Int] = Array(1, 2, 3, 4, 5)
#并行collection
scala> val distData = sc.parallelize(data)
distData: spark.RDD[Int] = spark.ParallelCollection@10d13e3e
第一条语句创建一个Scala collection,第二条语句将它转化成并行collection。并行collection有一个重要参数,就是slices数,spark在进行计算的时候,每个slice对应一个task。通常,一个CPU对应2~4个slice。一般情况下,Sparkt会根据集群的状况,自动计算slice,也可以手动指定,比如说,paralize(data,10)就是指定了10个slice。
7. RDD之 Hadoop数据集
Spark支持在任何Hadoop能处理的文件系统上创建分布式数据集,包括本地文件系统,Amazon S3,Hypertable,HBase等等。Spark支持文本文件,序列文件,以及任何Hadoop的InputFormat。
比如,从文本文件创建数据集的方式如下:
scala> val distFile = sc.textFile("data.txt")
distFile: spark.RDD[String] = spark.HadoopRDD@1d4cee08
如果给distFile设置slice数量,形如sc.textFile("data.txt",5)。默认情况下,sparkt为data.txt的每个block块设置一个slice,注意,手工设置的slice数,只能比文件的block块数量大,不能比它小。
对于SequenceFile-序列文件,SparkContext的sequenceFile[k, v]函数将它转化成RDD。
对其他的Hadoop InputFormat,SparkContext.hadoopRDD方法处理。
8. RDD运算
RDD支持两种运算:变换transformation-从已有的RDD创建一个新的RDD,如map;或者从action中创建RDD,如reduce。
Spark的transformation都是lazy的,Spark会记下这些transformation,不立刻计算结果,直到action需要返回结果的时候再进行计算。
默认情况下,每个RDD的transformation都会重新计算,但如果将RDD用persisi持久化到内存里,或者缓存到内存里,它就不重新计算了,由此加快查询速度。
9. RDD持久化
如果一个RDD被持久化了,那么,每个节点都会存数这个RDD的所有slice,于是可以在内存进行计算,可以重用,这样可以让后来的action计算的更快,通常会把速度提高至少十倍。对迭代式计算来说,持久化非常关键。RDD的persisi方法和cache方法都可以进行持久化。RDD是容错的--如果它的任何部分丢失了,都会重新计算创建。
RDD有不同的存储方式,可以存在硬盘,或者内存,或者复制到所有节点。而chach函数只有一个默认的存储方式就是内存。
10. 共享变量-广播变量
广播变量--在集群的每个节点机器上都缓存一个只读的变量,比如说,每个节点都保存一份输入数据的只读缓存。
广播变量的使用方式:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: spark.Broadcast[Array[Int] = spark.Broadcast(b5c40191-a864-4c7d-b9bf-d87e1a4e787c)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
注意:创建了广播变量之后,就不能使用v了,要使用broadcaseCar;v值不能修改。
11. 共享变量-累计量:
只要是用作计数器counter或者求和sum,只能做add运算,例子如下:
scala> val accum = sc.accumulator(0)
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.value
res2: Int = 10
spark开发的更多相关文章
- Windows下单机安装Spark开发环境
机器:windows 10 64位. 因Spark支持java.python等语言,所以尝试安装了两种语言环境下的spark开发环境. 1.Java下Spark开发环境搭建 1.1.jdk安装 安装o ...
- 使用Intellij IDEA构建spark开发环境
近期开始研究学习spark,开发环境有多种,由于习惯使用STS的maven项目,但是按照许多资料的方法尝试以后并没有成功,也可能是我环境问题:也可以是用scala中自带的eclipse,但是不太习惯, ...
- Spark开发指南
原文链接http://www.sxt.cn/info-2730-u-756.html 目录 Spark开发指南 简介 接入Spark Java 初始化Spark Java 弹性分布式数据集 并行集合 ...
- windows下spark开发环境配置
http://www.cnblogs.com/davidwang456/p/5032766.html windows下spark开发环境配置 --本篇随笔由同事葛同学提供. windows下spark ...
- Spark编译及spark开发环境搭建
最近需要将生产环境的spark1.3版本升级到spark1.6(尽管spark2.0已经发布一段时间了,稳定可靠起见,还是选择了spark1.6),同时需要基于spark开发一些中间件,因此需要搭建一 ...
- Windows环境下在IDEA编辑器中spark开发安装步骤
以下是windows环境下安装spark的过程: 1.安装JDK(version:1.8.0.152) 2.安装scala(version:2.11/2.12) 3.安装spark(version:s ...
- Intellij IDEA使用Maven搭建spark开发环境(scala)
如何一步一步地在Intellij IDEA使用Maven搭建spark开发环境,并基于scala编写简单的spark中wordcount实例. 1.准备工作 首先需要在你电脑上安装jdk和scala以 ...
- Spark开发环境
1. Win7下利用Intellij IDEA构建Spark开发环境 前提:Intellij IDEA Community 免费版下载(最新版14.0.1),Scala插件下载(最新版scala-in ...
- 分别用Eclipse和IDEA搭建Scala+Spark开发环境
开发机器上安装jdk1.7.0_60和scala2.10.4,配置好相关环境变量.网上资料很多,安装过程忽略.此外,Eclipse使用Luna4.4.1,IDEA使用14.0.2版本. 1. Ecli ...
- Spark 开发环境搭建
原文见 http://xiguada.org/spark-develop/ 本文基于Spark 0.9.0,由于它基于Scala 2.10,因此必须安装Scala 2.10,否则将无法运行Spar ...
随机推荐
- meta小解
meta是html中的一个辅助标签,位于<head>与<title>之间,它能提供用户不可见的信息,数据结构为键值对 meta标签格式<meta http-equiv/n ...
- SpringMVC 系列教程1-文件上传-配置
SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...
- NIO 入门
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.通过定义包含数据的类,以及通过以块的形式处 ...
- mybatis配置sql超时时间
mybatis如果不配置,默认超时时间是不做限制的.当系统慢sql很多时,势必会增加数据库压力,系统性能及稳定性降低.所以有必要要设置sql超时设置,下面配置超时时间是5分钟. 第一步:全局配置如下 ...
- scala正则表达式
正则表达式 Scala 通过 scala.util.matching 包种的 Regex 类来支持正则表达式 scala.util.matching.Regex.构造一个Regex对象, ...
- Java线程池主线程等待子线程执行完成
今天讨论一个入门级的话题, 不然没东西更新对不起空间和域名~~ 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完后再把那段逻辑的处理结果进行汇总的产景, 这时候就需要使用线程了. 一 ...
- How to solve java.net.SocketTimeoutException:60000millis problem in HDFS
Many HDFS users encounter the following error when DFSClient ready file from a certain Data Node. & ...
- jQuery切换网页皮肤并保存到Cookie示例代码
经过使用,靠谱! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- js--事件对象的理解1
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 举例鼠标操作导致的事件对象中,会包含鼠标位 ...
- mysql 批量修改表前缀
直接贴码: SELECT a.*, concat( 'alter table ', a.TABLE_NAME, ' rename ge_', SUBSTR( a.TABLE_NAME FROM INS ...