一、Spark 集群安装运行

本贴最后更新于 2322 天前,其中的信息可能已经时移世异

一、Spark 集群安装运行

标签(空格分隔): Spark


1. 准备工作

主机名 IP 地址 类型
ubuntu1 192.168.1.106 Master
ubuntu2 192.168.1.110 Slaves
ubuntu3 192.168.1.197 Slaves

2. 安装 JDK

这步去官网下载 jdk 然后解压,配置下环境变量就行了。我的版本如下:

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

Spark 是由 Scala 编写的,这里下载的是已经编译过的版本,所以就不需要安装 Scala。


3. 安装 Spark

3.1 下载 Spark

直接去 Spark 官网 http://spark.apache.org/downloads.html 下载即可。

3.2 安装 Spark

解压即可,环境变量要不要配置随意
tar -zvxf spark-2.2.0-bin-hadoop2.7.tgz

shiwei@ubuntu1:~/soft$ ll spark-2.2.0-bin-hadoop2.7/
total 116
drwxr-xr-x  2 shiwei shiwei  4096 Jul  1 07:09 bin/
drwxr-xr-x  2 shiwei shiwei  4096 Nov  6 11:16 conf/    # 这里是一些配置文件和其模板
drwxr-xr-x  5 shiwei shiwei  4096 Jul  1 07:09 data/
drwxr-xr-x  4 shiwei shiwei  4096 Jul  1 07:09 examples/    #一些例子
drwxr-xr-x  2 shiwei shiwei 12288 Jul  1 07:09 jars/    # Spark 依赖的jar
-rw-r--r--  1 shiwei shiwei 17881 Jul  1 07:09 LICENSE
drwxr-xr-x  2 shiwei shiwei  4096 Jul  1 07:09 licenses/
drwxrwxr-x  2 shiwei shiwei  4096 Nov  6 12:59 logs/    # 日志目录,运行后才会自动生成该目录
-rw-r--r--  1 shiwei shiwei 24645 Jul  1 07:09 NOTICE
drwxr-xr-x  8 shiwei shiwei  4096 Jul  1 07:09 python/  # Spark 的 Python版本
drwxr-xr-x  3 shiwei shiwei  4096 Jul  1 07:09 R/   # Spark 的 R 版本 
-rw-r--r--  1 shiwei shiwei  3809 Jul  1 07:09 README.md
-rw-r--r--  1 shiwei shiwei   128 Jul  1 07:09 RELEASE
drwxr-xr-x  2 shiwei shiwei  4096 Jul  1 07:09 sbin/    # Spark 一些常用的操作,如启动关闭
drwxr-xr-x  2 shiwei shiwei  4096 Jul  1 07:09 yarn/

3.3 配置 Spark

修改 conf 下两个配置文件即可让 Spark 集群跑起来。

cp spark-env.sh.template spark-env.sh
cp slaves.template slaves

分别从配置文件模板中复制出一份,Spark 启动的时候默认会运行 conf/spark-env.sh 和读取 conf/slaves 中的配置。
所以要在
conf/spark-env.sh 中增加一些配置,如下:

export JAVA_HOME=/home/shiwei/soft/jdk1.8.0_151
export SPARK_MASTER_IP=192.168.1.106    # master ip
export SPARK_MASTER_PORT=7077           # master port

conf/slaves 需要包含 slave 的机器 IP,例如下:

192.168.1.110
192.168.1.197

到这里就配置好了,可以将这个 spark 目录复制到所有 slave 上,这样就可以避免重复工作。


4. 启动 Spark 集群

sbin/ 目录下包含了常用的命令脚本。

shiwei@ubuntu1:~/soft/spark-2.2.0-bin-hadoop2.7$ ll sbin/
total 100
drwxr-xr-x  2 shiwei shiwei 4096 Jul  1 07:09 ./
drwxr-xr-x 13 shiwei shiwei 4096 Nov  6 11:32 ../
-rwxr-xr-x  1 shiwei shiwei 2803 Jul  1 07:09 slaves.sh*
-rwxr-xr-x  1 shiwei shiwei 1429 Jul  1 07:09 spark-config.sh*
-rwxr-xr-x  1 shiwei shiwei 5688 Jul  1 07:09 spark-daemon.sh*
-rwxr-xr-x  1 shiwei shiwei 1262 Jul  1 07:09 spark-daemons.sh*
-rwxr-xr-x  1 shiwei shiwei 1190 Jul  1 07:09 start-all.sh* # 启动整个集群
-rwxr-xr-x  1 shiwei shiwei 1274 Jul  1 07:09 start-history-server.sh*
-rwxr-xr-x  1 shiwei shiwei 2050 Jul  1 07:09 start-master.sh*  # 只启动 master
-rwxr-xr-x  1 shiwei shiwei 1877 Jul  1 07:09 start-mesos-dispatcher.sh*
-rwxr-xr-x  1 shiwei shiwei 1423 Jul  1 07:09 start-mesos-shuffle-service.sh*
-rwxr-xr-x  1 shiwei shiwei 1279 Jul  1 07:09 start-shuffle-service.sh*
-rwxr-xr-x  1 shiwei shiwei 3151 Jul  1 07:09 start-slave.sh*
-rwxr-xr-x  1 shiwei shiwei 1527 Jul  1 07:09 start-slaves.sh*
-rwxr-xr-x  1 shiwei shiwei 1857 Jul  1 07:09 start-thriftserver.sh*
-rwxr-xr-x  1 shiwei shiwei 1478 Jul  1 07:09 stop-all.sh*  # 关闭整个集群
-rwxr-xr-x  1 shiwei shiwei 1056 Jul  1 07:09 stop-history-server.sh*
-rwxr-xr-x  1 shiwei shiwei 1080 Jul  1 07:09 stop-master.sh*
-rwxr-xr-x  1 shiwei shiwei 1227 Jul  1 07:09 stop-mesos-dispatcher.sh*
-rwxr-xr-x  1 shiwei shiwei 1084 Jul  1 07:09 stop-mesos-shuffle-service.sh*
-rwxr-xr-x  1 shiwei shiwei 1067 Jul  1 07:09 stop-shuffle-service.sh*
-rwxr-xr-x  1 shiwei shiwei 1557 Jul  1 07:09 stop-slave.sh*
-rwxr-xr-x  1 shiwei shiwei 1064 Jul  1 07:09 stop-slaves.sh*
-rwxr-xr-x  1 shiwei shiwei 1066 Jul  1 07:09 stop-thriftserver.sh*

