1. 必须作用在K , V 格式的RDD上的算子
GroupByKey, reduceByKey, join, sortByKey 因为这些算子会产生 shuffle, 所以必须必须作用在 K, V 格式的RDD上
2. Spark任务执行的流程
Driver(进程) 作用:
任务的分发
接收 task 的执行结果
接收 task 的执行情况
心跳
总结: Driver会跟集群进行频繁的通信
3. 算子
1. 转换算子
1. map 算子 , 对一行数据进行处理, 结果还是一行数据
public static void main(String[] args) { String path = "/home/test/b.txt"; SparkConf conf = new SparkConf().setAppName("sparkTest").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> linesRdd = sc.textFile(path); JavaRDD<String> mapRdd = linesRdd.map(new Function<String, String>() { private static final long serialVersionUID = 1L; @Override public String call(String line) throws Exception { System.out.println(line+"======="); return null; } }); long count = mapRdd.count(); System.out.println(count); }
2. flatMap 算子, 会对 list 中的没一条作为一条新记录来对待
public static void main(String[] args) { String path = "/home/test/b.txt"; SparkConf conf = new SparkConf().setAppName("sparkTest").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> linesRdd = sc.textFile(path); JavaRDD<String> flatMapRdd = linesRdd.flatMap(new FlatMapFunction<String, String>() { private static final long serialVersionUID = 1L; @Override public Iterable<String> call(String line) throws Exception { System.out.println(line); return Arrays.asList(line.split(" ")); } }); System.out.println(flatMapRdd.count()); }
3. mapToPair 算子, 想要将一个Rdd转换为 K, V 格式的Rdd, 必读使用mapToPair 算子来转换
JavaPairRDD<String, Integer> mapToPairRdd = flatMapRdd.mapToPair(new PairFunction<String, String, Integer>() { private static final long serialVersionUID = 1L; @Override public Tuple2<String, Integer> call(String line) throws Exception { return new Tuple2<String, Integer>(line, 1); } });
4. union 算子, 将 2 个类型相同的 Rdd 进行合并, 不去重
5. cartesian 算子, 将 2 个Rdd 进行笛卡尔积 计算, 得到一个 K, V 格式的Rdd
JavaPairRDD<String, String> cartesian = rdd1.cartesian(rdd2);
6. groupBy 算子,
2. 行动算子
3. 控制算子
cache 是一个懒加载, cache 默认情况下是将Rdd数据放入到内存中,linesRdd = linesRdd.cache();
persist 可以手动指定持久化的级别, 例如: linesRdd.persist(StorageLevel.MEMORY_ONLY()); 只有内存, 也就相当于了 cache
使用 cache 和persist 的注意对象:
1. cache 和persist的返回值必须赋值给一个变量
2. cache和persist 算子后不能立即紧跟action类算子
checkpoint