安装教程:实验室
Spark 2.1.0需要满足: Hadoop 2.7 +, JDK 1.8 +, Ubuntu 16 +
这里选用Spark 2.4.5, Hadoop 2.9.2, Centos 8
首先安装Hadoop(包含Java) 参考手册:
Spark官方下载:
选择Pre-build with user-provided Hadoop [can use with most Hadoop distributions]
Spark部署模式主要有四种:Local模式(单机模式)、Standalone模式(使用Spark自带的简单集群管理器)、YARN模式(使用YARN作为集群管理器)和Mesos模式(使用Mesos作为集群管理器)。
这里介绍Local模式(单机模式)的 Spark安装。
1、安装
su hadoop
sudo tar -zxf /home/downld/spark-2.4.5-bin-without-hadoop.tgz -C /usr/local/
cd /usr/local
sudo mv ./spark-2.4.5-bin-without-hadoop/ ./spark
sudo chown -R hadoop:hadoop ./spark # 此处的 hadoop 为你的用户名
设置环境变量
sudo vim ~/.bashrc
# export JAVA_HOME=/usr/lib/jvm/java
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH
source ~/.bashrc
2、配置
cd /usr/local/spark
cp ./conf/spark-env.sh.template ./conf/spark-env.sh
vim ./conf/spark-env.sh # 首行添加
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
配置以后,Spark就可以直接使用,不需要像Hadoop运行启动命令。就可以把数据存储到Hadoop分布式文件系统HDFS中,也可以从HDFS中读取数据。如果没有配置上面信息,Spark就只能读写本地数据。
通过运行Spark自带的示例,验证Spark是否安装成功。这里涉及到Linux Shell中管道的知识,详情可以参考:Linux Shell中的管道命令
cd /usr/local/spark
bin/run-example SparkPi 2>&1 | grep "Pi is" # 信息都输出到 stdout
3、使用Spark Shell进行交互式数据分析
学习Spark程序开发,建议首先通过spark-shell交互式学习,加深Spark程序开发的理解。 Spark Shell 支持 Scala(自带scala环境,不需要额外安装) 和 Python,这里使用 Scala 来进行介绍。
Spark的运行模式取决于传递给SparkContext的Master URL的值。可以是以下任一种形式:
local
使用一个Worker线程本地化运行SPARK(完全不并行)local[*]
使用逻辑CPU个数数量的线程来本地化运行Sparklocal[K]
使用K个Worker线程本地化运行Spark(理想情况下,K应该根据运行机器的CPU核数设定)spark://HOST:PORT
连接到指定的Spark standalone master。默认端口是7077.- yarn-client 以客户端模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。
yarn-cluster
以集群模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到。mesos://HOST:PORT
连接到指定的Mesos集群。默认接口是5050。
------------------------------------------------------ >> 返回
cd /usr/local/spark
./bin/spark-shell # ./bin/spark-shell –master local[*]
:q # quit scala
------------------------------ Top ----------------------------
4、Spark独立应用程序编程
4.1 编写Scala程序
下载安装sbt (Simple Build Tool)是对Scala或Java语言进行编译的一个工具,类似于Maven或Ant,需要JDK1.8+
sudo mkdir /usr/local/sbt # 创建安装目录
sudo tar -zxvf /home/downld/sbt-1.3.8.tgz -C /usr/local
cd /usr/local/sbt
sudo chown -R hadoop /usr/local/sbt # 此处的hadoop为系统当前用户名
cp ./bin/sbt-launch.jar ./ # 把bin目录下的sbt-launch.jar复制到sbt安装目录下
vi /usr/local/sbt/sbt # 创建启动sbt脚本
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
~
chmod u+x /usr/local/sbt/sbt # 增加可执行权限
cd /usr/local/sbt
./sbt sbtVersion # 可能需要执行几分钟,成功以后就可以看到版本
[info] Set current project to sbt (in build file:/usr/local/sbt/)
[info] 1.3.8
spark-scala
# 这里借助idea编辑后,上传到~/sparkapp/src/main/scala/
cd ~/sparkapp
vi ./simple.sbt
# 声明该scala程序的信息以及与 Spark 的依赖关系
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5"
find . # 检查整个应用程序的文件结构
# Scala package by sbt
/usr/local/sbt/sbt package # 第一次打包时,会需要几分钟
# spark提交app
/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.11/simple-project_2.11-1.0.jar 2>&1 | grep "Lines with a:"
spark-submit提交应用程序,命令的格式如下:
./bin/spark-submit
--master <master-url> # spark://host:port, mesos://host:port, yarn, or local (Default: local[*])
--class <main-class> # 应用程序的入口: main class (for Java / Scala apps).
--deploy-mode <deploy-mode> # 部署模式: locally ("client") or cluster ("cluster") (Default: client).
... other options # 其他参数
<application-jar> # 应用程序JAR包
[application-arguments] # 传递给主类的主方法的参数
<< 点击查看Sprak不同部署部署模式的master -url
deploy-mode这个参数用来指定应用程序的部署模式,部署模式有两种:client和cluster,默认是client。
当采用client部署模式时,就是直接在本地运行Driver Program,
当采用cluster模式时,会在Worker节点上运行Driver Program。
比较常用的部署策略是从网关机器提交你的应用程序,这个网关机器和你的Worker集群进行协作。在这种设置下,比较适合采用client模式,在client模式下,Driver直接在spark-submit进程中启动,这个进程直接作为集群的客户端,应用程序的输入和输出都和控制台相连接。因此,这种模式特别适合涉及REPL的应用程序。
另一种选择是,如果你的应用程序从一个和Worker机器相距很远的机器上提交,那么采用cluster模式会更加合适,它可以减少Driver和Executor之间的网络迟延。
4.2 spark-java
# java package by maven, use IDEA, 打包好的jar放到指定文件夹~/sparkapp/target/
/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/sparks-1.0.jar 2>&1 | grep "Lines with a"