目录
一、Spark基础知识
二、Scala环境搭建
1、部署本地SCALA
(1)官网下载2.12.15版本
(2)配置环境变量
(3)cmd 检查一下
2、部署服务器Scala
(1)复制下载链接
(2)使用wget 命令下载
(3)解压
(4)配置环境变量
(5)创建一个软连接 ,方便使用
(6)检查一下是否安装成功
三、Spark编译
1、官网下载 3.2.1版本
2、将文件上传至服务器解压,并对其dev下 make-distribution.sh做配置
3、对文件 make-distribution.sh 进行配置
4、指定scala版本
5、进行编译
6、编译成功
7、编译遇到的问题
(1)编译所需依赖包下载慢
解决办法
(2)编译时提示内存不足等
四、spark服务器部署
1、将二编译好的spark放入我们的用户文件夹下的software下,并解压至app下,并重命名
2、配置spark环境变量在/etc/profile下
3、配置spark下conf文件下的 spark-env.sh 文件
(1)cp 一个文件spark-env.sh
(2)配置文件spark-env.sh
4、配置mysql驱动
5、将hive的配置文件 hive-site.xml 拷贝到 spark下conf下
6、测试一下我们的spark是否配置成功
(1)执行一下官方例子,圆周率代码如下
(2)未执行成功报错
(3)查询了一下是由于YARN内存设置小导致 ,尝试将yarn比例调大一点
(4)重新执行测试代码
五、配置spark History Server
1、进入spark下conf下 复制一个配置文件 spark-defaults.conf
2、 在 hdfs上创建一个存放 history的文件夹
3、修改conf下 文件 spark-env.sh
4、打开我们的history服务
5、查看是否启动成功
6、重跑下之前的测试例子求pi的,刷新history界面
六、使用spark算子实现wc例子
1、创建一个测试文件 spark-test.txt
2、将测试文件上传至hdfs上
3、启动scala
4、查看一下的们的测试文件
5、实现wc
6、换一种方式实现wc
七、关于运行角色-Driver/Executor
1、Driver
2、Executor
一、Spark基础知识
二、Scala环境搭建
1、部署本地SCALA
(1)官网下载2.12.15版本
链接:Scala 2.12.15 | The Scala Programming Language
(2)配置环境变量
(3)cmd 检查一下
本地 Scala 部署完成
2、部署服务器Scala
(1)复制下载链接
(2)使用wget 命令下载
[peizk@hadoop software]$ wget https://downloads.lightbend.com/scala/2.12.15/scala-2.12.15.tgz
--2022-04-09 10:42:23-- https://downloads.lightbend.com/scala/2.12.15/scala-2.12.15.tgz
Resolving downloads.lightbend.com (downloads.lightbend.com)... 13.225.173.82, 13.225.173.69, 13.225.173.49, ...
Connecting to downloads.lightbend.com (downloads.lightbend.com)|13.225.173.82|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21087658 (20M) [application/octet-stream]
Saving to: ‘scala-2.12.15.tgz’
100%[==========================================================================================================================>] 21,087,658 4.28MB/s in 5.6s
2022-04-09 10:42:29 (3.60 MB/s) - ‘scala-2.12.15.tgz’ saved [21087658/21087658]
(3)解压
[peizk@hadoop software]$ tar -zxvf scala-2.12.15.tgz -C ~/app
(4)配置环境变量
内容如下
#SCALA_HOME
export SCALA_HOME=/home/peizk/app/scala-2.12.15
export PATH=$PATH:$SCALA_HOME/bin
配置完成后source一下
[root@hadoop app]# source /etc/profile
(5)创建一个软连接 ,方便使用
[root@hadoop bin]# ln -s /home/peizk/app/scala-2.12.15/bin/scala /usr/bin/scala
(6)检查一下是否安装成功
[peizk@hadoop ~]$ scala -version
Scala code runner version 2.12.15 -- Copyright 2002-2021, LAMP/EPFL and Lightbend, Inc.
部署成功
三、Spark编译
1、官网下载 3.2.1版本
2、将文件上传至服务器解压,并对其dev下 make-distribution.sh做配置
3、对文件 make-distribution.sh 进行配置
将版本信息注释掉
自己指定,如下
4、指定scala版本
[root@hadoop dev]# ./change-scala-version.sh 2.12
5、进行编译
[root@hadoop spark-3.2.1]# ./dev/make-distribution.sh --name 3.2.1-hadoop3.1.3 --tgz -Phive -Phive-thriftserver -Pyarn -Dhadoop.version=3.1.3 -Dscala.version=2.12.15
过程会比较慢一点
6、编译成功
并且可在 家目录下找到编译好的文件
7、编译遇到的问题
(1)编译所需依赖包下载慢
exec: curl --silent --show-error -L https://downloads.lightbend.com/scala/。。。。
解决办法
在linux 配置 maven,并且maven镜像要使用阿里云镜像,并在 spark家目录下dev下文件make-distribution.sh如下处 指定maven路径,如下:
(2)编译时提示内存不足等
Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled
解决办法
指定mav内存,调大
在 /etc/profile 添加
export MAVEN_OPTS="-Xms1024m -Xmx1024m -Xss1m"
不要忘记source!!!!
四、spark服务器部署
1、将二编译好的spark放入我们的用户文件夹下的software下,并解压至app下,并重命名
[root@hadoop spark-3.2.1]# cp spark-3.2.1-bin-3.2.1-hadoop3.1.3.tgz /home/peizk/software
[peizk@hadoop software]$ tar -zxvf spark-3.2.1-bin-3.2.1-hadoop3.1.3.tgz -C ~/app
[peizk@hadoop app]$ mv spark-3.2.1-bin-3.2.1-hadoop3.1.3 spark-3.2.1
2、配置spark环境变量在/etc/profile下
#SPARK_HOME
export SPARK_HOME=/home/peizk/app/spark-3.2.1
export PATH=$PATH:$SPARK_HOME/bin
不要忘记source
3、配置spark下conf文件下的 spark-env.sh 文件
(1)cp 一个文件spark-env.sh
[peizk@hadoop conf]$ cp spark-env.sh.template spark-env.sh
(2)配置文件spark-env.sh
配置三个 conf_dir 如下:
# Options read in YARN client/cluster mode
# - SPARK_CONF_DIR, Alternate conf dir. (Default: ${SPARK_HOME}/conf)
SPARK_CONF_DIR=${SPARK_HOME}/conf
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
# - YARN_CONF_DIR, to point Spark towards YARN configuration files when you use YARN
YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
4、配置mysql驱动
从 hive的lib下偷过来,如下
[peizk@hadoop lib]$ cp mysql-connector-java-5.1.47.jar ../../spark-3.2.1/jars/
5、将hive的配置文件 hive-site.xml 拷贝到 spark下conf下
[peizk@hadoop spark-3.2.1]$ cp ../hive-3.1.2/conf/hive-site.xml conf/
6、测试一下我们的spark是否配置成功
(1)执行一下官方例子,圆周率代码如下
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
/home/peizk/app/spark-3.2.1/examples/jars/spark-examples_2.12-3.2.1.jar 10
[peizk@hadoop spark-3.2.1]$ bin/spark-submit \
> --class org.apache.spark.examples.SparkPi \
> --master yarn \
> /home/peizk/app/spark-3.2.1/examples/jars/spark-examples_2.12-3.2.1.jar 10
(2)未执行成功报错
报错大致如下
Caused by: java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
(3)查询了一下是由于YARN内存设置小导致 ,尝试将yarn比例调大一点
修改文件
[peizk@hadoop hadoop]$ vim yarn-site.xml
添加如下:
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
重启启动下集群
(4)重新执行测试代码
执行成功!如下
spark配置成功!!
五、配置spark History Server
1、进入spark下conf下 复制一个配置文件 spark-defaults.conf
[peizk@hadoop conf]$ cp spark-defaults.conf.template spark-defaults.conf
修改两处地方 如下:
2、 在 hdfs上创建一个存放 history的文件夹
将1 中的地址修改为我们刚创建的的spark-log文件地址,如下:
3、修改conf下 文件 spark-env.sh
添加如下:
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop:9000/spark-log"
4、打开我们的history服务
[peizk@hadoop sbin]$ ./start-history-server.sh
5、查看是否启动成功
ip:18080
启动成功!!
6、重跑下之前的测试例子求pi的,刷新history界面
如下:
六、使用spark算子实现wc例子
1、创建一个测试文件 spark-test.txt
内容如下:
[peizk@hadoop spark-3.2.1]$ cat spark-test.txt
aa,bb,cc
aa,c,cc
aa
2、将测试文件上传至hdfs上
路径如下:
[peizk@hadoop spark-3.2.1]$ hadoop fs -mkdir /spark-test
[peizk@hadoop spark-3.2.1]$ hadoop fs -put spark-test.txt /spark-test/
3、启动scala
[peizk@hadoop spark-3.2.1]$ spark-shell
4、查看一下的们的测试文件
scala> sc.textFile("/spark-test/spark-test.txt").foreach(println)
aa
aa,bb,cc
aa,c,cc
5、实现wc
scala> sc.textFile("/spark-test/spark-test.txt").flatMap(x => x.split(",")).map(x =>(x,1)).reduceByKey(_+_).foreach(println)
(aa,3)
(c,1)
(bb,1)
(cc,2)
6、换一种方式实现wc
sc.textFile("/spark-test/spark-test.txt").flatMap(_.split(",")).map((_, 1)).groupByKey().map(tuple => {(tuple._1, tuple._2.sum)}).collect().foreach(println)
七、关于运行角色-Driver/Executor
1、Driver
Spark驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。Driver在Spark作业执行时主要负责:
- 将用户程序转化为作业(job)
- 在Executor之间调度任务(task)
- 跟踪Executor的执行情况
- 通过UI展示查询运行情况
简单理解,所谓的Driver就是驱使整个应用运行起来的程序,也称之为Driver类。
2、Executor
Spark Executor是集群中工作节点(Worker)中的一个JVM进程,负责在 Spark 作业中运行具体任务(Task),任务彼此之间相互独立。Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。
Executor有两个核心功能:
- 负责运行组成Spark应用的任务,并将结果返回给驱动器进程
- 它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。