RDD五大特性
A list of partitions
RDD是一个由多个partition(某个节点里的某一片连续的数据)组成的的list;将数据加载为RDD时,一般会遵循数据的本地性(一般一个hdfs里的block会加载为一个partition)。A function for computing each split
一个函数计算每一个分片,RDD的每个partition上面都会有function,也就是函数应用,其作用是实现RDD之间partition的转换。A list of dependencies on other RDDs
RDD会记录它的依赖 ,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
可选项,最优的位置去计算,也就是数据的本地性。(移动计算而不是移动数据)
RDD创建
宏观上看,每个Spark应用程序都由一个驱动程序组成,该驱动程序运行用户的main方法,并在集群上执行各种并行操作。Spark提供的主要抽象是一个弹性分布式数据集(RDD),它是跨集群节点划分的元素集合,可以并行操作。rdd是通过从Hadoop文件系统(或任何其他Hadoop支持的文件系统)中的一个文件或驱动程序中现有的Scala集合开始创建的,并对其进行转换。用户还可能要求Spark在内存中持久化一个RDD,以便在多个并行操作中有效地重用它。并且,rdd可以自动从节点故障中恢复。
-
从驱动程序中现有的Scala集合开始创建
def createFromMemory() = { val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD1") val sc = new SparkContext(sparkConf) val data = Array(1, 2, 3, 4, 5) //val distData = sc.parallelize(data) // 底层调用parallelize val distData = sc.makeRDD(data) distData.collect().foreach(println) sc.stop() }
-
通过从Hadoop文件系统(或任何其他Hadoop支持的文件系统)中的一个文件创建
def createFromFile() = { val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD2") val sc = new SparkContext(sparkConf) // path路径默认以当前环境的根路径(SparkLearning)为基准 val rddFile = sc.textFile("datas") // wholeTextFiles 返回元组 含文件位置信息,整个文件的内容 val rddWholeFile = sc.wholeTextFiles("datas") rddFile.collect