在 master 上启动整个集群

shiwei@ubuntu1:~/soft/spark-2.2.0-bin-hadoop2.7/sbin$ ./start-all.sh 

starting org.apache.spark.deploy.master.Master, logging to /home/shiwei/soft/spark-2.2.0-bin-hadoop2.7/logs/spark-shiwei-org.apache.spark.deploy.master.Master-1-ubuntu1.out

192.168.1.197: starting org.apache.spark.deploy.worker.Worker, logging to /home/shiwei/soft/spark-2.2.0-bin-hadoop2.7/logs/spark-shiwei-org.apache.spark.deploy.worker.Worker-1-ubuntu3.out

192.168.1.110: starting org.apache.spark.deploy.worker.Worker, logging to /home/shiwei/soft/spark-2.2.0-bin-hadoop2.7/logs/spark-shiwei-org.apache.spark.deploy.worker.Worker-1-ubuntu2.out

如无意外,这样就启动成功了。并且还告诉我们 在 slave 上日志的位置。
spark 提供了一个 web 管理界面(MasterUI),默认端口是 8080。 如下:
QQ 截图 20171106150640.png-126.2kB

URL:Spark 集群中 Master 的 URL
REST URL:可以通过 restful 方法来提交任务
......


5. 启动 spark-shell

shiwei@ubuntu1:~/soft/spark-2.2.0-bin-hadoop2.7$ ./bin/spark-shell --master spark://ubuntu1:7077

只运行 spark-shell ,这样只能启动一个单机版的 spark-shell。并没有连接到集群上,在 MasterUI 上也不可见。必须要指定 master 的 URL,这样才可以保证 spark-shell 连上集群,并且在 MasterUI 中可见。例如:
QQ 截图 20171106152520.png-123kB

通过和上面一个 MasterUI 比较可以看出,spark-shell 启动后,默认占用 slaves 的所有核,所有 slaves 的 1G 内存。
如启动的时候想自定义分配 CPU 和内存,在启动的时候加上两个配置参数即可。

--executor-memory 2g // 指定每个 worker 可用内存为 2G
--total-executor-cores 2 // 指定整个集群使用的 cup 核数为 2 个

6. WordCount

统计文本中单词出现个数的一个小例子。
首先进入 spark-shell 下

scala> val file = sc.textFile("file:///home/shiwei/soft/spark-2.2.0-bin-hadoop2.7/logs/logfile.log")
scala> file.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect.foreach(println)
(8080,1)
(org.apache.spark.deploy.master.Master,1)
(org/apache/spark/log4j-defaults.properties,1)
(authentication,1)
(6066.,1)
(Registered,5)
(is,1)
(--webui-port,1)
(modify,4)
(app-20171106151757-0001,1)
(Got,2)
......

文件来源:本地或者 HDFS,分别对应 textFile("file://") 、textFile(")


7. 踩的坑

第一个坑是在 启动 Spark 集群 访问 MasterUI 这个地方。在 ubuntu1 中启动 spark 集群,未发现保存,然后访问 MasterUI,能访问,但是显示 Workers 为 0。然后查看 slave 上的启动日志发现报错,显示连接不上 master 。防火墙关闭了也不行,然后在 /etc/hosts 进行主机名与 IP 地址的映射配置。最后搞定!!!

第二个坑是在 spark-shell 中 textFile("file")的时候,提示找不到文件,但是文件是确实存在而且路径没有问题的。上网查了下,不仅在 Master 上这个路径要存在这个文件,在所有 slave 上同样的目录都要用这个文件。拷贝,解决!!!

  • Simon
    20 引用 • 10 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...