1 Spark概述
Spark是一种基于内存的快速,通用,可扩展的大数据分析计算引擎
1.1 核心模块
Spark Core:
提供了Spark最基础与最核心的功能
Spark SQL:
是Spark用来操作结构化数据的组件。通过Spark SQL,用户可以使用SQL或者Apche Hive版本的HQL来查询数据
Spark Streaming:
Spark Streaming是Spark平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流的API
Spark MLlib:
一个机器学习算法库。不仅提供了模型评估,数据导入等额外功能,还提供了一些更底层的机器学习原语。
2 Spark快速上手
创建Maven项目 => 安装Scala插件 => 增加依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件用于将Scala代码编译成class文件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<!-- 声明绑定到maven的compile阶段 -->
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.1 WordCount案例
// 创建Spark运行配置对象
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
// 创建Spark上下文环境对象(连接对象)
val sc : SparkContext = new SparkContext(sparkConf)
// 读取文件数据
val fileRDD: RDD[String] = sc.textFile("input/word.txt")
// 将文件中的数据进行分词
val wordRDD: RDD[String] = fileRDD.flatMap( _.split(" ") )
// 转换数据结构 word => (word, 1)
val word2OneRDD: RDD[(String, Int)] = wordRDD.map((_,1))
// 将转换结构后的数据按照相同的单词进行分组聚合
val word2CountRDD: RDD[(String, Int)] = word2OneRDD.reduceByKey(_+_)
// 将数据聚合结果采集到内存中
val word2Count: Array[(String, Int)] = word2CountRDD.collect()
// 打印结果
word2Count.foreach(println)
//关闭Spark连接
sc.stop()
3 Spark运行环境
3.1 Local模式
不需要其他任何节点资源在本地执行Spark代码的环境
首先解压spark-2.4.5-bin-hadoop2.7.tgz,将其命名为spark-local
启动Local环境:bin/spark-shell --master local[4]
Web UI监控界面访问:http://虚拟机地址:4040
测试本地模式:
(在spark-local下创建input目录,并添加word.txt文件)
sc.textFile("input/word.txt").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).collect
退出::quit
提交应用:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.11-2.4.5.jar \
10
3.2 Standalone模式
基本配置
解压 -> 改名为spark-standalone
- 修改slaves.template为slaves
添加work节点:
linux1
linux2
linux3
- 修改spark-env.sh.template为spark-env.sh,添加JAVA_HOME和集群对应的master节点
(7077,相当于hadoop内部通信的9000端口)
export JAVA_HOME=/opt/module/jdk1.8.0_144
SPARK_MASTER_HOST=linux1
SPARK_MASTER_PORT=7077
向各个节点同步目录
启动集群:sbin/start-all.sh
UI界面:8080端口
提交应用:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
./examples/jars/spark-examples_2.11-2.4.5.jar \
10
参数说明
配置历史服务器:
修改spark-defaults.conf.template为spark-defaults.conf
配置日志存储路径:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://linux1:9000/directory
(启动hadoop集群,创建对应的目录/directory)
在spark-env.sh,添加日志配置
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://linux1:9000/directory
-Dspark.history.retainedApplications=30"
-
参数1含义:WEBUI访问的端口号为18080
-
参数2含义:指定历史服务器日志存储路径
-
参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
-
分发文件,重新启动集群和历史服务
sbin/start-all.sh
sbin/start-history-server.sh
配置高可用(HA)
首先停止集群,启动Zookeeper
修改spark-env.sh配置:
注释如下内容:
#SPARK_MASTER_HOST=linux1
#SPARK_MASTER_PORT=7077
添加如下内容:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=linux1,linux2,linux3
-Dspark.deploy.zookeeper.dir=/spark"
分发文件,启动集群
启动备用Master节点:sbin/start-master.sh
3.3 Yarn模式
解压 -> 改名为spark-yarn
修改hadoop的配置文件yarn-site.xml,并分发
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
修改spark-env.sh,添加JAVA_HOME和YARN_CONF_DIR配置
export JAVA_HOME=/opt/module/jdk1.8.0_144
YARN_CONF_DIR=/opt/module/hadoop/etc/hadoop
测试:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
./examples/jars/spark-examples_2.11-2.4.5.jar \
10
- 配置历史服务器
修改spark-defaults.conf,配置日志存储路径
spark.eventLog.enabled true
spark.eventLog.dir hdfs://linux1:9000/directory
修改spark-env.sh,添加日志配置
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://linux1:9000/directory
-Dspark.history.retainedApplications=30"
修改spark-defaults.con
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://linux1:9000/directory
-Dspark.history.retainedApplications=30"
测试:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
./examples/jars/spark-examples_2.11-2.4.5.jar \
10