多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # hive架构图 ![](https://box.kancloud.cn/79a9999a934979efb10989111c30a3a8_364x473.png) ## 基本组成 * 用户接口:包括 CLI、JDBC/ODBC、WebGUI。 * 元数据存储:通常是存储在关系数据库如 mysql , derby中。 * 解释器、编译器、优化器、执行器。 ## 各组件的基本功能 * 用户接口主要由三个:CLI、JDBC/ODBC和WebGUI。其中,CLI为shell命令行;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。 * 元数据存储:Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 * 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。 ## Hive与Hadoop的关系 Hive利用HDFS存储数据,利用MapReduce查询分析数据 ![](https://box.kancloud.cn/2c4b73f04643d1bcbccced7a117c1797_669x271.png) ## Hive与传统数据库对比 hive用于海量数据的离线数据分析 ![](https://box.kancloud.cn/fefcc393e5acbd03628d7b8990ff3cd1_515x350.png) 总结:hive具有关系型数据库的查询分析功能,但应用场景完全不同,hive只适合用来做批量数据统计分析,数据量大、对应的延迟较高! ## Hive的数据存储 1. Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等) SequenceFile是hadoop中的一种文件格式: 文件内容是以序列化的kv对象来组织的 2. 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据 3. Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。 * db:在hdfs中表现为`${hive.metastore.warehouse.dir}`目录下一个文件夹 * table:在hdfs中表现所属db目录下一个文件夹 * external table:与table类似,不过其数据存放位置可以在任意指定路径 * partition:在hdfs中表现为table目录下的子目录 * bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件 # 安装 ## derby版: 1. 解压hive 2. 解决一下版本不兼容问题:替换 `hadoop/share/hadoop/yarn/lib`中的老版本jline 为hive的lib中的jline-2.12.jar ![](https://box.kancloud.cn/531d52fd91d46e284c36593a79c8b4b9_1910x450.png) 使用方式 Hive交互shell ~~~ bin/hive ~~~ 一些交互命令 ~~~ hive> create database db1; OK Time taken: 0.258 seconds hive> create database db2; OK Time taken: 0.063 seconds hive> show databases; OK db1 db2 default Time taken: 0.008 seconds, Fetched: 3 row(s) hive> ~~~ 这边创建了一些库,这些库在哪里? 在你执行启动hive命令下面有个`metastore_db`这个文件夹 不同的用户在不同的目录下启动,都会在不同的目录下创建`metastore_db`这个文件夹 这就是把元数据放在derby中 这样就不便于我们的管理 缺点:多个地方安装hive后,每一个hive是拥有一套自己的元数据,大家的库、表就不统一; ## 元数据库mysql版: 1. 解压 2. 修改配置文件 3. 加载mysql数据驱动包 在hive的conf文件夹下 ~~~ vim hive-site.xml ~~~ 配置数据库信息 ~~~ <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.33.10:3306/hive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property> </configuration> ~~~ 然后配置环境变量 ~~~ mv hive-env.sh.template hive-env.sh vim hive-env.sh ~~~ 把里面的`HADOOP_HOME`配置为你自己的hadoop路径,然后把注释放开 然后把之前derby版的`metastore_db`这个文件夹,删除了 在lib目录下上传个mysql驱动的jar包 然后就可以操作了 试着插入些库,表还有数据 然后插入成功就看下网页版的 ![](https://box.kancloud.cn/09826e1d6dc7f7559a1fd07cb7eeb7fe_2232x364.png) 这边会看到创建的库 ## Hive JDBC服务 ![](https://box.kancloud.cn/eacf697c37b4dc18aa93170368f74f5f_727x303.png) hive也可以启动为一个服务器,来对外提供 启动方式,(假如是在h01上): 启动为前台(启动成功会占用100000端口): ~~~ bin/hiveserver2 ~~~ 启动为后台: ~~~ nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & ~~~ 启动成功后,可以在别的节点上用beeline去连接 * 方式(1) hive/bin/beeline 回车,进入beeline的命令界面 输入命令连接hiveserver2 ~~~ [root@master bin]# beeline Beeline version 1.2.1 by Apache Hive beeline> !connect jdbc:hive2://127.0.0.1:10000 Connecting to jdbc:hive2://127.0.0.1:10000 Enter username for jdbc:hive2://127.0.0.1:10000: root Enter password for jdbc:hive2://127.0.0.1:10000: Connected to: Apache Hive (version 1.2.1) Driver: Hive JDBC (version 1.2.1) Transaction isolation: TRANSACTION_REPEATABLE_READ 0: jdbc:hive2://127.0.0.1:10000> ~~~ 用户名是root,密码直接回车 然后那边hiveserver2是显示ok 上面ip端口是127.0.0.1:10000 * 方式(2) 或者启动就连接: ~~~ bin/beeline -u jdbc:hive2://127.0.0.1:10000 -n root ~~~ 接下来就可以做正常sql查询了