机器部署
准备三台Linux服务器,安装好JDK1.7
下载Spark安装包
上传spark-2.1.0-bin-hadoop2.6.tgz安装包到Linux(intsmaze-131)上
解压安装包到指定位置tar -zxvf spark-2.1.0-bin-hadoop2.6.tgz -C /home/hadoop/app/spark2.0/
原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6569036.html
微信:intsmaze
配置Spark
进入到Spark安装目录
cd /spark-2.1.0-bin-hadoop2.6/conf
mv spark-env.sh.template spark-env.sh
vi spark-env.sh
在该配置文件中添加如下配置
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_65 export SPARK_MASTER_IP=intsmaze-131(指定standalone模式中主节点master是哪一台spark节点) export SPARK_MASTER_PORT=7077
mv slaves.template slaves
vi slaves
在该文件中添加子节点所在的位置(Worker节点)
intsmaze-131 intsmaze-132 intsmaze-134
将配置好的Spark拷贝到其他节点上
scp -r spark-2.1.0-bin-hadoop2.6/ intsmaze-132:/home/hadoop/app/spark2.0/ scp -r spark-2.1.0-bin-hadoop2.6/ intsmaze-134:/home/hadoop/app/spark2.0/
Spark集群配置完毕,目前是1个Master,3个Work,在intsmaze-131(master节点)上启动Spark集群
/home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/sbin/start-all.sh(spark集群不需要启动hadoop集群等,与hadoop集群无关。如果配置为spark on yarn上,那么必须启动spark和yarn集群而不需要启动hadoop)
启动后执行jps命令,主节点上有Master进程和Work进程,其他子节点上有Work进程,登录Spark管理界面查看集群状态(主节点):http://intsmaze-131:8080/
执行第一个spark程序
/home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://intsmaze-131:7077 --executor-memory 1G --total-executor-cores 2 /home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.1.0.jar 100
该算法是利用蒙特·卡罗算法求PI。
启动Spark Shell
spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。
/home/hadoop/app/spark2.0/spark-2.1.0-bin-hadoop2.6/bin/spark-shell --master spark://intsmaze-131:7077 --executor-memory 2g --total-executor-cores 2
参数说明:
--master spark://intsmaze-131:7077 指定Master的地址
--executor-memory 2g 指定每个worker可用内存为2G,现有集群该任务将无法启动,应该修改为512m。
--total-executor-cores 2 指定整个任务使用的cup核数为2个。
注意:如果给该任务分配的资源无法达到指定的,将无法成功启动job。比如服务器节点可以内存为为1G,你设置每个worker2G,将会无法启动任务。askSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark shell中的程序,其实是启动了spark的local模式,该模式仅在本机启动一个进程,没有与集群建立联系。Spark Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可。
在spark shell中编写WordCount程序
1.首先启动hdfs
2.向hdfs上传一个文件到intsmaze-131:9000/words.txt
3.在spark shell中用scala语言编写spark程序
sc.textFile("hdfs://192.168.19.131:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://192.168.19.131:9000/out")
4.使用hdfs命令查看结果
hdfs dfs -ls hdfs://intsmaze-131:9000/out/p*
说明:
sc是SparkContext对象,该对象时提交spark程序的入口 textFile(hdfs://intsmaze-131:9000/words.txt)是hdfs中读取数据 flatMap(_.split(" "))先map在压平 map((_,1))将单词和1构成元组 reduceByKey(_+_)按照key进行reduce,并将value累加 saveAsTextFile("hdfs://intsmaze-131:9000/out")将结果写入到hdfs中
配置Spark的高可用
到此为止,Spark集群安装完毕,但是有一个很大的问题,那就是Master节点存在单点故障,要解决此问题,就要借助zookeeper,并且启动至少两个Master节点来实现高可靠,配置方式比较简单:
Spark集群规划:intsmaze-131,intsmaze-132是Master;intsmaze-131,intsmaze-132,intsmaze-134是Worker
安装配置zk集群,并启动zk集群
停止spark所有服务,修改配置文件spark-env.sh,在该配置文件中删掉SPARK_MASTER_IP并添加如下配置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk1,zk2,zk3 -Dspark.deploy.zookeeper.dir=/spark"
在node4上执行sbin/start-all.sh脚本,然后在node5上执行sbin/start-master.sh启动第二个Master