springboot mybatis和spark-sql对接
本次将在已经部署了spark、hive和SequoiaDB的环境中,通过实验来实现springboot、mybatis框架与spark-sql的整合,通过hive-sql实现spark的鉴权和权限控制,并能够通过springboot、mybatis访问spark查询SequoiaDB中的数据,具体部署环境为下:
jdk1.8 spark2.1.1 hadoop2.9.2 hive1.2.2
本次实验SequoiaDB巨杉数据库集群拓仆结构为三分区单副本,其中包括:
- 1 个 SequoiaSQL-MySQL 数据库实例节点
- 1 个引擎协调节点
- 1 个编目节点
- 3 个数据节点
本次实验分为下列步骤:
- 使用MySQL配置hive元数据库
- hive配置部分,需正确配置hive-site.xml配置文件中连接mysql的jdbc配置以及开启鉴权功能
- 元数据库的初始化
- 配置spark连接metastore以及开启鉴权功能
- 添加测试数据
- 配置IDEA项目
- 调用方法进行测试
使用MySQL配置hive元数据库
使用sdbadmin用户进入mysql-shell:
su sdbadmin
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
创建metauser用户,用于后续hive以及spark连接元数据库:
CREATE USER 'metauser'@'%' IDENTIFIED BY 'metauser';
给metauser用户授权:
GRANT ALL ON *.* TO 'metauser'@'%';
创建元数据库metastore:
CREATE DATABASE metastore CHARACTER SET 'latin1' COLLATE 'latin1_bin';
刷新权限:
FLUSH PRIVILEGES;
退出mysql-shell:
quit;
hive配置部分
复制以下代码到实验环境终端执行,用于添加hive元数据信息的数据库配置文件hive-site.xml到${HIVE_HOME}/conf目录下,并正确配置:
cat > /opt/apache-hive-1.2.2-bin/conf/hive-site.xml<< EOF
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>metauser</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>metauser</value>
</property>
<property>
<name>hive.test.authz.sstd.hs2.mode</name>
<value>true</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>9073</value>
</property>
<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
<property>
<name>hive.server2.custom.authentication.class</name>
<value>com.sequoiadb.spark.sql.hive.SequoiadbAuth</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
</configuration>
EOF
拷贝依赖jar到${HIVE_HOME}/auxlib(第三方jar包目录)目录下,如果auxlib目录不存在,则自行创建:
cp spark-authorizer-2.1.1.jar /opt/apache-hive-1.2.2-bin/auxlib
cp mysql-connector-java-5.1.7-bin.jar /opt/apache-hive-1.2.2-bin/auxlib
元数据库metastore初始化配置
修改${HIVE_HOME}/conf/hive-env.sh,添加以下代码(本次实验hadoop安装在/opt下,可根据用户情况自行修改),本次实验hive-env位置为:/opt/apache-hive-1.2.2-bin/conf/hive-env.sh
export HADOOP_HOME=/opt/hadoop-2.9.2
使用hive1.2.2软件上提供的schematool工具初始化metastore,${HIVE_HOME}/bin/schematool -dbType mysql -initSchema
apache-hive-1.2.2-bin/bin/schematool -dbType mysql -initSchema
使用sdbadmin用户进入mysql-shell,在metastore database中,创建一个USER表,表名称为DBUSER:
su sdbadmin
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
use metastore;
create table DBUSER (dbuser varchar(100), passwd char(50), primary key (dbuser));
insert into DBUSER(dbuser, passwd) values ('root', md5('admin'));
为 thrift server 预先创建了一个 root 的用户,密码为 ‘admin’ 未来如果要增加用户,用类似的 insert 命令添加
对metastore库下的DBS表创建触发器(目的是为了让用户可以跨库create table as,当用户在sparksql create database时,触发器自动对DBS表的OWNER_NAME,OWNER_TYPE两个字段进行更新):
delimiter ||
create trigger dbs_trigger
before insert on DBS
for each row
begin
set new.OWNER_NAME="public";
set new.OWNER_TYPE="ROLE";
end ||
delimiter ;
spark配置:
spark sql 增加鉴权和权限管理,需添加依赖jar包到${SPARK_HOME}/jars(本次实验spark安装目录为/opt/spark/)
cp spark-authorizer-2.1.1.jar /opt/spark/jars
cp mysql-connector-java-5.1.7-bin.jar /opt/spark/jars
复制以下代码到实验环境终端执行,用于添加hive元数据信息的数据库配置文件hive-site.xml到${SPARK_HOME}/conf目录下,并正确配置:
cat > /opt/spark/conf/hive-site.xml<< EOF
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>metauser</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>metauser</value>
</property>
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>INSERT,SELECT</value>
</property>
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
<name>hive.test.authz.sstd.hs2.mode</name>
<value>true</value>
</property>
<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
<property>
<name>hive.server2.custom.authentication.class</name>
<value>com.sequoiadb.spark.sql.hive.SequoiadbAuth</value>
</property>
</configuration>
EOF
在 ${SPARK_HOME}/conf/spark-defaults.conf 配置文件中,增加以下内容
spark.sql.extensions=org.apache.ranger.authorization.spark.authorizer.SequoiadbSparkSQLExtension
启动spark:
./opt/spark/sbin/start-all.sh
启动thriftserver服务:
./opt/spark/sbin/start-thriftserver.sh
查看端口监听状态:
netstat -anp|grep 10000
使用spark自带的beeline客户端工具连接到thriftserver服务(默认端口10000):
./bin/beeline -u jdbc:hive2://localhost:10000 -n root -p admin
在 spark sql 中创建数据表,执行建表的USER 对该表拥有 INSERT 和 SELECT 权限 如果其他 USER希望访问该表,应该在 hive 的thrift server 中,执行 grant 命令,以赋予其他 USER 对应权限
操作方式:
启动hive的thrift服务
${HIVE_HOME}/bin/hiveserver2 >${HIVE_HOME}/hive_thriftserver.log 2>&1 &
通过hive自己的beeline连接到hive-site.xml配置的(hive.server2.thrift.port)接口中,使用root登录以及密码为admin(在上述中mysql对DBUSER表插入的用户)
进入到${HIVE_HOME},输入下面代码:
./bin/beeline -u jdbc:hive2://localhost:9073 -n root -p admin
权限控制:
set role admin;
grant SELECT on table test to user USERNAME;
grant INSERT on table test to user USERNAME;
添加测试数据
在SequoiaDB中创建域和集合空间:
var db=new Sdb("localhost",11810);
db.createDomain("scottdomain",["datagroup1","datagroup2","datagroup3"],{
AutoSplit:true});
db.createCS("scott",{
Domain:"scottdomain"});
在MySQL中创建测试表以及数据:
使用sdbadmin用户登录到mysql-shell中:
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
创建数据库:
create database scott;
use scott;
创建表emp(另外三张表同理):
create table emp(
empno int unsigned auto_increment primary key COMMENT '雇员编号',
ename varchar(15) COMMENT '雇员姓名',
job varchar(10) COMMENT '雇员职位',
mgr int unsigned COMMENT '雇员对应的领导的编号',
hiredate date COMMENT '雇员的雇佣日期',
sal decimal(7,2) COMMENT '雇员的基本工资',
comm decimal(7,2)