blueyi's notes

Follow Excellence,Success will chase you!

0%

Spark 2.1.0 On Hadoop 2.7集群配置过程

系统环境为Ubuntu 16.04.2 x86_64,已经配置好了Hadoop 2.7。配置Hadoop集群环境可以参考这里

约定将spark安装在/usr/spark,之前安装的Hadoop在路径/usr/hadoop,这里直接在已经配置好的三台hadoop上配置spark,依然将master节点做为master及worker,其他2个节点做为worker。
Spark官方下载地址:http://spark.apache.org/downloads.html

配置

下载并安装

1
2
3
wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.1.0/spark-2.1.0-bin-hadoop2.7.tgz
tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz
mv spark-2.1.0-bin-hadoop2.7 /usr/spark

配置
需要修改的文件在路径/usr/spark/conf下,这里我们只需要简单修改spark-env.shslaves,更多参数可以参见官方文档。
spark-env.sh
将官方提供的模板复制一份

1
cp spark-env.sh.template spark-env.sh

添加如下内容:

1
2
export HADOOP_CONF_DIR=/usr/hadoop/etc/hadoop
export SPARK_MASTER_HOST=master

slaves
将官方提供的模板复制一份

1
mv slaves.template slaves

添加如下内容:

1
2
3
localhost
slave1
slave2

如果环境变量配置的都没有问题的话,现在可以运行以下官方示例计算pi值(在路径/usr/spark下执行):

1
./bin/run-example SparkPi 10

输出内容的最后面为:

1
2
3
4
5
6
7
8
9
17/03/11 00:28:31 INFO ui.SparkUI: Stopped Spark web UI at http://192.168.1.124:4040
17/03/11 00:28:31 INFO spark.MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
17/03/11 00:28:31 INFO memory.MemoryStore: MemoryStore cleared
17/03/11 00:28:31 INFO storage.BlockManager: BlockManager stopped
17/03/11 00:28:31 INFO storage.BlockManagerMaster: BlockManagerMaster stopped
17/03/11 00:28:31 INFO scheduler.OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
17/03/11 00:28:31 INFO spark.SparkContext: Successfully stopped SparkContext
17/03/11 00:28:31 INFO util.ShutdownHookManager: Shutdown hook called
17/03/11 00:28:31 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-8e83fd0b-bc88-4452-998a-9ca4300097b8

往上翻就会看到Pi is roughly 3.1413151413151414

为了方便执行spark-shell,将spark的bin路径添加到PATH,修改.bashrc添加如下内容:

1
2
3
4
# Spark
export SPARK_HOME=/usr/spark
PATH=$PATH:$SPARK_HOME/bin
export PATH

将spark拷贝到其他节点:

1
2
scp -r /usr/spark slave1:/usr/
scp -r /usr/spark slave1:/usr/

同样将修改的.bashrc拷贝到其他节点,这里spark的环境变量并非必须,只是为了方便执行spark目录下bin中的程序

启动spark集群

首先启动HDFS和yarn:

1
2
/usr/hadoop/sbin/start-dfs.sh
/usr/hadoop/sbin/start-yarn.sh

为了方便查看完成的历史任务,启动jobhistory:

1
/usr/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver

启动spark,为了省事,一次性启动所有master和worker:

1
usr/spark/sbin/start-all.sh

现在查看master上的java进程信息:

1
2
3
4
5
6
7
8
9
10
1377 NameNode
5235 Worker
6997 Jps
5461 SparkSubmit
5096 Master
3593 ResourceManager
3737 NodeManager
2362 JobHistoryServer
1533 DataNode
1726 SecondaryNameNode

worker上的信息:

1
2
3
4
2577 Worker
1267 DataNode
2787 Jps
2159 NodeManager

可以查看web UI:http://192.168.1.187:8080
如果显示的Alive Worker数量为3以及内容和CPU核数都与实际相符,则表示spark已经配置并启动完成
该页面前面的REST URL即是在cluster模式提交spark任务所需要的地址

验证

YARN方式计算Pi
可以在任何节点上运行以下命令,注意--master替换成你自己的

1
2
3
4
5
6
7
8
9
/usr/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://wyl-node1:6066 \
--deploy-mode cluster \
--supervise \
--executor-memory 1G \
--total-executor-cores 10 \
/usr/spark/examples/jars/spark-examples_2.11-2.1.0.jar \
100000

可以根据自己的配置调整参数,输出中会包含如下信息:

1
2
3
4
5
6
7
8
9
client token: N/A
diagnostics: N/A
ApplicationMaster host: 192.168.1.187
ApplicationMaster RPC port: 0
queue: default
start time: 1489166056893
final status: UNDEFINED
tracking URL: http://master:8099/proxy/application_1489144101889_0003/
user: root

由于是yarn模式运行,所以无法通过4040端口的页面查看信息,但可以打开提示的相应节点的URL查看到当前的任务执行情况,点击Executors可以看到各work及RDD信息,如果显示的信息与实际相符,说明集群已经完全启动并正在工作
本例中YARN的网页地址是http://192.168.1.187:8099
注意Spark Master的WEB UI默认商品是8080,即本例中的网址http://192.168.1.187:8080/
当Spark运行于standalone cluster模式时可以通过4040端口的WEB UI查看详细信息,即本例中的http://192.168.1.187:4040,注意该页面只在有standalone任务运行时才能查看,例如使用spark-shell时
计算完成之后,输出中会有final status: SUCCEEDED
通过8099端口的网页,打开相应的任务ID,进入后从Logs里面点击stdout,会看到Pi is roughly 3.141758431417584

Standalone Cluster模式运行Spark
运行代码为:

1
2
3
4
5
6
7
8
9
/usr/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://wyl-node1:6066 \
--deploy-mode cluster \
--supervise \
--executor-memory 1G \
--total-executor-cores 10 \
/usr/spark/examples/jars/spark-examples_2.11-2.1.0.jar \
10000

通过master的4040端口查看

spark shell
这里使用python语言,所以需要用pyspark
首先将Spark根目录下面的README.md上传到相应用户的HDFS目录下:

1
hdfs dfs -put README.md /user/root

进入spark shell:

1
./bin/pyspark

如果刚才设置过spark环境变量,可以直接执行pyspark,输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
17/03/10 23:50:50 WARN metastore.ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.1.0
/_/

Using Python version 2.7.12 (default, Nov 19 2016 06:48:10)
SparkSession available as 'spark'.

输出中的那个警告应该是没有安装HIVE或HBase引起的。
下面就是正常的python语言:

1
2
3
4
5
6
7
8
>>> textFile = sc.textFile("README.md")
>>> textFile.count() #统计RDD中的元素数
104
>>> textFile.first() #返回RDD中的第一个元素
u'# Apache Spark'
>>> linesWithSpark = textFile.filter(lambda line: "Spark" in line)
>>> textFile.filter(lambda line: "Spark" in line).count() # 包含`Spark`的行数
20

如果这里都没有问题,说明Spark已经可以正常工作,剩下的就是学习Spark了

默认配置情况下spark从非master节点启动会有web ui相关的错误提示,直接从master节点关闭spark之后再重新启动即可

参考:
1.Spark官网:http://spark.apache.org/
2.Running Spark on YARN: http://spark.apache.org/docs/latest/running-on-yarn.html
3.Submitting Applications:http://spark.apache.org/docs/latest/submitting-applications.html
4.Quora-How do I set up Apache Spark with Yarn Cluster?

Welcome to my other publishing channels