🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # hive架构图 ![](https://box.kancloud.cn/288f0600c50fbf1c7c6f247f67d842bd_361x479.png) ![](https://box.kancloud.cn/95f22101e77cbefa1c9effd70fc24627_482x446.png) ## 基本组成 * 用户接口:包括 CLI、JDBC/ODBC、WebGUI。 * 元数据存储:通常是存储在关系数据库如 mysql , derby中.包括:表名,表所属的数据库(默认是default),表的拥有者,字段,表的类型(是否是外部表),表的数据所在目录等 * 解释器、编译器、优化器、执行器。 ## 各组件的基本功能 * 用户接口主要由三个: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/62f6428e854ef36b1620377d3e2e9aad_650x261.png) ## Hive与传统数据库对比 hive用于海量数据的离线数据分析 ![](https://box.kancloud.cn/a8e76d772ef69c9ac90b2c060f19403d_513x351.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/12aa07af5a894bbcf7e432b67b4e7071_839x220.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命令下面有个`metastore_db`这个文件夹 不同的用户在不同的目录下启动,都会在不同的目录下创建`metastore_db`这个文件夹 这就是把元数据放在derby中 这样就不便于我们的管理 缺点:多个地方安装hive后,每一个hive是拥有一套自己的元数据,大家的库、表就不统一; ## 元数据库mysql版: **数据库字符集要是latin1,排序是latin1_bin** 1. 解压 2. 修改配置文件 3. 加载mysql数据驱动包 在hive的conf文件夹下 ~~~ cp hive-default.xml.template hive-site.xml 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> ~~~ **mysql 5.7 作为hive 元数据存储的时候要注意 ** 连接字符串的修改 ![](https://box.kancloud.cn/79574b0eaf1b2ca91d5f200b6b667006_1367x342.png) 否则 ![](https://box.kancloud.cn/c07546b47c0ef0135f0d8d19cc477816_1329x199.png) hive-site.xml 注释掉 ![](https://box.kancloud.cn/f7e0a21c857b1271a83af7af10655264_563x298.png) 否则报错 ![](https://box.kancloud.cn/21bc0fcdc3e8c9ca95939cab82920130_1355x178.png) 然后配置环境变量 ~~~ mv hive-env.sh.template hive-env.sh vim hive-env.sh ~~~ **把里面的`HADOOP_HOME`配置为你自己的hadoop路径,然后把注释放开** **配置`HIVE_CONF_DIR`路径** 然后把之前derby版的`metastore_db`这个文件夹,删除了 **在lib目录下上传个mysql驱动的jar包** **配置下环境变量** 然后就可以操作了 试着插入些库,表还有数据 然后插入成功就看下网页版的 ![](https://box.kancloud.cn/b8d1b9355233d5cec37bf5fa9d117493_929x149.png) 这边会看到创建的库 --- 一般不需要创建 hdfs上创建/tmp和/user/hive/warehouse两个目录并修改他们的同组权限可写 ~~~ hadoop fs -mkdir /tmp hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /user/hive/warehouse hadoop fs -chmod g+w /tmp ~~~ --- ## Hive JDBC服务 ![](https://box.kancloud.cn/3a897c0ee1f94133031c92a2f2029164_730x295.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查询了