一、RDD简介
RDD:弹性、分布式、数据集(resilient distrubuted dataset)
1、弹性:分区数量可以调整
2、分布式:
- 可分区的集合(partitioned collection)
- 对于分区的数据可以以并行的方式操作(parallel)
3、数据集
- 不可变的(immutable):RDDA==>map==>RDDB(新的RDD)
简单来说,RDD是一个可以拆分,以并行方式处理的数据集
二、RDD特性
1、一系列的分区(A list of partitions)
2、对RDD进行fun就是对每个分区(split)进行fun(A function for computing each split)
3、RDD之间有依赖关系 (A list of dependencies on other RDDS)==>可以恢复数据,达到容错
4、分区器作用在KV类型的RDD上(A Partioner for key-value RDDS)
5、最佳计算位置:移动计算,而不是移动数据
三、RDD操作
3.1 入口点:SparkContext
val sparkConf = new SparkConf().setMaster("local").setAppName(this.getClass.getSimpleName)
val sc = new SparkContext(sparkConf)
SparkConf的核心数据结构是:K-V
private val settings = new ConcurrentHashMap[String, String]()
setMaster源码
def setMaster(master: String): SparkConf = {
set("spark.master", master)
}
如果要定义自己的参数传递到Spark中,要以spark.开头
3.2 RDD的创建
1、测试
//numSlices分区数,如果不设置默认使用local[core]
val rdd = sc.parallelize(Array(1,2,3),2)
2、外部数据源
val distFile = sc.textFile("data.txt")
textFile源码
def textFile(
path: String,
minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
assertNotStopped()
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
minPartitions).map(pair => pair._2.toString).setName(path)
}
底层还是使用HadoopFile读取数据,返回HadoopRDD,也就是返回偏移量和数据,但是偏移量没有用,所以再对Tuple(offset,line)进行map取第二个元素获取每行数据内容,最终返回MapPartitionRDD.