Spark下载地址:http://spark.apache.org/downloads.html
[hadoop@master software]$ tar zxvf spark-2.4.1-bin-hadoop2.7.tgz -C /opt/module/
[hadoop@master software]$ cd /opt/module/spark-2.4.1-bin-hadoop2.7/conf/
[hadoop@master conf]$ cp slaves.template slaves
[hadoop@master conf]$ cp spark-env.sh.template spark-env.sh
[hadoop@master conf]$ vim slaves
SPARK_MASTER_HOST=master
SPARK_MASTER_PORT=7077
[hadoop@master conf]$cd /opt/module/spark-2.4.1-bin-hadoop2.7/sbin
[hadoop@master sbin]$ vim spark-config.sh
export JAVA_HOME=/opt/module/jdk1.8.0_65
export PATH=$PATH:$JAVA_HOME/bin
[hadoop@master module]$ scp -r spark-2.4.1-bin-hadoop2.7/ slave1:/opt/module/
[hadoop@master module]$ scp -r spark-2.4.1-bin-hadoop2.7/ slave2:/opt/module/
[hadoop@master sbin]$ ./start-all.sh
启动后执行jps命令,主节点上有Master进程,其他子节点上有Work进行,登录Spark管理界面查看集群状态(主节点):http://master:8080/
如果aliver workers为0,jps查看又有worker进程,查看防火墙状态:
systemctl status firewalld.service(为running)
关闭防火墙:systemctl stop firewalld.service
如hadoop用户无法执行该命令,切换用户执行(忘记密码修改passwd username)。
cd /opt/module/spark-2.4.1-bin-hadoop2.7/conf
[hadoop@master conf]$ cp spark-defaults.conf.template spark-defaults.conf
[hadoop@master conf]$ vim spark-defaults.conf
spark.master spark://master:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/directory
[hadoop@master conf]$ vim spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://master:9000/directory"
参数描述:
spark.eventLog.dir:Application在运行过程中所有的信息均记录在该属性指定的路径下;
spark.history.ui.port=4000 调整WEBUI访问的端口号为4000
spark.history.fs.logDirectory=hdfs://master01:9000/directory 配置了该属性后,在start-history-server.sh时就无需再显式的指定路径,Spark History Server页面只展示该指定路径下的信息
spark.history.retainedApplications=3 指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ scp -r conf/ slave1:/opt/module/spark-2.4.1-bin-hadoop2.7/
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ scp -r conf/ slave2:/opt/module/spark-2.4.1-bin-hadoop2.7/
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ start-all.sh
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ hdfs dfs -mkdir /directory
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ sbin/start-all.sh
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ sbin/start-history-server.sh
到此为止,Spark History Server安装完毕.
集群部署完了,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借助zookeeper,并且启动至少两个Master节点来实现高可靠(本课程只使用三台服务器,所以将第二个master部署在slave1上,也就是说slave1既是master也是worker),配置方式比较简单:
cd /opt/module/spark-2.4.1-bin-hadoop2.7/conf
[hadoop@master conf]$ vim spark-env.sh
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master1,slave1,slave2 -Dspark.deploy.zookeeper.dir=/spark"
spark://master01:port1,master02:port2
/opt/module/spark-2.4.1-bin-hadoop2.7/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://master:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
/opt/module/spark-2.4.1-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.1.jar \
100
参数说明:
--master spark://master:7077 指定Master的地址
--executor-memory 1G 指定每个executor可用内存为1G
--total-executor-cores 2 指定每个executor使用的cpu核数为2个
(注意数字后面的反斜杠跟数字要留有空格)
该算法是利用蒙特·卡罗算法求PI
一旦打包好,就可以使用bin/spark-submit脚本启动应用了. 这个脚本负责设置spark使用的classpath和依赖,支持不同类型的集群管理器和发布模式:
./bin/spark-submit \
--class
--master
--deploy-mode
--conf
... # other options
[application-arguments]
一些常用选项:
local |
本地以一个worker线程运行(例如非并行的情况). |
local[K] |
本地以K worker 线程 (理想情况下, K设置为你机器的CPU核数). |
local[*] |
本地以本机同样核数的线程运行. |
spark://HOST:PORT |
连接到指定的Spark standalone cluster master. 端口是你的master集群配置的端口,缺省值为7077. |
mesos://HOST:PORT |
连接到指定的Mesos 集群. Port是你配置的mesos端口, 缺省是5050. 或者如果Mesos使用ZOoKeeper,格式为 mesos://zk://.... |
yarn-client |
以client模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到. |
yarn-cluster |
以cluster模式连接到YARN cluster. 集群的位置基于HADOOP_CONF_DIR 变量找到. |
1. 启动spark shell
/opt/module/spark-2.4.1-bin-hadoop2.7/bin/spark-shell \
--master spark://master:7077 \
--executor-memory 2g \
--total-executor-cores 1
注意:
如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark shell中的程序,其实是启动了spark的cluster模式,如果spark是单节点,并且没有指定slave文件,这个时候如果打开spark-shell 默认是local模式
Local模式是master和worker在同同一进程内
Cluster模式是master和worker在不同进程内
Spark Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ hdfs dfs -put RELEASE /
[hadoop@master spark-2.4.1-bin-hadoop2.7]$ hdfs dfs -ls /
sc.textFile("hdfs://master:9000/RELEASE").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://master:9000/out")
[hadoop@master opt]$ hdfs dfs -cat /out/p*
说明:
sc是SparkContext对象,该对象时提交spark程序的入口
textFile(hdfs://master01:9000/RELEASE)是hdfs中读取数据
flatMap(_.split(" "))先map在压平
map((_,1))将单词和1构成元组
reduceByKey(_+_)按照key进行reduce,并将value累加
saveAsTextFile("hdfs:// master01:9000/out")将结果写入到hdfs中
1.读取数据
val df = spark.read.json("/opt/module/spark-2.4.1-bin-hadoop2.7/examples/src/main/resources/people.json")
2.查看df变量
df.show()
df.filter($"age">21).show()
df.createOrReplaceTempView("persons")
spark.sql("SELECT * FROM persons").show()
scala> spark.sql("SELECT * FROM persons where age > 20").show()
更多内容请关注公众号“测试小号等闲之辈”~