Spark SQL is a Spark module for structured data processing.
Spark集群的搭建以及整合zookeeper
官网Overview
One use of Spark SQL is to execute SQL queries. Spark SQL can also be used to read data from an existing Hive installation. For more on how to configure this feature, please refer to the Hive Tables section. When running SQL from within another programming language the results will be returned as a Dataset/DataFrame. You can also interact with the SQL interface using the command-line or over JDBC/ODBC.
Spark SQL处理结构化的数据, 与hive很好的兼容, 也支持和JDBC和ODBC.
spark集群的搭建:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29配置/spark-2.2.1-bin-hadoop2.7/conf下的spark-env.sh
export JAVA_HOME=/usr/java/default
export SPARK_MASTER_HOST=hp001
# 指定rpc, master和worker的通信的端口号, 不指定也行, 默认就是7077
# export SPARK_MASTER_PORT=7077
配置slaves文件, 指定哪些节点作为spark中master的子节点.
# A Spark Worker will be started on each of the machines listed below.
# 指定master工作的子节点, 即worker
hp002
hp003
然后将配置过的spark分别scp到worker节点的机器上.
最后在master机器上启动spark, 在sbin目录下, start-all.sh
会在master机器上启动master进程
在其他几台worker机器上启动workder进程.
利用jps查看进程启动情况.
通过访问master机器的ip地址配上spark管理界面服务的端口8080访问 web ui查看spark master和worker节点的一些情况.
备注: 如果web ui访问不了, 1. jps查看下进程是否启动, 2. 查看下防火墙是否关闭等等.
到这里, spark的集群就配置好了..
但是存在一个问题: 那就是Master节点存在单点故障, 这时候就需要zookeeper来协调处理, 并且启动至少两个Master节点来实现高可靠.
介绍下 zookeeper: 分布式协调技术1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16zookeeper的下载链接了:
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
tar -zxvf解压, 配置即可.
主要用来解决分布式环境当中多个进程之间的同步控制,
让他们有序的去访问某种临界资源, 防止造成"脏数据"的后果.
其实说白了: 就是一个协调器.
一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,
它提供了一项基本服务:分布式锁服务
ZooKeeper性能上的特点决定了它能够用在大型的、分布式的系统当中。
从可靠性方面来说,它并不会因为一个节点的错误而崩溃。
除此之外,它严格的序列访问控制意味着复杂的控制原语可以应用在客户端上。
ZooKeeper在一致性、可用性、容错性的保证,也是ZooKeeper的成功之处
配置zookeeper集群1
2
3
4
5
6
7
8
9
10
11上面搭建的spark集群只有一个master节点和多个worker节点.
万一master节点出现故障, 那么worker节点也就不可以进行工作了.
以防master节点出现单点故障, 故要配置zk在master节点的机器上.
1. 在zookeeper-3.4.11目录下创建data和logs文件夹. 在data中vim myid写上0.
2. 到zookeeper-3.4.11/conf目录下, 将zoo_sample.cfg改成zoo.cfg
3. vim zoo.cfg修改:
dataDir=/root/software/zookeeper-3.4.11/data
添加master节点(主机名)
server.0=hp001:2888:3888
server.1=hp004:2888:3888
4. 同样的, 修改其他master的主机, 将myid修改成与之前master机器不一样即可.
spark整合zk1
2
3
4
5
6
7
8
9
10
11
12
13
14spark集群规划: node-1, node-2为master, node-3,node-4,node-5为worker,
安装配置zk集群, 最后启动.
1. 停止spark所有服务, 修改配置文件spark-env.sh 在该配置文件中删除
SPARK_MASTER_IP
2. 添加配置
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zk1,zk2,zk3 -Dspark.deploy.zookeeper.dir=/spark"
这里的zk1, zk2, zk3 就是有配置好的zookeeper的主机.
可以是master主机, 也可以是slave主机, 也可以是其他的, 只要配置好zookeeper即可. 并且识别主机名(/etc/hosts配置)
3. 在node-1上修改slaves配置文件指定worker节点
4. 启动zookeeper: bin/zkServer.sh start 查看状态status
5. 在node-1上执行start-all.sh 在node-2上执行start-master.sh启动第二个master节点.
集群中zk协调master节点例子 详细解释:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82有四台机器: hp001, hp004, hp002, hp003
1. hp001和hp004作为master, hp002, hp003作为worker
配置zookeeper, hp001设置data/myid中值为0,
myid文件中的编号是根据下面配置的server.id配置的.
配置zoo.cfg: dataDir=/root/software/zookeeper-3.4.11/data
server.0=hp001:2888:3888
server.1=hp004:2888:3888
同样的设置hp004, 区别设置myid为1
2. 配置spark: 指定jdk和master主机(用逗号分割)
在spark-env.sh中配置
export JAVA_HOME=/usr/java/default
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hp001,hp004 -Dspark.deploy.zookeeper.
dir=/spark"
在slaves中配置, 指定worker节点主机
# 指定master工作的子节点, 即worker
hp002
hp003
同样的, 在hp001, hp004, hp002, hp003做同样的设置. 直接scp传过去即可.
3. 然后在hp001上启动zookeeper. bin/zkServer.sh start
再在hp004上同样的方式启动 zookeeper
查看状态: status
Mode: leader
另一个是:
Mode: follower
4. 在hp001上启动spark, 在sbin下 ./start-all.sh,
会启动hp001作为master, hp002, hp003作为worker
利用jps可以查看
[root@hp001 bin]# jps
19380 Master
20581 Jps
19246 QuorumPeerMain
[root@hp002 sbin]# jps
19017 Jps
17914 Worker
[root@hp003 ~]# jps
8842 Worker
10076 Jps
然后在hp004上也启动spark, ./start-master.sh
利用jps查看是否有master进程.
5. 利用web ui查看各master以及worker的信息
浏览器输入 hp001的ip地址加上8080端口访问
可以看到Status: ALIVE, 以及下面活着的workers的信息.
workers有hp002, hp003
然后在hp004的ip地址加上8080端口访问
也可以看到 Status: STANDBY, 区别就是下面没有worker节点. 处理待命状态
因为zk将会在hp001这个master发生故障时, 启用hp004这个master, 这个时候就会显示出workers节点, hp002, hp003.
6. 模拟hp001发生故障,
关闭掉hp001下的master进程.
在spark的sbin下./start-master.sh stop
利用jps查看 master进程是否关闭掉.
然后在访问 web ui, hp001的8080端口关闭了, 不可访问了.
这个时候再访问hp004的web ui 就会发现Status: ALIVE 状态从STANDBY变成了ALIVE了.
还有hp004下面显示的workers信息也从没有到添加了两个hp002, hp003
web ui显示的:
2.2.1 Spark Master at spark://hp004:7077
URL: spark://hp004:7077
REST URL: spark://hp004:6066 (cluster mode)
Alive Workers: 2
Cores in use: 2 Total, 0 Used
Memory in use: 2.0 GB Total, 0.0 B Used
Applications: 0 Running, 0 Completed
Drivers: 0 Running, 0 Completed
Status: ALIVE
Workers
Worker Id Address State Cores Memory
worker-20180128044322-192.168.0.105-38506 192.168.0.105:38506 ALIVE 1 (0 Used) 1024.0 MB (0.0 B Used)
worker-20180128044416-192.168.0.104-45048 192.168.0.104:45048 ALIVE 1 (0 Used) 1024.0 MB (0.0 B Used)