spark RDD与集群提交任务
RDD 的介绍:
1,一组分片。数据集的基本单位,每个分片都被一个计算任务进行处理,相当于集群分节点。默认是CPU的 core数,创建RDD过程可以指定分片数量
2,一个计算每个分区的函数,RDD之中计算是按照分片为单位的,每一个分片都会实现computer函数来达到这个目的
3,RDD的每一次转换都生成一个新的RDD,所以RDD之间形成流水线的前后依赖,如果RDD丢失,完全可以根据依赖进行恢复
4,一个 Partitioner (分区器),即RDD的分片函数,一个是基于哈希的 HashPartitioner,一个是基于范围的RangePartitioner,只有对于key-value的RDD才有Partitioner
5,一个列表,存储每一个 Partitioner的优先位置,对于一个HDFS 来说,这个列表保存的是每一个 Partitioner 的所在的块位置,因为spark会尽可能的将计算任务分配到其所要处理的数据块位置.也就是说'移动数据不如移动计算',数据在哪,计算逻辑就在那
rdd 弹性表现:
1,存储的弹性:内存与磁盘的自动切换
2,容错的弹性:数据丢失可以自动恢复(根据"血统"进行恢复,从上一个RDD恢复)
3,计算的弹性:计算出错重试机制
4,分片的弹性:根据需要重新分片(根据数据量的进行分片)
spark 提交任务:
1,首先查看代码逻辑与进行编译jar包(maven)
package day02 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object sparkconnect { // args 两个参数 一个是读取的内容,一个是存到什么位置! def main(args: Array[String]): Unit = { // 设置 app 名称 以及开启最大线程数个线程 // val con:SparkConf = new SparkConf().setAppName("sparkwc").setMaster("local[*]") val con:SparkConf = new SparkConf().setAppName("sparkwc") // 集群之中! // 上下文对象! val sc:SparkContext = new SparkContext(con) // SparkContext的方法称之为算子!如果加载本地文件, 那么就会按照 32M 进行分区(默认) val line = sc.textFile(args(0)) //读取数据放到 line 之中! val worlds:RDD[String] = line.flatMap(_.split(" ")) val paired:RDD[(String,Int)] = worlds.map((_,1)) val reduce:RDD[(String,Int)] = paired.reduceByKey(_+_) //相同 k 的 value 聚合到一块! val res:RDD[(String,Int)] = reduce.sortBy(_._2,false) //false 倒叙排列! res.saveAsTextFile(args(1)) //保存结果 // println(res.collect().toBuffer) // 结束任务 不结束占用线程! sc.stop() } }
2,集群提交jar 包,指定运行类,jar包,参数!
sudo ./bin/spark-submit --class day02.sparkconnect --executor-memory 20M --executor-cores 1 /home/hadoop/sfd-1.0-SNAPSHOT.jar hdfs://master:9000/wc/1.txt hdfs://master:9000/wc1
3,使用spark-shell RDD计算
./bin/spark-shell --executor-memory 20M --total-executor