val sc=new SparkContext("spark://localhost:7077","ApplicationName","SPARK_HOME","Your_APP_Jar") //创建操作:SparkContext负责创建Spark上下文环境
val file=sc.textFile("hdfs://localhost:9000/.../Log") //从HDFS中读取文件val filterRDD=file.filter(_.contains("Hello World")) //转换操作:将一个RDD转换成另一个RDDfilterRDD.cache() //控制操作:默认将该RDD缓存在内存中filterRDD.count() //行动操作:触发Spark运行的操作(Spark是惰性计算)
RDD(Resilient Distributed DataSets):弹性分布式数据集,即一个RDD代表一个被分区的只读数据集。
RDD是一个分区的数据集,那么肯定具备分区的属性:
val rdd=sc.parallelize(1 to 100,2) //分区数是2
rdd.partitions.size //结果是2
也可以不指定分区数,默认值,是这个程序所分配到的资源的CPU核的个数。
RDD来源:1.内存集合和外部存储系统,2.通过转换操作
RDD优先位置
Spark是“移动数据 不如 移动计算”的理念,尽可能的将任务分配到数据块所在的存储的位置。
preferredLocations 返回每一个数据块所在的机器名或者IP地址,如果每一块数据是多分存储,那就返回多个机器地址。
val rdd=sc.textFile("hdfs://localhost:9000/.../Log") //从HDFS中读取文件
val hadoopRDD=rdd.dependencies(0).rdd //找到最原始的RDD
hadoopRDD.partitions.size //最原始的RDD的分区数
hadoopRDD.preferredLocations(hadoopRDD.partitions(0)) //返回第一个分区的机器地址
RDD依赖关系
(以父RDD的一个分区为出发点讨论,只需要看父RDD的一个分区被几个子RDD的分区依赖就行)
窄依赖(Narrow Dependencies):每一个父RDD的分区最多只被子RDD的一个分区所使用。1 :1
宽依赖 (Wide Dependencies):多个子RDD的分区会依赖同一个父RDD的分区。1 :多