一、几个概念
1.1 Spark集群(分布式计算)
一组计算机的集合,每个计算机节点作为独立的计算资源,又可以虚拟出多个具备计算能力的虚拟机,这些虚拟机是集群中的计算单元。Spark集群支持Standalone、Mesos、Yarn三种集群部署模式。
1. Standalone: 独立模式,Spark 原生的简单集群管理器, 自带完整的服务, 可单独部署到一个集群中,无需依赖任何其他资源管理系统, 使用 Standalone 可以很方便地搭建一个集群,一般在公司内部没有搭建其他资源管理框架的时候才会使用。
2. Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 yarn,由于mesos这种方式目前应用的比较少。
3. YARN(hadoop yarn): 统一的资源管理机制, 在上面可以运行多套计算框架,根据 driver 在集群中的位置不同,分为 yarn client 和 yarn cluster。
小结:
生产环境多数使用的集群管理器是 YARN。
1.2 Cluster Manager
集群中的计算资源是由Cluster Manager来管理的
1.3 Driver 进程
编写的Spark程序就在Driver上, 由Driver进程执行。
1.4 Worker
集群中运行应用程序的节点,用自己所在节点的内存存储RDD的partition。启动其他进程和线程,对RDD的partition进行并行计算处理
1.5 Executor
应用程序在Worker节点上启动的进行,Executor接收到task之后,会启动多个线程来执行Task
1.6 Task
被发送到某个Executor的一个工作单元,Task会对RDD的partition数据执行指定的算子操作, 形成新RDD的 partition
二、Spark安装
windows本地安装
Spark学习笔记--Spark在Windows下的环境搭建 - 法号阿兴 - 博客园www.cnblogs.com
三、调用
官方示例:
3.1 官方JavaWordCount词频统计demo
import scala.Tuple2;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.SparkSession;
import java.util.*;
import java.util.regex.Pattern;
/**
* 官方JavaWordCount Demo + 说明
* @author hanko
*/
public final class JavaWordCount {
private static final Pattern SPACE = Pattern.compile(" ");
public static void main(String[] args) throws Exception {
SparkSession spark = SparkSession
.builder()
.appName("JavaWordCount")
//local本地spark local[k]本地k个线程 local[*]本地多线程
.master("local")
.getOrCreate();
//根据数据来源,创建RDD
JavaRDD<String> lines = spark.read().textFile("src/main/resources/data.txt").javaRDD();
/*对初始的RDD进行Transformation级别的处理,如map、filter高阶函数编程,进行具体计算*/
//1、对每行字符串进行单词拆分,并把所有拆分结果通过flatMap合并成一个大的单词集合
JavaRDD<String> words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
//2、在单词拆分的基础上,对每个单词实例进行计数为1
JavaPairRDD<String, Integer> ones = words.mapToPair(s -> new Tuple2<>(s, 1));
// 3、计算每个单词在文中出现的总次数(即相关单词累加次数)
JavaPairRDD<String, Integer> counts = ones.reduceByKey((i1, i2) -> i1 + i2);
//将RDD类型的数据转化为数组
List<Tuple2<String, Integer>> output = counts.collect();
//遍历并打印数组
for (Tuple2<?,?> tuple : output) {
System.out.println(tuple._1() + ": " + tuple._2());
}
spark.stop();
}
}
如果是中文可以使用中文分词器先把数据处理后再统计。
3.2 在JavaWordCount基础上增加排序
import org.apache.spark.sql.SparkSession;
import scala.Tuple2;
import java.util.Arrays;
import java.util.regex.Pattern;
/**
* JavaWordCount增加排序
* @author hanko
*/
public final class JavaWordCountSort {
private static final Pattern SPACE = Pattern.compile(" ");
public static void main(String[] args) throws Exception {
SparkSession spark = SparkSession
.builder()
.appName("JavaWordCountSort")
.master("local")
.getOrCreate();
spark.read().textFile("src/main/resources/data.txt").javaRDD().flatMap(line -> {
return Arrays.asList(line.split(" ")).iterator();
}).mapToPair(word -> {
return new Tuple2<String,Integer>(word,1);
}).reduceByKey((x,y) -> (x + y)).mapToPair(t -> {
return new Tuple2<Integer,String>(t._2,t._1);
//增加sortByKey false降序
}).sortByKey(false).mapToPair(t -> {
return new Tuple2<String,Integer>(t._2,t._1);
}).foreach(t -> System.out.println(t));
spark.stop();
}
}
3.3 除接收textFile源数据外,也可以直接接收集合数据
SparkSession spark = SparkSession
.builder()
.appName("JavaWordCount")
.master("local")
.getOrCreate();
JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
//输入集合数据,调用spark的parallelize函数来创建RDD
JavaRDD<String> lines = jsc.parallelize(Arrays.asList("hello","hello", "world"));
/*对初始的RDD进行Transformation级别的处理,如map、filter高阶函数编程,进行具体计算*/
//1、对每行字符串进行单词拆分,并把所有拆分结果通过flatMap合并成一个大的单词集合
JavaRDD<String> words = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
四、技术笔记
4.1 远程调用的几个坑
玄明Hanko:spark远程调用的几个坑zhuanlan.zhihu.com
4.2 spark+kafka spark sql
- spark可以直接接收kafka数据源
- spark支持 sql脚本,在进行复杂的运算可使用
相应的demo可见官方examples
4.3 官网下载 无法显示下拉 无法下载问题
主要是网页引用的jquery在国内被墙了,可以把页面引用的jquery换成下面的即可
具体步骤,把当前网页另存为到本地,然后用编辑器打开,把
换成 http://libs.baidu.com/jquery/2.1.4/jquery.min.js 保存
然后再直接打开本地这个html文件,就可以选择了
发布于 2 分钟前