RDD
让开发者大大降低开发分布式应用程序的门槛,提高执行效率。
RDD源码:https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/rdd
RDD:弹性的分布式数据集,代表了不可变的,可分区的元素,这些元素能被并行操作。
弹性:指的是spark在分布式计算的时候可以容错
分布式:数据可能跨节点存储在不同的节点之上,计算也可以在不同节点上执行
一个RDD由多个partition构成
RDDA: (1,2,3,4,5,6,7,8,9) 对每个元素 +1 ,rdd会对每个partition操作,同时进行
hadoop001: Partition1:(1,2,3) +1
hadoop002: Partition2:(4,5,6) +1
hadoop003: Partition3: (7,8,9) +1
- RDD是抽象类:RDD必然是由子类实现的,使用时直接使用子类即可
- 序列化:序列化性能的好坏直接导致框架性能的优劣
- Logging:spark1.6可以直接用,2.0不可以用。自己写一个或者拷原来的来用。
- T: 泛型,rdd支持各种数据类型
RDD的三大必有特性
- 分区多
- 计算是作用在每一个分区上的
- 每个RDD之间有依赖关系,第一个RDD加载出来的,其余相互依赖
在spark中,计算时,有多少partition就对应有多少个task来执行
SparkContext
http://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#initializing-spark
spark程序的第一步 SparkConf --> SparkContext
sparkcontext告诉spark如何连接一个集群,运行在哪个模式上面 local standalone yarn mesos
创建SparkConf对象(键值对的方式),支持链式set。 SparkConf包含一些应用程序的信息(Application name, master, memory)
在集群上运行时,不要硬编码一个master。要通过spark-submit的方式提交master
object SparkContextApp {
def main(args: Array[String]): Unit = {
val sparkconf = new SparkConf().setAppName("sparkcontextApp11").setMaster("local[2]")
val sc =new SparkContext(sparkconf)
// ToDo... 业务逻辑代码
sc.stop()
}
}
spark-shell的使用
spark-shell是交互式命令行,直接输入命令就能得到结果,不需要借助idea了;一般用于测试,开发还是要IDEA+MAVEN
- 借助于–help
- 重要参数
–master 不建议硬编码指定master
–name 指定application的名称
–jars 以逗号分割,传入多个本地jar包
–conf 指定配置参数
–queue 队列
–num-executor 执行端的个数
spark-shell --master local[2]
spark-shell --master local[4] --jars code.jar
spark-shell --master local[4] --packages "org.example:example:0.1"
RDD的创建方式
- 把一个集合转换为RDD 测试的时候用