Spark有多种运行模式,可以运行在一台机器上,称为本地(单机)模式;也可以以YARN或Mesos作为底层资源调度系统以分布式的方式在集群中运行,称为Spark On YARN模式;还可以使用Spark自带的资源调度系统,称为Spark Standalone模式。
本地模式通过多线程模拟分布式计算,通常用于对应用程序的简单测试。本地模式在提交应用程序后,将会在本地生成一个名为“SparkSubmit”的进程,该进程既负责程序的提交又负责任务的分配、执行和监控等。
Spark On YARN模式,遵循YARN的官方规范,YARN只负责资源的管理和调度,运行哪种应用程序由用户自己实现,因此可能在YARN上同时运行MapReduce程序和Spark程序,YARN很好的对每一个程序实现了资源的隔离。这使得Spark与MapReduce可以运行于同一个集群中,共享集群存储资源与计算资源。Spark On YARN模式与Standalone模式一样,也分为client和cluster两种提交方式。
client提交方式架构:
cluster提交方式架构:
Spark Standalone 集群搭建
Spark Standalone模式的搭建需要在集群的每个节点都安装Spark,集群角色分配如表:
1、下载解压安装包
访问Spark官网http://spark.apache.org/downloads.html下载预编译的Spark安装包,选择Spark版本为2.4.0,包类型为“Pre-built for Apache Hadoop 2.7 and later”(Hadoop2.7及之后版本的预编译版本)。
$ tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz -C /opt/modules/
2、修改配置文件
修改slaves文件:
$ cp slaves.template slaves
$ vi slaves
改为以下内容:
centos02
Centos03
修改spark-env.sh文件:
$ cp spark-env.sh.template spark-env.sh
$ vi spark-env.sh
$ bin/spark-shell --master spark://centos01:7077
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://hadoop100:4040
Spark context available as 'sc' (master = spark://centos01:7077, app id = app-20210727162737-0001).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.0:
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_281)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
$ bin/spark-shell --master yarn
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://centos01:4040
Spark context available as 'sc' (master = yarn, app id = application_1627371733487_0005).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.8
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_281)
Type in expressions to have them evaluated.
Type :help for more information.
# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
export SPARK_LOCAL_IP=centos02
spark master web ui 默认端口 8080 被占用
spark master web ui 默认端口为8080,当系统有其它程序(hadoop3.x版本的集群中的有的节点会启动jetty,用的就是8080端口)也在使用该接口时,启动master时就会报错,为了避免端口冲突,我们也可以自行设置端口号,修改方法:
Spark Master at spark://centos02:7078
URL: spark://centos02:7078
Alive Workers: 2
Cores in use: 2 Total, 0 Used
Memory in use: 4.5 GB Total, 0.0 B Used
Applications: 0 Running, 0 Completed
Drivers: 0 Running, 0 Completed
Status: ALIVE
Spark 三种提交模式测试
下面的测试环境使用三台虚拟机,系统是CentOS7_x64、主机名分别使hadoop100、hadoop101、Hadoop102,安装了Java JDK8和hadoop3.1.4,Spark 2.4.8 (使用scala2.11编译的) built for Hadoop 2.7.3(用的hadoop的32位的库,因此有些兼容问题),其中Spark的活动master在hadoop100,备用master在hadoop101,worker节点是hadoop101和hadoop102。YARN的ResourceManager节点在hadoop101。
虚拟机环境介绍完了,下面编写一些脚本,使用官方提供的估算Pi值的程序,分别测试Local(本地)、Standalone(提交给Spark集群)以及Spark on YARN(提交给YARN集群)这三种提交模式,除了Local提交模式之外,根据Driver的的部署方式还分为Client模式部署以及Cluster模式部署两种部署方法。
create external table if not exists kylin_hive.dept(
deptno int,
dname string,
loc int )
row format delimited fields terminated by '\t';
(2)创建员工表
create external table if not exists kylin_hive.emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
(3)查看创建的表
jdbc:hive2://node03:10000> show tables;
OK
tab_name
dept
emp
(4)向外部表中导入数据导入数据
load data local inpath '/kkb/install/dept.txt' into table kylin_hive.dept;
load data local inpath '/kkb/install/emp.txt' into table kylin_hive.emp;
查询结果
jdbc:hive2://node03:10000> select * from emp;
jdbc:hive2://node03:10000> select * from dept;
我们知道,一个N维的Cube,是由1个N维子立方体、N个(N-1)维子立方体、N*(N-1)/2个(N-2)维子立方体、......、N个1维子立方体和1个0维子立方体构成,总共有2^N个子立方体组成,在逐层算法中,按维度数逐层减少来计算,每个层级的计算(除了第一层,它是从原始数据聚合而来),是基于它上一层级的结果来计算的。比如,[Group by A, B]的结果,可以基于[Group by A, B, C]的结果,通过去掉C后聚合得来的;这样可以减少重复计算;当 0维度Cuboid计算出来的时候,整个Cube的计算也就完成了。
cd /kkb/install/hive-1.1.0-cdh5.14.2/conf
vim hive-site.xml
<property>
<name>hive.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
第三步:修改hive-env.sh配置文件添加以下配置
cd /kkb/install/hive-1.1.0-cdh5.14.2/conf
vim hive-env.sh
export HADOOP_HOME=/kkb/install/hadoop-2.6.0-cdh5.14.2
export HBASE_HOME=/kkb/install/hbase-1.2.0-cdh5.14.2/
export HIVE_CONF_DIR=/kkb/install/hive-1.1.0-cdh5.14.2/conf
第四步:创建hive表,映射hbase当中的数据
进入hive客户端,创建hive映射表,映射hbase当中的两张表数据
create database hive_hbase;
use hive_hbase;
CREATE external TABLE hive_hbase.data_goods(goodsId int ,goodsName string ,sellingPrice string ,productPic string ,productBrand string ,productfbl string ,productNum string ,productUrl string ,productFrom string ,goodsStock int , appraiseNum int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,f1:goodsName ,f1:sellingPrice ,f1:productPic ,f1:productBrand ,f1:productfbl ,f1:productNum ,f1:productUrl ,f1:productFrom ,f1:goodsStock , f1:appraiseNum")
TBLPROPERTIES("hbase.table.name" ="flink:data_goods");
CREATE external TABLE hive_hbase.data_orders(orderId int,orderNo string ,userId int,goodId int ,goodsMoney decimal(11,2) ,realTotalMoney decimal(11,2) ,payFrom int ,province string ,createTime timestamp )
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key, f1:orderNo , f1:userId , f1:goodId , f1:goodsMoney ,f1:realTotalMoney,f1:payFrom ,f1:province,f1:createTime")
TBLPROPERTIES("hbase.table.name" ="flink:data_orders");
File "/usr/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute
return Database.Cursor.execute(self, query, params)
OperationalError: attempt to write a readonly database
cd /kkb/install/hue-3.9.0-cdh5.14.2/desktop/conf
vim hue.ini
[[[mysql]]]
nice_name="My SQL DB"
engine=mysql
host=node03.kaikeba.com
port=3306
user=root
password=123456
options={"init_command":"set names utf8;SET CHARACTER SET utf8;SET character_set_connection=utf8;"}
更改完了配置,重新启动hue的服务
cd /kkb/install/hue-3.9.0-cdh5.14.2/
build/env/bin/supervisor
3.5、配置hue与hbase的集成
第一步:修改hue.ini
如果hue已经启动,需要先停止hue的服务,然后继续修改hue的配置文件hue.ini
cd /kkb/install/hue-3.9.0-cdh5.14.2/desktop/conf
vim hue.ini
[hbase]
hbase_clusters=(Cluster|node01:9090)
hbase_conf_dir=/kkb/install/hbase-1.2.0-cdh5.14.2/conf
第二步:启动hbase的thrift server服务
第一台机器执行以下命令启动hbase的thriftserver
cd /kkb/install/hbase-1.2.0-cdh5.14.2
bin/start-hbase.sh
bin/hbase-daemon.sh start thrift