三部分的内容
1、Spark Core:内核,是Spark中最重要的内容,相当于MapReduce
Spark Core和MapReduce都是进行离线计算
Spark Core的核心:RDD(弹性分布式数据集),由分区组成
2、Spark SQL:相当于Hive、Pig
支持SQL和DSL语句 -----> Spark任务(RDD) -----> 运行
3、Spark Streaming:相当于Storm
本质:把连续的数据 -----> 不连续的数据DStream(离散流):本质就是RDD
Spark Core课程内容
一、什么是Spark
1、为什么要学习Spark?讨论MapReduce的缺点不足
(*)MapReduce的缺点不足:核心Shuffle---> 产生大量I/O
(*)什么是Spark?http://spark.apache.org/
Apache Spark™ is a unified analytics engine for large-scale data processing.
2、Spark的特点:基于内存
(1)快
(2)易用
(3)通用
(4)兼容性
参考官网
二、Spark的体系结构与部署(重点)
1、体系结构:主从结构(单点故障)
官网提供了一张图 http://spark.apache.org/docs/latest/cluster-overview.html
2、安装部署
(1)伪分布
(2)全分布
3、Spark HA:两种方式
(1)基于文件目录: 用于开发测试
(2)基于ZooKeeper:用于生产环境
三、执行Spark Demo程序
1、执行Spark任务的工具
(1)spark-submit: 相当于 hadoop jar 命令 ---> 提交MapReduce任务(jar文件 )
提交Spark的任务(jar文件 )
(2)spark-shell:类似Scala的REPL命令行,类似Oracle中的SQL*PLUS
Spark的交互式命令行
2、使用IDEA或者Scala IDE开发程序:WordCount
(1)Java版本
(2)Scala版本
package scala
import org.apache.spark.{SparkConf, SparkContext}
object MyWordCound {
// bin/spark-submit --class scala.MyWordCound scalajardemo.jar hdfs://10.1.255.132:9000/source/demo.txt hdfs://10.1.255.132:9000/20190515
def main(args: Array[String]): Unit = {
//创建任务配置信息
//如果数组master= local 表示运行在本地模式上
//如果运行在集群模式上,不需要设置master
val conf = new SparkConf().setAppName("MyWordCount")/*.setMaster("local")*/
//创建一个SparkContext对象
var sc = new SparkContext(conf)
//执行wordcount
var result = sc.textFile(/*"hdfs://10.1.255.132:9000/source/reba.txt"*/ args(0))
.flatMap(_.split(" "))
.map((_,1))
.reduceByKey(_+_)//.collect()
//打印在屏幕上
//result.foreach(println)
//写入到hdfs中
result.saveAsTextFile(args(1))
//停止SparkContext
sc.stop()
}
}
本地模式:
package spark;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class SparkDemo {
public static void main(String [] args){
SparkConf conf = new SparkConf().setAppName("MyWordCount").setMaster("local");
//SparkContext conf = new SparkContext();
//创建一个SparkContext对象 JavaSparkContext对象
JavaSparkContext sc = new JavaSparkContext(conf);
//读入HDFS数据
JavaRDD<String> rdd1 = sc.textFile("hdfs://10.1.255.132:9000/source/reba.txt");
//分词 FlatMapFunction :接口,用于处理分词的操作
/**
* 泛型:String 读入的每一句话
* U:返回值 ----> String 单词
*
* */
JavaRDD<String> rdd2 = rdd1.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String input) throws Exception {
//分词操作
return Arrays.asList(input.split(" ")).iterator();
}
});
/**
*
*
* 每个单词及一个数目
* String 单词
* K2
* V2
*
* */
JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String , Integer >() {
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String,Integer>(word,1);
}
});
/**
*
* 执行reduce 操作
* Integer:
* Integer:
* Integer:
* */
JavaPairRDD<String,Integer> rdd4 = rdd3.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
//累加操作
return null;
}
});
//执行计算,把结果打印到屏幕上
List<Tuple2<String,Integer>> result = rdd4.collect();
for (Tuple2<String,Integer> tuple : result) {
System.out.println(tuple._1+"\t"+tuple._2);
}
}
}
集群模式:
package spark;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
// bin/spark-submit --class spark.SparkDemo scalajardemo.jar hdfs://10.1.255.132:9000/source/demo.txt
public class SparkDemo {
public static void main(String [] args){
//集群模式
SparkConf conf = new SparkConf().setAppName("MyWordCount")/*.setMaster("local");*/;
//SparkContext conf = new SparkContext();
//创建一个SparkContext对象 JavaSparkContext对象
JavaSparkContext sc = new JavaSparkContext(conf);
//读入HDFS数据
JavaRDD<String> rdd1 = sc.textFile(/*"hdfs://10.1.255.132:9000/source/reba.txt"*/
args[0]);
//分词 FlatMapFunction :接口,用于处理分词的操作
/**
* 泛型:String 读入的每一句话
* U:返回值 ----> String 单词
*
* */
JavaRDD<String> rdd2 = rdd1.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String input) throws Exception {
//分词操作
return Arrays.asList(input.split(" ")).iterator();
}
});
/**
*
*
* 每个单词及一个数目
* String 单词
* K2
* V2
*
* */
JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String , Integer >() {
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String,Integer>(word,1);
}
});
/**
*
* 执行reduce 操作
* Integer:
* Integer:
* Integer:
* */
JavaPairRDD<String,Integer> rdd4 = rdd3.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
//累加操作
return null;
}
});
//执行计算,把结果打印到屏幕上
List<Tuple2<String,Integer>> result = rdd4.collect();
for (Tuple2<String,Integer> tuple : result) {
System.out.println(tuple._1+"\t"+tuple._2);
}
}
}
四、Spark执行原理分析
1、分析WordCount程序处理过程
2、Spark提交任务的流程:类似Yarn调度任务的过程