一文秒懂Hive的两个组件Hiveserver2和Metastore server访问元数据的关系?及Cli命令行和beeline的关系

Hive不是数据库,不是数据库,不是数据库!

一、Hive架构原理

1用户接口:Client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

2元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

4驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

二、元数据用什么数据库存储?

1、默认是Derby数据库

Derby是一个完全用java编写的数据库,非常小巧,核心部分derby.jar只有2M,所以既可以做为单独的数据库服务器使用,也可以内嵌在应用程序中使用。其优缺点具体如下:

       1、Derby定位是小型数据库, 特别是嵌入式. 支持的数据库小于50GB, 对于小型网站, 事务不复杂的应用, 使用它的还是很不错的. 另外大型桌面应用也可以用它来保存配置和其他数据, 可以做到与文件格式无关, 因为都是访问数据库.

       2、功能: Derby支持标准SQL92, SQL1999, SQL2003, 支持临时表, 索引, 触发器, 视图, 存储过程, 外键, 约束, 并行, 事务, 加密与安全等. 只要有JDK(>=1.3), 就可以运行Derby.

       3、安全性:Derby的安全性也做得很到位, 包括用户鉴权和加密解密.

       4、性能:Derby的性能也是不错的.在插入100万条记录时, CPU的占用率一直低于40%, 平均每插一条记录耗时小于0.3毫秒. 这对于满足桌面应用程序是绰绰有余的. 但是比Oracle、MySql等专业数据库性能要低。

2、一般改用Mysql或者Oracle数据库(如何配置)

1)拷贝驱动

将MySQL的JDBC驱动拷贝到Hive的lib目录下

[user001@hadoop102 software]$ cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib

2) 配置Metastore到MySql

在$HIVE_HOME/conf目录下新建hive-site.xml文件

[atguigu@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml

添加如下内容

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

    <!-- jdbc连接的URL -->

    <property>

        <name>javax.jdo.option.ConnectionURL</name>

        <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>

</property>

 

    <!-- jdbc连接的Driver-->

    <property>

        <name>javax.jdo.option.ConnectionDriverName</name>

        <value>com.mysql.jdbc.Driver</value>

</property>

 

<!-- jdbc连接的username-->

    <property>

        <name>javax.jdo.option.ConnectionUserName</name>

        <value>root</value>

    </property>

 

    <!-- jdbc连接的password -->

    <property>

        <name>javax.jdo.option.ConnectionPassword</name>

        <value>123456</value>

    </property>

    <!-- Hive默认在HDFS的工作目录 -->

    <property>

        <name>hive.metastore.warehouse.dir</name>

        <value>/user/hive/warehouse</value>

    </property>

    

    <!-- 指定hiveserver2连接的端口号 -->

    <property>

        <name>hive.server2.thrift.port</name>

        <value>10000</value>

    </property>

   <!-- 指定hiveserver2连接的host -->

    <property>

        <name>hive.server2.thrift.bind.host</name>

        <value>hadoop102</value>

</property>

 

    <!-- 指定存储元数据要连接的地址 -->

    <property>

        <name>hive.metastore.uris</name>

        <value>thrift://hadoop102:9083</value>

    </property>

    <!-- 元数据存储授权  -->

    <property>

        <name>hive.metastore.event.db.notification.api.auth</name>

        <value>false</value>

</property>

<!-- Hive元数据存储版本的验证 -->

    <property>

        <name>hive.metastore.schema.verification</name>

        <value>false</value>

</property>

 

<!-- hiveserver2的高可用参数,开启此参数可以提高hiveserver2的启动速度 -->

<property>

    <name>hive.server2.active.passive.ha.enable</name>

    <value>true</value>

</property>

</configuration>

 

三、Hiveserver2和Metastore server的关系

hiveServer2和metaStore其实都是hive本身带的组件,那么两者究竟有什么不同呢?

  • metaStore:hive的metaStore提供的是一个服务,而这个服务就是将hive的元数据暴露出去,而不是需要通过对hive元数据库mysql的访问才能拿到hive的元数据信息;metastore服务实际上就是一种thrift服务,通过它我们可以获取到hive原数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节
  • hiveServer2: HiveServer2(HS2)是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果。目前基于Thrift RPC的实现是HiveServer的改进版本,并支持多客户端并发和身份验证, 启动hiveServer2服务后,就可以使用jdbc,odbc,或者thrift的方式连接

小结:

1.HiveServer2和MetaStore本质上都是Thrift Service,虽然可以启动在同一个进程内,但不建议这么做。建议是拆成不同的服务进程来启动。
 2.一般来讲,我们认为HiveServer2是用来提交查询的,也就是用来访问数据的。而MetaStore才是用来访问元数据的。
如果你把两者混了,起在同一个进程内,就会产生你的问题类的疑问。
 3.CliDriver是SQL本地直接编译,然后访问MetaStore,提交作业,是重客户端。
   BeeLine是把SQL提交给HiveServer2,由HiveServer2编译,然后访问MetaStore,提交作业,是轻客户端。
 4.具体写业务脚本两种都行,数据量大的话,建议用CliDriver

四、cli和beeline区别

1.cli是通过metaServer访问元数据的
2.beeline是通过hiverserver2访问元数据的

bin/hivecli命令行的方式访问元数据  --访问--> metaStore server --访问-->MySQL

  bin/beelinejdbc的方式访问元数据 --访问-->hiveServer2 --访问--> metaStore server --访问--> MySQL

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值