本来没打算学Spark 的,不过时机很逗。
最膜拜的大神做spark分享,还是其中最好玩的notebook。这不就是另外一个 HUE吗,但感觉更好玩。
刚好新的Spark 2.x 要问世了,大神在组织战队一起迭代。就此开始跟着大神脚后跟一点点的了解,学习争取入门吧。
https://github.com/endymecy/spark-programming-guide-zh-cn (官方文档)
https://www.gitbook.com/book/endymecy/spark-config-and-tuning/details (参数与调优)
术语总览:
transformation,action,RDD
job,task,stage
executor
persist 持久化(一般把RDD持久化到内存中)
两种抽象:
1. RDD 弹性分布式数据集,一个可并行操作的有容错机制的数据集合
2. shared variables 共享变量,包含两种
- broadcast variables 广播变量:缓存一个只读的变量在每台机器上面,而不是每个任务保存一份拷贝。 通过方法 var1.sc.broadcast(v) 创建, var1.value()可以查看它的值
- accumulator 累加器:一种只能通过关联操作进行“加”操作的变量,它能够高效的应用于并行操作中。 sc.accumulator(v)
并行集合:
parallelized collections, 可以在已有的集合上调用 sc.parallelize(yourCollection) 方法创建。
实例:
scala> val data=Array(1,2,3,4,5) # 创建一个已有集合
data: Array[Int] = Array(1, 2, 3, 4, 5) scala> val distData=sc.parallelize(data) # 复制成一个并行数据集,即RDD
distData: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:17 scala> distData.reduce((a,b)=>a+b) # 并行计算总和
res4: Int = 15
并行集合一个很重要的参数是切片数(slices),表示一个并行数据集切分的份数。
一般Spark可以自动决定,你也可以通过设置,在第二个参数如 sc.parallelize(data, 10)
外部数据集:
Spark 支持文本文件(text files),SequenceFiles 和其他 Hadoop InputFormat。
通过 sc.textFile 来创建,然后可以对之做分布式操作。
实例:
scala> val text1=sc.textFile("/data/test/test_yy.txt") # 把文件导入为并行数据集,即RDD
text1: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[4] at textFile at <console>:15 scala> text1.map(s=>s.length).reduce((a,b)=>a+b) # 并行计算文件的行数
res5: Int = 8
RDD操作
- 转换(transformations) 从已经存在的数据集中创建一个新的数据集;
- 动作(actions) 在数据集上进行计算之后返回一个值到驱动程序
常用的一些transformation:
- map(func)
- filter(func)
- flatmap(func) 类似于 map,但是每个输入项能被映射成多个输出项(所以 func 必须返回一个 Seq,而不是单个 item)
常用的一些actions:
RDD 持久化(persist)
- RDD持久化其实也就是缓存的问题,通过各种操作(operations)持久化(或者缓存)一个集合到内存中。
- 可以通过
persist()
或者cache()
方法持久化一个rdd。 - Spark的缓存是容错的:如果RDD的任何一个分区丢失,它可以通过原有的转换(transformations)操作自动的重复计算并且创建出这个分区
DStream
离散数据流(discretized stream)是Spark Streaming支持的一个高级抽象。
可以利用从Kafka, Flume和Kinesis等源获取的输入数据流创建,也可以在其他DStream的基础上通过高阶函数获得。在内部,DStream是由一系列RDDs组成。
Checkpoint
不同的集群管理器:
- Spark Standalone 独立的Spark集群
- Mesos
- YARN 使用了YARN的资源分配策略