1. 什么是RDD?
Resilient Distributed Dataset弹性分布式数据集,能够横跨集群所有节点进行并行计算的分区元素的集合。
2. Spark中两种类型的共享变量
一是广播变量(broadcast variables),用来在所有节点内存中缓存一个值;另外一种是累加器(accumulators),其只能执行添加操作(add)。
3. spark-submit命令
spark-submit --master yarn --name StreamingTest --driver-class-path ./conf --class com.sgcc.hj.StreamingTest --executor-memory 1G SparkTest.jar
--name 任务名称
--master 运行模式(local, yarn等)
--jar 额外运行的JAR包
--drive-class-path 设置classpath
--class main函数所在类
--executor-memory 每个executor占用最大内存
4. 并行集合
通过一个已有的集合,通过调用SparkContext的parallelize实现分布式数据集。
5. flatMap和map的区别
map将函数用于rdd中的每个元素,将返回值构建成新的rdd。
flatMap将函数应用于rdd中的每个元素,将返回值迭代器中所有元素构建成新的rdd,实际上就是先map后flat(扁平化)。
val str = sc.parallelize(List("I am a good student", "u can heat me", "but I like it")) str.map(x => x.split(" ")).collect Array[Array[String]] = Array(Array(I, am, a, good, student), Array(u, can, heat, me), Array(but, I, like, it)) str.flatMap(x => x.split(" ")).collect Array[String] = Array(I, am, a, good, student, u, can, heat, me, but, I, like, it) |
6. RDD中的两类操作
第一类是转换(transformation),从已经存在的数据集创建新的数据集;第二类是动作(action),在数据集上进行计算,返回一个值到驱动程序。例如map是转换,reduce是动作。
7. cache()和persist()的区别
cache方法最终还是调用persist方法,persist可以传入参数设定缓存级别,默认的是MEMORY_ONLY,两个方法都可以通过unpersist方法取消缓存。
8. Spark删除数据
Spark会自动监控每个节点缓存的使用情况,利用最近最少使用原则删除老旧的数据。如果想手动删除,使用unpersist方法。
9. 广播变量
缓存一个只读的变量在每台机器上,而不是任务上,通过调用SparkContext.broadcast方法将变量广播,调用时则通过value方法访问。
val bv = sc.broadcast(Array(1, 2, 3))
bv.value
10. 累加器
通过SparkContext.accumulator(v)方法从初始变量v中创建,运行在集群上时可以通过add方法或者+=操作符实现加值,调用时通过value方法访问。
val acc = sc.accumulatror(0, “acc1”) sc.parallelized(Array(1, 2, 3, 4)).foreach(x => acc += x) acc.value |
11. Spark streaming中几点注意点
一旦一个context已经启动,就不能有新的流算子建立并添加到context中。
一旦一个context已经停止,就不能重新启动。
在JVM中,同一时间只能有一个streaming处于活跃状态。
在StreamingContext上调用stop()方法,也会光比SparkContext对象,如果只想关闭StreamingContext,设置stop()可选参数为false。
一个SparkContext对象可以重复利用去创建对各StreamingContext对象,前提是之前的StreamingContext已经关闭,并且SparkContext没有关闭。
12. 离散流
离散流(DStream)是Spark Streaming中最基本的抽象,代表一个连续的数据流,由一系列RDD组成,每个RDD都包含确定时间间隔内的数据。
任务对DStream的操作都转换成了对DStreams中隐含的RDD的操作,多个DStream输入就需要对应多个Receiver进行接受。
Receiver作为一个长期运行的任务,其运行在executor上,并占有一个核(如果是本地运行,则对应一个线程),分配Streaming应用的核是很关键的。
13. 如何将RDD转换为SchemaRDD
一是利用反射推断模式,Spark的Scala接口可以自动将RDD转换为SchemaRDD,代码如下:
Case class Person(name: String, age: Int) val people = sc.textFile(“people.txt”).map(_.split(“ ”)).map(p => Person(p(0), p(1))) people.registerTempTable(“people”) val p = sqlContext.sql(“SELECT name , age FROM people) p.map(t => “Name: ” + t(0)).collect().foreach(println) |
当样本类不能提前确定,一个SchemaRDD可以通过三个步骤来创建,从原来的RDD创建一个行的RDD,创建一个StructType表示的模式与第一步创建的RDD的行结构相匹配,在行RDD上通过applySchema方法应用模式。