1、spark架构设计
相关名词术语解释
1.RDD
弹性分布式数据集,数据集在spark上的一种抽象
只读,可分区的分布式数据集合
一个RDD 包含多个分区Partition
2.Partition
Partition 类似hadoop的Split中的block
划分依据很多:hash分区、范围分区、也可自己定义
一个partition交给一个task去计算处理
3.算子
op,即为映射、关系、变换
两大类:transformation和action
4.tansformation类算子
延迟计算,从一个RDD到另一个RDD转换,有action操作才会触发运算
5.Action类算子
触发spark提交作业,数据输出spark系统
6.窄依赖(一对一)
父rdd分区被一个子rdd分区使用
7.宽依赖(一对多)
父rdd分区被子rdd多个分区使用
8.Application
和MapReduce中的job或者yarn中的application类似
一般指整个Spark项目从开发、测试、布署、运行的全部。
9.Driver
驱动程序,main函数且创建sparkContext的程序
10.Cluster Manager
集群资源管理器,在集群上获取资源的服务
11.WorkerNode
集群中运行spark应用代码的节点
物理机器节点,可以启动Executor进程
12.Executor
Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立专享的一批Executor。
Executor资源容器,真正承载task的运行管理,以多线程运行task
13.Task
分配到executor上的基本工作单元,执行实际的计算任务。
Task分为两类,即为ShuffleMapTask和ResultTask。
ShuffleMapTask:即为Map任务和发生Shuffle的任务的操作,由Transformation操作组成,其输出结果是为下个阶段任务(ResultTask)进行做准备,不是最终要输出的结果。
ResultTask:即为Action操作触发的Job作业的最后一个阶段任务,其输出结果即为Application最终的输出或存储结果。
线程和进程的区别和联系
均代表了一部分资源和计算能力的抽象
进程比线程的范围要更高一级,进程是由线程组成的。即进程比线程要更重量级。
进程是操作系统进行资源分配的最小单元。
线程是操作系统任务执行、使用CPU的最小执行单元。
1.2 spark-shell
启动方式
spark-shell --master local[2]
以本地两个线程模拟运算spark相关操作,数量与本机的cpu核数一致最佳
相关参数
参数列表获取方式:spark-shell --help
1.3 开发和测试环境准备
1、初始化spark conf,包括 appname,master参数
2、构建java spark context
3、定义输入文件路径,本地或是hdfs均可
4、通过jsc.textFile()拿到文件路径对应的fileRDD,其内部是文本行形式,也可称为lineRDD
5、lineRDD => word rdd
6、word rdd => (word,1) rdd
7、(word,1) rdd => (word,freq) rdd
8、(word,freq) rdd => collect本地化数据
9、对本地化数据进行处理,比如打印
10、关掉上下文环境变量
public class SparkWordCount4Java {
public static void main(String[] args) {
/**
* * 1、初始化spark conf,包括 appname,master参数
*/
SparkConf conf=new SparkConf();
conf.setAppName("java-sparkwordcount-job019");
conf.setMaster("local[2]");
/**
* 2、构建java spark context
*/
JavaSparkContext jsc=new JavaSparkContext(conf);
/**
* 3、定义输入文件路径,本地或是hdfs均可
*/
String filePath="file:C:/Users/USB/Desktop/SpackTest.txt";
/**
* 4、通过jsc拿到文件路径对应的fileRDD,其内部是文本行形式line形式, 也可称为lineRDD
*/
JavaRDD<String> linesRDD=jsc.textFile(filePath);
/**
* 5、lineRDD => word rdd
*/
JavaRDD<String> wordRDD=linesRDD.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String line) throws Exception {
return Arrays.asList(line.split(",")).iterator();
}
});
/**
* 6、word rdd => (word,1) rdd
*/
JavaPairRDD<String,Integer> kvRDD=wordRDD.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String,Integer>(word,1);
}
});
/**
* 7、(word,1) rdd => (word,freq) rdd
*/
JavaPairRDD<String,Integer> wcRDD=kvRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1+v2;
}
});
/**
* 8、(word,freq) rdd => collect本地化数据
*/
List<Tuple2<String, Integer>> wcList=wcRDD.collect();
/**
* 9、对本地化数据进行处理,比如打印
*/
for(Tuple2<String,Integer> tuple2:wcList){
System.out.println(tuple2.toString());
}
/**
* 10、关掉上下文环境变量
*/
jsc.stop();
System.out.println("done!!!");
}
}
1.4 三种运行方式
编写脚本运行
#! /bin/sh
# 配置成hadoop配置文件存放目录
export HADOOP_CONF_DIR=/usr/hdp/3.1.0.0-78/hadoop/conf/
spark-submit \
--class com.tl.job014.spark.SparkWordCount4Java \
--master local[2] \本地
--master yarn-client \ 集群方式yarn-client运行
--master yarn-cluster \ 读取hdfs分布式文件系统
--driver-memory 512m \
--executor-memory 512m \
--num-executors 2 \
/home/zel/job014/FirstSparkWordCount4Java/FirstSpark4Java-jar-with-dependencies.jar \
file:///home/zel/job014/FirstSparkWordCount4Java/input.txt
#hdfs://cluster0.hadoop:8020/tmp/spark/input.txt
linux 本地方式
开发环境打包:跟之前的maven打包完全一致
编写Shell运行脚本:
注意修改代码中的setMaster代码,将之前代码设置注释掉
String filePath=“file:C:/Users/USB/Desktop/SpackTest.txt”; 改为动态传参
string filePath=null;
if(args==null || args.length!=1){
System.out.println("输入有误,请检查!!");
System.exit(-1);
}
filePath=args[0];
本地测试:打开setmaster 右击run as->run congigration->arguments->filePath:///…
测试完毕,关闭setmaster -> maven install
集群方式
注意输入路径,应改为hdfs等分布式文件系统的路径
yarn-client等于–master设置成yarn,deploy-mode设置成client
yarn-cluster
注意输入路径,应改为hdfs等分布式文件系统的路径
yarn-cluster等于–master设置成yarn,–deploy-mode设置成cluster
1.5 maven构建scala项目
搭建步骤
1)安装对应的maven构建scala的archetype
2)新建maven scala archetype项目
3)修改模板构建完成项目配置参数
4)运行模板自带的scala案例
5)自定义编程实现HelloWorld案例
6)package打包-不带依赖jar的打包
7)package打包-带依赖jar的all-in-one打包
在window运行jar
java -cp ./F...jar com....test
1
2.算子分析与应用
2.1 准换算子(不触发提交,提交后才启动转换计算)
value型:
输入输出一对一:map flatMap mapPartitions
输入输出多对一:union cartesian
输入输出多对多:groupBy
输出为输入子集:filter distinct subtract sample takeSample
cache型:cache persist
key-value型:
一对一:mapValues
单个RDD聚集:combineByKey reduceByKey partitionBy
两个RDD:cogroup
连接:join leftOutJoin rightOutJoin
2.2 行动算子(触发sparkContext提交作业)
无输出(不到hdfs、本地):foreach
HDFS:saveAsTextFile saveAsObjectFile
scala集合数据类型:collect collectAsMap reduceByKeyLocally lookup count
top reduce fold aggregate