环境
Ubuntu STL 16.0.4
Hadoop 2.7.4
Hive 2.1.1
sentry 1.7.0
maven 3.5.0
//注:伪分布式环境
安装maven
1.apache maven官网下载maven,用于编译sentry源码。
2.修改~/.bashrc文件,添加maven路径。
export MAVEN_HOME=/etc/usr/local/maven
export PATH=$PATH:MAVEN_HOME/bin
3.使.bashrc生效source ~/.bashrc
。
4.执行mvn -v
可查看maven是否安装成功。
编译sentry源码
- 在apache sentry官网下载sentry源码(很有意思,官网上没有直接运行的binary文件,只有源码,所以需要maven编译)。
- 在README.md文件里可知,在apache-sentry-1.7.0-src文件夹里执行
mvn install -DskiTests
即可进行编译。 - 当终端出现下图情况时即编译成功:
- 编译结果在apache-sentry-1.7.0-src/sentry-dist/target/apache-stnery-1.7.0下。
编译结果上传至百度网盘,密码: e5hp。
配置sentry环境
将mysql-connector的jar包拷入sentry/lib下
sudo mv mysql-connector-java-5.0.8-bin.jar /usr/local/sentry/lib
修改sentry-site.xml文件
注意:在sentry/conf下有sentry-site.xml.service.template和sentry-site.xml.hive-client.template两种类型的文件,其中service文件是用于在sentry/conf下配置sentry环境的,hive-client文件是需要拷贝到hive/conf下配置hive和sentry关联的。
参考sentry-site.xml.service.template修改sentry-site.xml,
sudo cp sentry-site.xml.service.template sentry-site.xml
;
<!-- 修改内容 -->
<property>
<name>sentry.store.jdbc.url</name>
<value>jdbc:mysql://localhost:3306/sentry</value>
</property>
<property>
<name>sentry.store.jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>sentry.store.jdbc.user</name>
<value>sentry</value>
</property>
<property>
<name>sentry.store.jdbc.password</name>
<value>sentry</value>
</property>
<!-- 关闭security.mode -->
<property>
<name>sentry.service.security.mode</name>
<value>kerberos</value>
</property>
<property>
<name>sentry.service.server.principal</name>
<value></value>
</property>
<property>
<name>sentry.service.server.keytab</name>
<value></value>
</property>
<!-- 添加内容 -->
<property>
<name>sentry.service.server.rpc-address</name>
<value>localhost</value>
</property>
<property>
<name>sentry.service.server.rpc-port</name>
<value>8038</value>
</property>
注释:
sentry默认数据库不是mysql,所以默认驱动也不是mysql 的,所以前四个是将数据库相关信息修改为mysql的。
因为对sentry还不是很了解,所以先把其他多余的服务关闭,配置好环境再说。T_T
后面添加内容用于监听localhost:8038端口,原本sentry-site.xml.service.template里面没有,是自己添加的。经测试不添加也可以,应该是默认端口号就是8038。
为sentry配置数据库和路径
1.配置数据库
CREATE DATABASE sentry;
CREATE USER sentry IDENTIFIED BY 'sentry';
GRANT all ON sentry.* TO sentry@'%' IDENTIFIED BY 'sentry';
flush privileges;
2.配置sentry路径
export SENTRY_HOME=/usr/local/sentry
export PATH=$PATH:$SENTRY_HOME/bin
执行 sentry -v
,如果出现如下所示即配置成功:
运行sentry服务
如果是第一次运行sentry服务需要提前初始化元数据库,命令如下:
sentry --command schema-tool --conffile /usr/local/sentry/conf/sentry-site.xml --dbType mysql --initSchema
- 1
运行sentry命令:
sentry --command service --conffile /usr/local/sentry/conf/sentry-site.xml
如果报错:
could not create SeverSocket on address localhost/127.0.0.1:8038
则可能metastore已经启动,如果想要重新启动sentry需要先关闭之。
执行命令jps
,kill -9 pid即可。
出现如下界面说明已经运行起来了:
serving on localhost/127.0.0.1:8038
hive集成sentry
1.将sentry-site.xml.hive-client.template拷贝到hive/conf下:
sudo mv /usr/local/sentry/conf/sentry-site.xml.hive-client.template /usr/local/hive/conf/sentry-site.xml
2.修改hive-site.xml
<!-- Hive Metastore集成Sentry -->
<property>
<name>hive.metastore.pre.event.listeners</name>
<value>org.apache.sentry.binding.metastore.MetastoreAuthzBinding</value>
</property>
<property>
<name>hive.metastore.event.listeners</name>
<value>org.apache.sentry.binding.metastore.SentryMetastorePostEventListener</value>
</property>
<!-- Hive-server2集成Sentry -->
<property>
<name>hive.server2.enable.impersonation</name>
<value>true</value>
</property>
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.sentry.binding.hive.SentryHiveAuthorizationTaskFactoryImpl</value>
</property>
<property>
<name>hive.server2.session.hook</name>
<value>org.apache.sentry.binding.hive.HiveAuthzBindingSessionHook</value>
</property>
<property>
<name>hive.sentry.conf.url</name>
<value>file:///usr/local/hive/conf/sentry-site.xml</value>
</property>
3.修改sentry-site.xml
注意!这里改的是hive/conf/sentry-site.xml而不是sentry/conf下的!!!!
<property>
<name>sentry.service.client.server.rpc-port</name>
<value>8038</value>
</property>
<property>
<name>sentry.service.client.server.rpc-address</name>
<value>localhost</value>
</property>
<property>
<name>sentry.service.client.server.rpc-connection-timeout</name>
<value>200000</value>
</property>
<!--以下是客户端配置-->
<property>
<name>sentry.provider</name>
<value>org.apache.sentry.provider.file.HadoopGroupResourceAuthorizationProvider</value>
</property>
<property>
<name>sentry.hive.provider.backend</name>
<value>org.apache.sentry.provider.db.SimpleDBProviderBackend</value>
</property>
<property>
<name>sentry.metastore.service.users</name>
<value>hive</value><!--queries made by hive user (beeline) skip meta store check-->
</property>
<property>
<name>sentry.hive.server</name>
<value>localhost</value>
</property>
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
注释:
Sentry 的使用有两种方式,一是基于文件的存储方式(SimpleFileProviderBackend),一是基于数据库的存储方式(SimpleDbProviderBackend),如果使用基于文件的存储则只需要安装sentry,否则还需要安装 sentry-store。
3.hive添加对sentry的依赖
创建软链接:
sudo cp /usr/lcoal/sentry/lib/sentry-binding-hive-1.7.0.jar /usr/lcoal/sentry/lib/sentry-binding-hive.jar
sudo ln -s /usr/lcoal/sentry/lib/sentry-binding-hive.jar /usr/lcoal/hive/lib/sentry-binding-hive.jar
- 1
- 2
4.重新初始化元数据库
重新配置hive-site.xml之后立马运行hive,执行操作时汇报如下错误:
这时需要重新初始化元数据库。
需要先把愿元数据库中的hive_metadata删掉,然后在执行初始化操作。
mysql -u hive -p hive
show databases;
drop database hive_metadata;
quit;
schematool -dbType mysql -initSchema
初始化成功
注意:
在hive更改完sentry相关配置之后进入hive页面执行查询数据库命令(show databases;
)时,会出现错误。
这时把sentry/lib下sentry*.jar和solr*.jar拷贝到hive/lib/下,然后就能在hive下执行查询操作了
hive集成sentry测试
Sentry权限控制通过Beeline(Hiveserver2 SQL 命令行接口)输入Grant 和 Revoke语句来配置。语法跟现在的一些主流的关系数据库很相似。
需要注意的是:当sentry服务启用后,我们必须使用beeline接口来执行hive查询,Hive Cli并不支持sentry。
参考内容
安装和配置Sentry
Apache Sentry安装及简单使用
测试Hive集成Sentry
Impala和Hive集成Sentry
beeline 常用语法:
1. beeline -u “jdbc:hive2://nn02:10000/default” -n maxiaoli -e “select * from mxl_hive;”
-u : 连接信息
-n:登陆用户
-e:执行hql
2. beeline -u “jdbc:hive2://nn02:10000/default” -n maxiaoli -i query.hql
3. 输入beeline 进入,输入!connect 连接串
在输入用户名和密码 即可登陆
除了进入beeline进行操作,在脚本中以前的hive -e/-f 就不能使用,现在就我遇到的问题进行总结,以及和hive进行对比。假如hive 有这样的一张表 test
name | age |
---|---|
mxl | 20 |
zhangsan | 21 |
- hive -e “select * from ”> test.txt
mxl 20
zhangsan 21
- 1
- 2
beeline
beeline -u "jdbc:hive2://localhost:10000/default" -n admin--silent=true --showHeader=false --outputformat=csv -f new.sh > mxl.log
- 1
不显示查询头,以静默的方式导出csv文件,当然 -f 后面是hql 查询文件,也可以-e “query” 。
beeline -f 和 -e 默认的查询结果都带有表信息,mr过程等内容。