标签:
标签: spark
spark SQL -- spark streaming -- MLlib -- GraphX
下载hadoop-2.6.0,解压,到etc/hadoop/目录下
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://worker1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.6.0/tmp</value>
</property>
<property>
<name>hadoop.native.lib</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
</configuration>
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>worker1:50090</value>
<description>The secondary namenode http server address and port.</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop-2.6.0/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop-2.6.0/dfs/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///opt/hadoop-2.6.0/dfs/namesecondary</value>
<description>Determines where on the local filesystem the DFSsecondary name node should store the temporary images to merge. If this is acomma-delimited list of directories then the image is replicated in all of thedirectories for redundancy.</description>
</property>
</configuration>
export JAVA_HOME=/opt/jdk
export HADOOP_HOME=/opt/hadoop-2.6.0
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>worker1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
$ sbin/start-dfs.sh //开启进程
jps
5212 NameNode
5493 SecondaryNameNode
5909 Jps
5336 DataNode
//如果没有DataNode,查看log/下的最新启动情况
可能是因为hostname没有改为worker1引起,每次重启虚拟机会遇到这种情况。
再次sbin/start-dfs.sh 如果namenode没有起来
$ bin/hdfs namenode -format //格式化
最后浏览器查看worker1:50070
A.下载及配置JDK,Scala,sbt,Maven 到/opt 目录下
JDK jdk-7u79-linux-x64.gz
Scala http://downloads.typesafe.com/scala/2.10.5/scala-2.10.5.tgz
Maven apache-maven-3.2.5-bin.tar.gz
SBT sbt-0.13.7.tgz
解压 tar zxf jdk-7u79-linux-x64.gz
tar zxf scala-2.10.5.tgz
B.配置
vi ~/.bash_profile ##vi /etc/profile 以下皆替换
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/opt/scala-2.10.5
export PATH=$PATH:$SCALA_HOME/bin
$ source /etc/profile //source ~/.bash_profile
C.测试
$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
$ scala -version
Scala code runner version 2.10.5 -- Copyright 2002-2013, LAMP/EPFL
D.Maven,sbt配置
export MAVEN_HOME=/opt/apache-maven-3.2.5
export SBT_HOME=/opt/sbt
export PATH=$PATH:$SCALA_HOME/bin:$MAVEN_HOME/bin:$SBT_HOME/bin
$source /etc/profile
$ mvn --version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
Maven home: /opt/apache-maven-3.2.5
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: /opt/jdk
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-504.el6.x86_64", arch: "amd64", family: "unix"
$ sbt --version //warning ‘--‘
sbt launcher version 0.13.7
A.下载Hadoop,Spark
spark-1.4.0 http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0-bin-hadoop2.6.tgz
Hadoop http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
解压
$ tar zxf spark-1.4.0-bin-hadoop2.6.tgz
$ tar zxf hadoop-2.6.0.tar.gz
$ ll 查看
B. 配置Hadoop,Spark的安装目录
vi ~/.bash_profile
export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/opt/scala/scala-2.10.5
export SPARK_HOME=/opt/spark-1.4.0-bin-hadoop2.6
export HADOOP_HOME=/opt/hadoop-2.6.0
export HADOOP_CONF_DIR=/opt/hadoop-2.6.0/etc/hadoop
export MAVEN_HOME=/opt/apache-maven-3.2.5
export SBT_HOME=/opt/sbt
export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$MAVEN_HOME/bin:$SBT_HOME/bin
source ~/.bash_profile
A.复制配置文件
# cd spark-1.4.0-bin-hadoop2.6
# cd conf
# cp spark-env.sh.template spark-env.sh
在spark-env.sh最后添加下面
export SCALA_HOME=/opt/scala-2.10.5
export SPARK_MASTER_IP=worker1 //如果是master需要改动
export SPARK_WORKER_MEMORY=1G
export JAVA_HOME=/opt/jdk //注意jdk的文件名变了
export HADOOP_HOME=/opt/hadoop-2.6.0
export HADOOP_CONF_DIR=/opt/hadoop-2.6.0/etc/hadoop
配置spark-defaults.sh, 后面添加
spark.master spark://worker1:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://worker1:9000/usr
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.yarn.historyServer.address worker1:18080
spark.history.fs.logDirectory hdfs://worker1:9000/usr ##根据情况在hadoop hdfs目录下添加/usr 文件夹
B.配置slaves
在slaves最后添加下面
worker1
worker2
worker3
cd ..
./sbin/start-master.sh
./sbin/start-slaves.sh spark://worker1:7077
出错
worker1: ssh: Could not resolve hostname worker1: Name or service not known
#vim /etc/hosts
添加
192.168.35.131 worker1
jps查看master和worker节点上验证spark集群是否正确启动:
通过浏览器查看spark集群是否启动成功:http://master:8080
./bin/spark-shell --master spark://worker1:7077
如果是master改动worker1
浏览器登录 http://worker1:4040/
./sbin/start-history-server.sh
浏览器登录worker1:18080
a. 将spark安装包下的README.md上传到hdfs:hdfs dfs -put README.md /data/
直接在spark目录下
# hdfs dfs -mkdir -p /data
#hdfs dfs -put README.md /data
b. 通过hdfs的web控制台查看可见上传成功
c. 在spark-shell中对上传的文件进行操作:
val file=sc.textFile("/data/README.md")
对读取的文件进行count操作:
val count = file.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
count.collect //用collect命令提交并执行Job:
d. 从webUI可见job成功执行:http://master:4040
e. 通过jobhistoryserver可以查看程序执行的历史信息:http://master:18080
注:4040端口用来查看正在运行的程序的job信息,而18080用来查看执行完毕的程序的job信息。
a. 通过以下命令提交spark自带的sparkPi程序:
>>exit //退出spark-shell
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 $SPARK_HOME/lib/spark-examples-1.4.0-hadoop2.6.0.jar //注意这是1.4版本的,不要直接复制,submit指定的主机名也要按实际更改
b. http://worker1:18080/ //浏览器查看
出现问题:
ERROR cluster.SparkDeploySchedulerBackend: Application has been killed. Reason: All masters are unresponsive! Giving up.
参考:
spark 案例集群测试整理
http://blog.csdn.net/javastart/article/details/43730085
1.Maven编译
下载代码 wget http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0.tgz
$ tar zxvf spark-1.4.0.tgz
$ cd spark-1.4.0
$build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
更为简单的方法,shell脚本编译:
$./make-distribution.sh --tgz -Phadoop-2.6 -Pyarn -DskipTests -Dhadoop.version=2.6.0 -Phive -Phivethriftserver
clean package
2.SBT编译
#build/sbt -Pyarn -Phadoop-2.6 assembly
cd ../spark-1.4.0-bin-hadoop2.6
在slaves最后添加下面
worker2
worker3
$vim /etc/hosts
添加
192.168.35.131 worker1
192.168.35.128 worker2
192.168.35.129 worker3
a:worker1上生成密钥
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker1 //测试分发秘钥给本机
b:把本机的公钥追到worker2的 .ssh/authorized_keys 里
ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker2
c:测试
ssh worker2
exit 退出
./sbin/start-all.sh
1: spark-shell
./bin/spark-shell --executor-memory 1g --driver-memory 1g --master spark://worker1:7077
2: spark-submit
./bin/spark-submit --class "SimpleApp" --master spark://worker1:7077 /opt/simple-project_2.10-1.0.jar
默认情况下,Standalone的Spark集群是Master-Slaves架构的集群模式,由一台master来调度资源,这就和大部分的Master-Slaves结构集群一样,存在着Master单点故障的问题。如何解决这个单点故障的问题呢?Spark提供了两种方案:基于文件系统的单点恢复(Single-Node Recovery with Local File system)和基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)。其中ZooKeeper是生产环境下的最佳选择。
ZooKeeper提供了一个Leader Election机制,利用这个机制你可以在集群中开启多个master并使它们都注册到ZooKeeper实例,ZooKeeper会管理使其中只有一个是Active的,其他的都是Standby的,Active状态的master可以提供服务,standby状态的则不可以。ZooKeeper保存了集群的状态信息,该信息包括所有的Worker,Driver 和Application。当Active的Master出现故障时,ZooKeeper会从其他standby的master中选举出一台,然后该新选举出来的master会恢复挂掉了的master的状态信息,之后该Master就可以正常提供调度服务。整个恢复过程只需要1到2分钟。需要注意的是,在这1到2分钟内,只会影响新程序的提交,那些在master崩溃时已经运行在集群中的程序并不会受影响。
CuratorFramework极大的简化了ZooKeeper的使用,它提供了high-level的API,并且基于ZooKeeper添加了很多
特性,包括
自劢连接管理:连接到ZooKeeper的Client有可能会连接中断,Curator处理了这种情况,对于Client来说自劢重连
是透明的。
简洁的API:简化了原生态的ZooKeeper的方法,事件等;提供了一个简单易用的接口。
Recipe的实现:
– Leader的选择
– 共享锁
– 缓存和监控
– 分布式的队列
– 分布式的优先队列
1 .下载
官网下载http://www.apache.org/dyn/closer.cgi/zookeeper/
tar zxf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
首先创建datadir和datalogdir,可以用以下命令创建: mkdir data; mkdir logs:
修改环境变量: vim ~/.bashrc:
export ZOOKEEEPER_HOME=/opt/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source ~/.bashrc
2 .配置
cd conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
最后面加上
dataDir=/opt/zookeeper-3.4.6/data
dataLogDir=/opt/zookeeper-3.4.6/logs
server.0=worker1:2888:3888
server.1=worker2:2888:3888
server.2=worker3:2888:3888
注:
dataDir指定的是用来存储内存里数据的快照文件的目录;(在不指定dataLogDir时,该目录也是数据库的更改事务日志的存储目录);
dataLogDir指定的是数据库的事务日志的存储目录;
server.0,server.1,server.2指定的是ZooKeeper集群的各个节点,这里的数字012对应该节点datadir下的myid文件的内容(在此强调:必须在这里指定所有ZooKeeper节点!)。
两个端口" 2888" and "3888",前者是ZooKeeper各个节点相互连接通信所用,后者是leader 选举所用。
更详细的信息请参阅:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html
echo 0 > myid
注意:myid文件的内容对应于zoo.cfg中指定的该节点的id,即配置文件中的server.0.
4.复制到其它节点并设置serverid,使用scp命令将ZooKeeper拷贝到另外2台机器上(生产环境的最佳实践是用3台机器做HA),配置另外2台机器的环境变量并source使之生效:
scp -r zookeeper-3.4.6/ root@worker2:/opt/zookeeper-3.4.6
scp -r zookeeper-3.4.6/ root@worker3:/opt/zookeeper-3.4.6
vim ~/.bashrc:
export ZOOKEEEPER_HOME=/opt/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source ~/.bashrc
在另外2台机器上将data 目录下的文件myid的内容分别修改为1和2。
echo "1">myid
echo "2">myid
5.运行zookeeper集群:
a. 在安装了zk的各个节点上分别执行: zkServer.sh start
b. jps验证启动成功与否,若见‘QuorumPeerMain’表明进程已启动。
注意:进程启动成功不代表ZooKeeper已经可以开始提供服务。
c. zkServer.sh status验证启动成功与否,并查看哪台机器被选为leader.
在master节点上启动并验证ZooKeeper状态:
/opt/zookeeper-3.4.6/bin/zkServer.sh start
jps
zkServer.sh status
注意: 见如下错误信息,‘Error contacting service. It is probably not running.’,但这是正常的,一旦你在另外2台节点上启动了ZooKeeper,该错误信息将不会再出现。一个简单的事实是,只有超过一半的ZooKeeper节点启动后,ZooKeeper才可以正常提供服务。
在另外2台机器上启动并验证ZooKeeper:
/opt/zookeeper-3.4.6/bin/zkServer.sh start
jps
zkServer.sh status
再到master上验证ZooKeeper状态:
可见,现在master节点的错误信息不见了。
现在3台节点的ZooKeeper都已经启动成功,且一台(worker2)是Leader,其它都是follower.ZooKeeper已经启动成功,并正常对外提供服务!
测试:
运行 ./bin/zkCli.sh (bin/zkCli.sh -server 127.0.0.1:2181)
根目录 ls /
1 .修改配置
cd $SPARK_HOME/conf;
vim spark-env.sh:
注释掉export SPARK_MASTER_IP=MASTER
添加export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=worker1:2181,worker2:2181,worker3:2181 -Dspark.deploy.zookeeper.dir=/spark"
注意:所有准备用来做master的节点都需要做这个修改。
复制到其它2个节点
scp -r ./spark-env.sh root@worker2:/opt/spark-1.4.0-bin-hadoop2.6/conf
scp -r ./spark-env.sh root@worker3:/opt/spark-1.4.0-bin-hadoop2.6/conf
配置:
spark.deploy.recoveryMode=ZOOKEEPER
spark.deploy.zookeeper.url=worker1:2181,worker2:2181, worker3:2181
spark.deploy.zookeeper.dir=/spark
参数 默认值 描述
spark.deploy.recoveryMode
NONE
恢复模式(Master重新启劢的模式),
有三种:1.ZooKeeper, 2. FileSystem, 3
NONE
spark.deploy.zookeeper.url
无
ZooKeeper的Server地址
spark.deploy.zookeeper.dir
/spark
ZooKeeper 保存集群元数据信息的文件
目录,包括Worker,Driver和
Application。
16/02/24 00:21:07 WARN util.Utils: Service ‘sparkMaster‘ could not bind on port 7077. Attempting port 7078.
Exception in thread "main" java.net.BindException: Cannot assign requested address: Service ‘sparkMaster‘ failed after 16 retries!
c. start-slaves.sh会在slaves 文件中指定的每个节点上分别调用start-slave.sh来启动worker进程,并尝试注册到特定的master上。这个master通过以下方式获取:首先尝试从spark-env.sh中获取spark_master_ip,获取到的话,该参数对应的节点(可以是当前节点也可以不是当期节点)就是master节点;如果没有获取到的话,则会视当前节点为master节点。该命令不能从命令行接受参数:
d. start-slave.sh: start-slave.sh必须在命令行指定master(s). 该命令会从命令行的第一个参数中取得master节点。
事实上,该命令常用来在集群中动态添加worker节点,即:整个集群已经启动并正常提供服务,这时有新的节点可用,我们要把它动态添加到集群中,而不必关闭正在运行的集群,就可以使用该命令。
e. 不论你用哪种方式启动worker(start-slaves.sh 或start-slave.sh),当对应的Master没有启动或启动了但不是active状态的话,该worker进程仍然可以启动成功(即Jps可见该进程),但由于没能向master注册成功,它并不能提供服务,它会一直尝试向master注册!
通过上面的分析,我们知道当spark_env.sh中没有配置spark_master_ip时,提交命令(start-all.sh, start-master.sh或start-slaves.sh)的host会被视为master节点。在ZooKeeper下,所有的ZooKeeper节点都必须做step4中的修改,即注释掉SPARK_MASTER_IP的配置,并添加SPARK_DAEMON_JAVA_OPTS.
事实上,我们可以在任意一个已经启动了ZooKeeper且ZooKeeper正常提供服务的节点上通过命令start-all.sh来启动spark集群,不管该节点在ZooKeeper中的状态是leader还是follower. (当然你也可以只在该节点上start-master.sh,后续通过start-slaves.sh再启动workers.)
在这里我们在master节点上用start-all.sh来启动spark集群。
因为spark只是一个计算框架,在这里我们还是使用hadoop的hdfs作为文件系统,故需要首先需要确保hdfs已经启动并正常提供服务:
确保ZooKeeper已经启动并正常提供服务:
Master节点处于follower状态:
Worker1处于leader状态:
Worker2处于follower状态:
在master节点上用start-all.sh来启动spark集群:(当然你也可以在worker1或worker2上使用start-all.sh来启动整个集群,或只是start-master.sh来启动master进程):
注:若你正确地配置了某个节点使用ZooKeeper,(即配置了SPARK_DAEMON_JAVA_OPTS且注释掉了SPARK_MASTER_IP),但在没有成功启动ZooKeeper的情况下使用命令start-master.sh来启动master的话,master仍能成功启动,但会处于standby即不能提供服务:
再次强调:需要在成功地启动了ZooKeeper集群的基础上(至少在一半以上的ZooKeeper节点上成功启动了ZooKeeper进程),才能去启动spark集群!
worker1: jps
worker2: jps
worker3: jps
可见只有手动提交了start-all.sh或start-master.sh的master节点有MASTER进程,其他节点则没有。
注意:即使有了master进程,也不代表master已经启动并能提供服务,这还要看master的状态是否是ACTIVE.
可见master处于ALIVE状态,在正常提供服务。
事实上,第一台手动启动了master进程的节点一定是alive状态的,不管该节点在zk上是leader还是follower!
再次强调: 这些节点的spark-env.sh中一定要正确配置为使用ZooKeeper, 即正确配置了SPARK_DAEMON_JAVA_OPTS,否则的话这些启动了的多个masters不能发觉彼此的存在,从而都将自己视为ACTIVE状态,这将置于个集群于不健康状态(因为这些masters都会独立提供资源调度服务)。这个错误如此常见,以至于在官网上也有说明:
在worker2上启动master并jps查看进程:
worker2
worker3
总结:手动启动的第一个master是ACTIVE状态,后续启动的masters是STANDBY状态, 这与哪个节点是leader,哪个节点是follower没有关系。
注:这些节点有的在zk中可能是leader,但这不影响。
1、spark-submit提交一个简单的程序,参考http://spark.apache.org/docs/latest/quick-start.html
提供操作步骤和运行结果的截图。
spark集群与spark HA高可用快速部署 spark研习第一季
标签:
原文地址:http://blog.csdn.net/refuil/article/details/51991536