Spark2.1.0 on Hadoop 2.7.0 Setup handbook
部署完成后可以采用Standalone模式(本文的测试环节)、on Yarn模式运行spark作业
1 环境
VitualBox 5.0.24
CentOS-7-x86_64-Minimal-161:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
JDK 1.7u75:网盘
Hadoop-2.7.0-bin.tar.gz:http://mirrors.hust.edu.cn/apache/hadoop/common/
主要参考资料:
本地运行:http://www.cnblogs.com/dasn/articles/5644919.html
分布式运行(包括Standalone、on HDFS 和 on Yarn):http://sofar.blog.51cto.com/353572/1352713/
*安装spark前,Hadoop2.7.0已经部署在VM集群上,$HADOOP_HOME = /usr/hadoop/ (参见上一篇文档《Hadoop2.7-setup-distributed》:http://blog.csdn.net/wingter92)
*本文档实质上是spark的standalone模式,即在spark自身的master/slave架构上进行计算任务分配。Spark也可以运行在yarn、mesos之上,取决于启动参数。
*spark-standalone架构详解:http://blog.csdn.net/zhumr/article/details/52518506
2 安装spark
下载spark安装包
http://spark.apache.org/downloads.html
选择对应的Hadoop环境-Hadoop2.7.0,这里选择下载spark2.1.0
下载得到spark-2.1.0-bin-hadoop2.7
解压:
#tar –zxvf spark-2.1.0-bin-hadoop2.7.tgz –C/usr
#mv /usr/spark-2.1.0 /usr/spark
设置环境变量:
#vim /etc/profile.d/spark.sh
export SPARK_HOME=/usr/spark
export PATH=$PATH:$ SPARK_HOME/bin
设置spark配置文件:
#cd $SPARK_HOME/conf
# mv spark-env.sh.template spark-env.sh
#vim spark-env.sh
export JAVA_HOME=/usr/local/jdk
export SCALA_HOME=/usr/local/scala
export HADOOP_HOME=/usr/local/hadoop
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoopclasspath)
##worker节点的主机名列表
# vim slaves
hadoop.slave1
hadoop.slave2
配置日志设置(默认是没有日志文件的,输出目标只有console):
#cd $SPARK_HOME
#mkdir logs/ #用来存放日志
#cd $SPARK_HOME/conf/
#mv log4j.properties.templatelog4j.properties
修改conf目录下log4j.properties文件,增加log目标FILE及其相关设置:
#vim log4j.properties
log4j.rootCategory= INFO, console, FILE
# Set everything to belogged to the …
…
# log file settings
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=/usr/spark/logs/spark.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
# Set the default spark-shell log level…
…
现在log级别是INFO,冗余信息比较多(可以调节至WARN或DEBUG),日志内容会同时输出到console和指定的文件中。
3 测试Spark
3.1 本地测试
测试示例程序:
#cd $SPARK_HOME
#./bin/run-example SparkPi 10
本地测试spark-shell(其实就是一个application):
测试Spark-shell(Spark-shell的启动依赖HDFS,必须先启动HDFS,否则各种报错,比如连不到hadoop.master:9000)
#start-dfs.sh
#./bin/spark-shell --master local
#--master
参数如果写
local[
线程数
]
则代表本地运行任务,若指定
master
位置(
e.g.,
spark://hadoop.master:7077)则分布式运行
启动后还可以在web界面查看到这个spark-shell的application id。打开http://192.168.1.103:4040,点击Environment:
读取本地的文件到RDD,并做一次action:
textFile.count() // RDD
中的
item
数量,对于文本文件,就是总行数
读取HDFS上的文件,并做一次wordcount:
scala> val file = sc.textFile("hdfs://hadoop.master:9000/testdata/wikipedia.txt")
scala> val count = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_)
scala> count.collect()
scala> :quit
3.2 集群测试
复制spark所有文件到hadoop.slave1和hadoop.slave2上:
#scp –r /usr/spark/root@hadoop.slave1:/usr/
#scp –r /usr/spark/root@hadoop.slave1:/usr/
配置master上的conf/slaves文件:
# cd $SPARK_HOME/conf
# mv slaves_template slaves
# vim slaves
hadoop.slave1
hadoop.slave2
分布式运行要先启动spark守护进程(在7077端口运行):
# cd /usr/spark && .sbin/start-all.sh
# jps
Master节点:
Slave节点:
*从启动信息看出,以standalone模式(master/slave架构)启动了Spark之后,日志输出在各个节点的$SPARK_HOME/logs/*.out,应该和之前在log4j.properties中的设置有关。
启动spark-shell:
#./bin/spark-shell --master
spark://hadoop.master:7077
# 指定master为spark://,说明是standalone模式
--------------------------------------------------------------------------------------------------------------------------------
附:如果以On yarn模式启动spark-shell,启动命令是:
#cd $SPARK_HOME/bin
#./spark-shell --master yarn-client --executor-memory 1G --num-executors 10
--------------------------------------------------------------------------------------------------------------------------------
依旧用wordcount逻辑+HDFS测试:
scala> val file = sc.textFile("hdfs://Hadoop.master:9000/testdata/wikipedia.txt")
scala> val count = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_)
scala> count.collect()
scala> :quit
执行完成,查看一下master上的log:
#less spark-root-org.apache.spark.deploy.master.Master-1-hadoop.master.out # +G
启动spark-shell后的日志如下:
17/07/06 15:24:16 INFO Master: Registeringapp Spark shell
17/07/06 15:24:16 INFO Master: Registeredapp Spark shell with ID app-20170706152416-0000
17/07/06 15:24:16 INFO Master: Launchingexecutor app-20170706152416-0000/0 on worker worker-20170706150950-192.168.1.105-34345
17/07/06 15:24:16 INFO Master: Launchingexecutor app-20170706152416-0000/1 on workerworker-20170706150950-192.168.1.104-33568
在spark-shell中的命令执行过程没有记录,可能日志记录的粒度就是app(spark-shell is actually an application)。
关闭spark standalone的守护进程:
#cd $SPARK_HOME/sbin/
#./stop-all.sh #关闭master和slave进程特别快,比stop-dfs快得多
#记得加上./,否则因为PATH的原因会执行Hadoop的stop-all.sh