![6f42d46d1bfca6fbaefdf6ad72eb4b3b.png](https://i-blog.csdnimg.cn/blog_migrate/9d3920efc4e0124a76e81f16c010e781.jpeg)
转载请私信。禁止无授权转载
1.spark安装
利用ambari安装整个集群 参考Ambari及其HDP集群安装及其配置教程
2.Spark工作原理
![c24da82421a4462f3bfc66563ab642ee.png](https://i-blog.csdnimg.cn/blog_migrate/d022cef997bdcf9cb95424d44de43039.jpeg)
提交任务到spark集群后,spark会从数据存储系统如HDFS读取数据,生成RDD,RDD进行数据分区交由各个节点进行处理,每个节点处理完数据后的结果存储在内存中,同时可将该结果交由下一个节点继续处理.最后将最终结果写回HDFS/Mysql/Hbase等数据存储系统中.
RDD:弹性分布式数据集(Resilient Distributed Dataset)
一个RDD就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算.
RDD提供了一组丰富的操作以支持常见的数据运算,分为“行动”(Action)和“转换”(Transformation)两种类型,前者用于执行计算并指定输出的形式,后者指定RDD之间的相互依赖关系。两类操作的主要区别是,转换操作(比如map、filter、groupBy、join等)接受RDD并返回RDD,而行动操作(比如count、collect等)接受RDD但是返回非RDD(即输出一个值或结果)
RDD典型的执行过程如下:
1.RDD读入外部数据源(或者内存中的集合)进行创建;
2.RDD经过一系列的“转换”操作,每一次都会产生不同的RDD,给下一个“转换”使用;
3.最后一个RDD经“行动”操作进行处理,并输出到外部数据源
![7e43a95893a8b2c6838b90aa39e27734.png](https://i-blog.csdnimg.cn/blog_migrate/18e885d725fe44697c3e7cebd71bad90.jpeg)
RDD采用了惰性调用,即在RDD的执行过程中(如图2.2所示),真正的计算发生在RDD的“行动”操作,对于“行动”之前的所有“转换”操作,Spark只是记录下“转换”操作应用的一些基础数据集以及RDD生成的轨迹,即相互之间的依赖关系,而不会触发真正的计算.
![e3adf597f6e0737f8cb7270315b25c78.png](https://i-blog.csdnimg.cn/blog_migrate/8b7c8852eb6dae62a932d3ac7defc3f0.jpeg)
RDD特征:
- 高容错性
- 中间结果持久化到内存
- 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化开销
3.spark-hello world
本地模式(Java)
- 创建maven项目spark-note,添加Spark依赖,新建testSpark.java类
![bec41f938fb19037768b2ebe1d2f20f9.png](https://i-blog.csdnimg.cn/blog_migrate/5c9aabfccfed77705d049b25379b7a9c.jpeg)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jp</groupId>
<artifactId>spark-note</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spark-note</name>
<url>Welcome to Apache Maven</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spark.version>2.2.0</spark.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
</project>
- 创建words.txt文件
hello java
hello scala
hello python
hi C++
hi android
- 编写代码
package com.jp.spark;
import java.util.Arrays;
import java.util.Iterator;
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 org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
/**
* Hello world!
*
*/
public class TestSpark {
public static void main( String[] args ){
//设置配置信息
SparkConf conf = new SparkConf()
.setAppName("WordCount")
.setMaster("local");//本地运行
//创建JavaSparkContext对象-spark功能入口
JavaSparkContext sc = new JavaSparkContext(conf);
//针对输入源创建初始RDD
JavaRDD<String> lines = sc.textFile("D:words.txt");//读取文件
//==============计算操作================//
//flatMap算子-拆分操作
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
private static final long serialVersionUID = 1L;
public Iterator<String> call(String line) throws Exception {
return Arrays.asList(line.split(" ")).iterator();
}
});
//每个单词映射为(单词,1)
JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
private static final lon