架构
Standalone是spark中的集群模式,下图是一个简单的standalone模式架构图
Dirver:1.提交任务;2.监控任务
Master:1.资源调度;2.分发任务
Worker:1.接收master的任务并启动任务;2.向master汇报资源,健康信息
Executor:1.接收worker的任务并执行;2.向worker汇报任务的执行情况;3.向Diver展示结果。
搭建
1.还是使用从官网下载的安装包将其拷贝到linux下然后解压缩
tar -zxvf spark-1.4.1-bin-hadoop2.6.tgz
2.spark基本配置,spark解压缩后会有logs,sbin,bin,conf等目录
在解压后的conf目录下的spark-env.sh中更改spark的配置
(/usr/local/spark-1.4.1-bin-hadoop2.6/conf)中执行改名命令
[root@shb01 conf]# mv spark-env.sh.template spark-env.sh
本地模式启动不改也行
在此文件中配置jdk,这个最好加上
export JAVA_HOME= /usr/local/jdk1.7.0_79
其它spark配置,这些配置可以手动更改不同的节点内存端口都可以不一样,我在搭建时并没有改。
如果不置顶master_ip则先启动的那个节点就是Master,另外在sbin目录下的start-master.sh脚本中也可以更改master的8080端口但不建议在这里改
Master的端口(spark协议),IP,WEBUI端口
Worker的WEBUI端口,cpu核数,内存
export SPARK_MASTER_IP= 127.0.0.1 (指定主节点)
export SPARK_WORKER_CORES=6 (配置worker节点的cpu核数)
export SPARK_MASTER_PORT= 7076 (spark URL端口,如 spark://shb01:7076),注意这个使用的是spark协议
export SPARK_MASTER_WEBUI_PORT=8080 (master webUI地址)
export SPARK_WORKER_WEBUI_PORT=8081 (worker webUI地址)
export SPARK_WORKER_MEMORY=10g (每个worker占多少内存,这个值如果比实际内存大启动时不会报错用的时候不够会报错)
3.slaves节点配置
首先改名字
[root@shb01 conf]# mv slaves.templateslaves
然后增加节点
[root@shb01 conf]# more slaves
# A Spark Worker will be started on each ofthe machines listed below.
192.168.79.131
192.168.79.139
4.拷贝到139
[root@shb01 local]# scp -rspark-1.4.1-bin-hadoop2.6 root@192.168.79.139:/usr/local/
5.ssh-keygen-t rsa 产生密钥,提示时全部回
ssh-copy-id –I shb01 <ip地址> (ip地址是你具体要和谁免key,自己也要和自己设置免key)
ssh shb01 如果正常看能不能登录
[root@shb01 hadoop-2.6.0]# ssh shb01
Lastlogin: Wed Aug 10 01:42:12 2016 from 192.168.79.1
[root@shb01~]# exit
logout
Connectionto shb01 closed.
[root@shb01hadoop-2.6.0]#
注意:配置是节点自己也要配置免密码登录,我就是忘了这部结果搞了很久后才发现
6.启动spark集群
在sbin目录下执行启动命令,同样如果修改了spark-env.sh则可以执行stop-all.sh后再次启动
[root@shb01 sbin]# start-all.sh
[root@shb01 sbin]# jps
5055 Worker
4902 Master
5158 Jps
Master在131上,通过jsp命令可以看到有两个进程master和worker,139上只有worker
7.日志和webUI
在启动后会创建logs目录在其中可以看到master和worker的日志信息,139上只有worker日志。
Master日志
Worker日志
MASTER WebUI,可以看到显示spark集群中的两个worker
Worker webUI,下图是131上的worker信息,139同理
8.其它参数
以下是spark其它几个参数,还是spark-env.sh文件中
设置GC参数
export SPARK_JAVA_OPTS="-verbose:gc -XX:-PrintGCDetails-XX:+PrintGCTimeStamps”
当一台机器内存大于200G时可以设置多个worker来平分内存,有资料说内存大于200G时java虚拟机性能不好。
export SPARK_WORKER_INSTANCES=2
下图中可以看到集群中的131节点有两个worker,131我设置了5G内存实际上只有1G但启动不报错用的时候不够才报错。
PID的存储位置,这里存储的是master与worker的对应关系以保持二者通信,不然会宕机。默认是在/tmp目录下,最好改位置RHEL6系统默认会自动清理/tmp文件夹,默认是30天。
export SPARK_PID_DIR=/usr/local/spark/tmp
Spark中shuffle的输出地址,一般一个目录下挂一个硬盘多个目录以逗号分开
export spark.local.dir=/opt1/spark, /opt2/spark,/opt3/spark
另外spark-defaults.conf也可以配置参数
export spark.master spark://shb01:7077 // spark://主机名:7077
任务提交
spark集群启动后再执行bin目录下的spark_shell命令,将任务提交给集群管理。
[root@shb01 bin]# MASTER=spark://shb01:7077 ./spark-shell
启动成功后在masterUI页面中可以看到Application ID,job调动是FIFO先进先出。
本地读取
Dirver会读取所有worker下的数据文件如果那一个worker中没有这个文件就会报错。
本地读取时有两个可能,1.在那个worker上执行命令就以那个worker上的文件为准;2.按照文件的时间顺序读取最新的文件。
执行如下命令,例子是单词计数
scala>sc.textFile("/usr/local/word").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).collect
报错是因为spark集群中有131和139两个worker但是139上的linux没有word文件
拷贝word文件到139并更改文件中的内容然后再次提交此任务
[root@shb01 local]# scp word root@192.168.79.139:/usr/local/
远程读取
Dirver可以从hdfs集群中读取数据,有namenode负责管理集群资源。
先启动hadoop集群(或hdfs)再执行如下命令
sc.textFile("hdfs://shb01:9000/word").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).collect
sc.textFile("hdfs://shb01:9000/word").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).saveAsText("hdfs://shb01:9000/word_spark_standalone")
standalone高可靠
拷贝文件到节点上
[root@shb01 local]# tar -zxvfzookeeper-3.4.8.tar.gz
2.更改conf目录下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/logs
clientPort=2181
server1=shb01:2888:3888
3.启动zookeeper,在bin目录下执行启动命令
[root@shb01 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config:/usr/local/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@shb01 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config:/usr/local/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: standalone
4.修改spark的配置spark_env.sh文件,配置SPARK_DAEMON_JAVA_OPTS参数
exportSPARK_DAEDOM_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER-Dspark.deploy.zookeeper.url=shb01:2181 -Dspark.deploy.zookeeper.dir=/sparkpark"
spark集群中所有的节点都要配置且在spark_env.sh中不要指定MASTER的IP
5.启动spark集群