Spark概述,安装,以及四种运行方式
Spark
Apache Spark是一个开源集群计算系统,旨在使数据分析更快
Hadoop的共享数据为什么慢?
Spark的共享数据快
Spark支持三种语言,scala、python、java
可以通过四种模式运行Spark
1、Local(多用于测试)
2、Standalone
3、Mesos
4.YARN
1.Local
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>bigdata19-project</artifactId> <groupId>com.shujia</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>bigdata19-spark</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <scala.version>2.11.12</scala.version> <spark.version>2.4.5</spark.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-reflect</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>${spark.version}</version> </dependency> </dependencies> <build> <plugins> <!-- Scala Compiler --> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <version>2.15.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
sparkwordCount代码
package com.core
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Demo01WorkCount {
def main(args: Array[String]): Unit = {
//构建spark的上下文环境
//创建SparkConf
val conf: SparkConf = new SparkConf()
conf.setAppName("Demo01WorkCount")
conf.setMaster("local")//设置spark的运行方式
//构建spark的上下文环境
val sc: SparkContext = new SparkContext(conf)
//1、加载数据
/**
* RDD : 弹性分布式数据集
* 使用起来同List类似,但它不是List
* 是Spark提供的编程模型,不管基于RDD做任何转换操作,最终都会得到一个RDD
*/
val linesRDD: RDD[String] = sc.textFile("bigdata19-spark/data/words.txt")
println(linesRDD.getNumPartitions)
//2、将每一行的每个单词进行切分 并且扁平化处理
val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(","))
println(linesRDD.getNumPartitions)
//3、按照每个单词进行分组
/**
* Iterable 跟 List 最大的区别在于
* List中的数据是完全加载到内存中的
* Iterable中的数据只有在需要的时候才会加载
*/
val grpRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word)
//4、统计每个单词的数量
val wordCntRDD: RDD[String] = grpRDD.map(kv => s"${kv._1},${kv._2.size}")
//5.将结果保存到文件中
wordCntRDD.saveAsTextFile("bigdata19-spark/data/wc")
while(true){
}
}
}
运行之前需要在电脑上配置环境变量
随便一个目录
RDD五大特性
在Linux安装Spark
1、Standalone模式
-
1、上传解压
tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /usr/local/soft
mv spark-2.4.5-bin-hadoop2.7 spark-2.4.5 -
2、修改配置文件 (在spark-2.4.5/conf中)
# 重命名文件
cp spark-env.sh.template spark-env.sh
cp slaves.template slaves增加配置:
vim spark-env.sh
master相当于RM worker相当于NM
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=2
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_MEMORY=2g
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171增加从节点配置:
vim slaves
以node1、node2作为从节点
node1
node2 -
3、复制到其它节点
cd /usr/local/soft/
scp -r spark-2.4.5 node1:`pwd`
scp -r spark-2.4.5 node2:`pwd` -
4、配置环境变量
-
5、在主节点执行启动命令
注意:start-all.sh 与Hadoop的sbin目录中的启动命令有冲突
cd /usr/local/soft/spark-2.4.5/
./sbin/start-all.sh -
6、访问Spark Web UI
http://master:8080/
-
7、测试及使用
切换目录:
cd /usr/local/soft/spark-2.4.5/examples/jars
standalone client模式 :日志在本地输出,一般用于上线前测试
-
提交自带的SparkPi任务
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512m --total-executor-cores 1 spark-examples_2.11-2.4.5.jar 100
standalone cluster模式:上线使用,不会在本地打印日志
-
提交自带的SparkPi任务
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512M --total-executor-cores 1 --deploy-mode cluster spark-examples_2.11-2.4.5.jar 100
-
-
8、其他运行方式
-
spark-shell spark 提供的一个交互式的命令行,可以直接写代码
spark-shell master spark://master:7077
2、On Yarn模式(常用)
在公司一般不适用standalone模式
因为公司一般已经有yarn 不需要搞两个资源管理框架
-
1、停止Spark Standalone模式集群
# 切换目录
cd /usr/local/soft/spark-2.4.5/
# 停止集群
./sbin/stop-all.sh -
2、增加hadoop 配置文件地址
vim spark-env.sh
# 增加HADOOP_CONF_DIR
export HADOOP_CONF_DIR=/usr/local/soft/hadoop-2.7.6/etc/hadoop -
3、关闭Yarn
stop-yarn.sh
-
4、修改Yarn配置
cd /usr/local/soft/hadoop-2.7.6/etc/hadoop/
vim yarn-site.xml
# 加入如下配置
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property> -
5、同步到其他节点
scp -r yarn-site.xml node1:`pwd`
scp -r yarn-site.xml node2:`pwd` -
6、启动Yarn
start-yarn.sh
-
7、测试及使用
切换目录:
cd /usr/local/soft/spark-2.4.5/examples/jars
Spark on Yarn Client模式:日志在本地输出,一班用于上线前测试
-
提交自带的SparkPi任务
spark-submit --class org.apache.spark.examples.SparkPi --master yarn-client --executor-memory 512M --num-executors 2 spark-examples_2.11-2.4.5.jar 100
Spark on Yarn Cluster模式:上线使用,不会在本地打印日志
-
提交自带的SparkPi任务
spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster --executor-memory 512m --num-executors 2 --executor-cores 1 spark-examples_2.11-2.4.5.jar 100
-
获取yarn程序执行日志 执行成功之后才能获取到
yarn logs -applicationId application_1652086375126_0002
-
-
8、开启Spark On Yarn的WEB UI
修改配置文件:
# 切换目录
cd /usr/local/soft/spark-2.4.5/conf
# 去除后缀
cp spark-defaults.conf.template spark-defaults.conf
# 修改spark-defaults.conf
vim spark-defaults.conf
# 加入以下配置
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/user/spark/applicationHistory
spark.yarn.historyServer.address master:18080
spark.eventLog.compress true
spark.history.fs.logDirectory hdfs://master:9000/user/spark/applicationHistory
spark.history.retainedApplications 15创建HDFS目录用于存储Spark History日志
hdfs dfs -mkdir -p /user/spark/applicationHistory
启动Spark History Server
cd /usr/local/soft/spark-2.4.5/
./sbin/start-history-server.sh
idea提交到yarn上
代码
package com.core import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object Demo02WordCountOnYarn { /** * 将代码提交到Yarn上运行 * 1、将setMaster代码注释,使用提交命令设置运行方式 * 2、修改输入输出路径,并准备数据 * 3、打包上传至服务器 * 4、使用spark-submit命令提交任务 * * spark-submit --master yarn-client --class com.core.Demo02WordCountOnYarn bigdata19-spark-1.0-SNAPSHOT.jar * spark-submit --master yarn-cluster --class com.core.Demo02WordCountOnYarn bigdata19-spark-1.0-SNAPSHOT.jar * */ def main(args: Array[String]): Unit = { // 创建SparkConf val conf: SparkConf = new SparkConf() conf.setAppName("Demo02WordCountOnYarn") // conf.setMaster("local") // 设置Spark的运行方式 // 构建Spark的上下文环境 val sc: SparkContext = new SparkContext(conf) // 1、加载数据 /** * RDD : 弹性分布式数据集 * 使用起来同List类似,但它不是List * 是Spark提供的编程模型,不管基于RDD做任何转换操作,最终都会得到一个RDD */ val linesRDD: RDD[String] = sc.textFile("/spark/input") println(linesRDD.getNumPartitions) // 2、将每一行的每个单词进行切分 并且扁平化处理 val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(",")) println(linesRDD.getNumPartitions) // 3、按照每个单词进行分组 /** * Iterable 跟 List 最大的区别在于 * List中的数据是完全加载到内存中的 * Iterable中的数据只有在需要的时候才会加载 */ val grpRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word) // 4、统计每个单词的数量 val wordCntRDD: RDD[String] = grpRDD.map(kv => s"${kv._1},${kv._2.size}") /** * 使用HDFS的JAVA API来对输出目录进行删除,避免重复运行时出现目录已存在的问题 */ val fs: FileSystem = FileSystem.get(sc.hadoopConfiguration) val outputPath: Path = new Path("/spark/output01") if (fs.exists(outputPath)) { fs.delete(outputPath, true) } // 5、将结果保存到文件中 wordCntRDD.saveAsTextFile("/spark/output01") } }
yarn-client模式
yarn-cluster模式
两种方式的区别在于driver启动的位置不同,AM既负责资源申请又负责任务申请