Hive是一个构建在Hadoop上的数据仓库框架。最初,Hive是由Facebook开发,后来移交由Apache软件基金会开发,并作为一个Apache开源项目。
Hⅳve是基于 Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SαL査询功能。
Hⅳve能够存储很大的数据集,可以直接访问存储在 Apache HDFS或其他数据存储系统(如 Apache HBase)中的文件。
Hive支持 MapReduce、 Spark、Tez这三种分布式计算引擎
Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储
Hive是建立在 Hadoop上的数据仓库基础构架。提供了一系列的工具,可以存储、查询和分析存储在分布式存储系统中的大规模数据集。Hive定义了简单的类sql査询语言,通过底层的计算引擎,将SαL转为具体的计算任务进行执行
客户端:Client
Client CLI(hive shell 命令行)
JDBC/ODBC(java访问hive)
WEBUI(浏览器访问hive)
元数据:Metastore
元数据包括表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是
外部表)、表的数据所在目录等。元数据默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore。
驱动器:Driver
(1)解析器(SQL Parser):将SQL字符转换成抽象语法树AST,这一步一般使用都是第三方工具库完成,比如antlr,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语句是否有误
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划
(3)优化器(Query Optimizer):对逻辑执行计划进行优化
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark
数据处理:存储和执行
Hive使用HDFS进行存储,使用MapReduce进行计算。
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
MapReduce
MapReduce将计算分为两个阶段,分别为 Map 和 Reduce。对于应用来说,需要想方设法将应用拆分成多个map、reduce的作业,以完成一个完整的算法。
MapReduce整个计算过程会不断重复地往磁盘里读写中间结果,导致计算速度比较慢,效率比较低
Tez
Tez把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。
Spark
Apache Spark是一个快速的, 多用途的集群计算系统, 相对于 Hadoop MapReduce 将中间结果保存在磁盘中, Spark 使用了内存保存中间结果, 能在数据尚未写入硬盘时在内存中进行运算,同时Spark提供SQL 支持。
Spark 实现了一种叫做 RDDs 的 DAG 执行引擎, 其数据缓存在内存中可以进行迭代处理。
安装Hive,确保已安装Mysql数据库和Hadoop
进入官网: https://archive.apache.org/dist/hive/
,选择与Hadoop匹配的版本进行下载
wget https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
tar -zxvf apache-hive-3.1.3-bin.tar.gz
mv apache-hive-3.1.2-bin hive
cd hive/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
修改Hadoop安装位置及Hive的配置目录、Lib目录
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/local/program/hadoop
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/program/hive/conf
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/usr/local/program/hive/lib
cp hive-default.xml.template hive-site.xml
vim hive-site.xml
删除多余的配置文件
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value>jdbc:mysql://node001:3306/hive?createDatabaseIfNotExist=true&useSSL=falsevalue>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
<property>
<name>datanucleus.schema.autoCreateAllname>
<value>truevalue>
property>
<property>
<name>hive.metastore.schema.verificationname>
<value>falsevalue>
property>
<property>
<name>hive.cli.print.headername>
<value>truevalue>
property>
<property>
<name>hive.cli.print.current.dbname>
<value>truevalue>
property>
<property>
<name>hive.server2.webui.hostname>
<value>node001value>
property>
<property>
<name>hive.server2.webui.portname>
<value>10002value>
property>
<property>
<name>hive.metastore.warehouse.dirname>
<value>/hive/warehousevalue>
property>
configuration>
cp hive-log4j2.properties.template hive-log4j2.properties
vim hive-log4j2.properties
property.hive.log.dir = /usr/local/program/hive/logs
mkdir -p /usr/local/program/hive/logs
下载Mysql驱动包,放到到hive的lib目录
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
cp mysql-connector-java-5.1.49.jar /usr/local/program/hive/lib
查看Hadoop与Hive分别的guava本版
ls hadoop/share/hadoop/common/lib/guava-*.jar
ls hadoop/share/hadoop/hdfs/lib/guava-*.jar
ls hive/lib/guava-*.jar
若版本差异过大或运行中出现异常:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
删除低版本的那个,将高版本的复制到低版本目录下
cp /usr/local/program/hadoop/share/hadoop/common/lib/guava-*.jar hive/lib/
vim /etc/profile
export HIVE_HOME=/usr/local/program/hive
export PATH=$HIVE_HOME/bin:$PATH
source /etc/profile
:使配置生效
初始化数据库:schematool -dbType mysql -initSchema
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:mysql://172.29.234.1:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Initialization script completed
schemaTool completed
[root@administrator bin]# hive
which: no hbase in (:/usr/local/program/hadoop/bin:/usr/local/program/hadoop/sbin:/usr/local/jdk1.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 83605e87-918d-455d-81cf-c8d9ba2348cc
Logging initialized using configuration in file:/usr/local/program/hive/conf/hive-log4j2.properties Async: true
Hive Session ID = 92dccb9f-0514-4949-9e03-38b634bb33c0
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> show databases;
OK
database_name
dbazkaban
dbsqoop
default
myhive
Time taken: 1.057 seconds, Fetched: 4 row(s)
hive (default)>
shell交互Hive,用命令hive启动一个hive的shell命令行
cd /usr/local/hive
bin/hive
Hive启动为一个服务器,对外提供服务,其他机器通过客户端通过协议连接到服务器,完成访问操作,官方推荐交互方式
启动服务端
cd /usr/local/hive
bin/hive --service hiveserver2
cd /usr/local/hive/bin
nohup hiveserver2 > /dev/null 2>&1 &
新开窗口,启动客户端进行连接
bin/beeline
!connect jdbc:hive2://IP:10000
输入用户名与密码进行连接
or
beeline -u jdbc:hive2://node001:10000 -n root
直接执行hive的hql语句
bin/hive -e "create database if not exists myhive;"
hive -f 执行sql脚本
vim hive.sql
create database if not exists myhive;
use myhive;
create tb_test(id int,name string);
hive -f ./hive.sql
节点 | metastore | hiveserver2 | client |
---|---|---|---|
node001 | * | * | |
node002 | * | ||
node003 | * |
参考上述操作搭建一个单节点Hive
[root@node001 program]# scp -r hive node002:/usr/local/program/
[root@node001 program]# scp -r hive node003:/usr/local/program/
[root@node001 program]# scp /etc/profile node002:/etc/
[root@node001 program]# scp /etc/profile node003:/etc/
source /etc/profile
vim conf/hive-site.xml
<configuration>
<!-- 数据存储位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
</property>
<!-- 美化打印数据 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!--metastore的schema一致性的校验-->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<!--指定hive.metastore.uris的port-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node001:9083</value>
</property>
</configuration>
启动Hadoop集群:start-all.sh
初始化数据库:schematool -dbType mysql -initSchema
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL: jdbc:mysql://172.29.234.1:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Initialization script completed
schemaTool completed
启动Hive
hive --service metastore
hive --service metastore -p 9083
nohup hive --service metastore > /dev/null 2>&1 &
hive
启动HiveServer2
hiveserver2
nohup hiveserver2 > /dev/null 2>&1 &
beeline -u jdbc:hive://node001:10000 -n root