- Hive
- Hive概述
- Hive架构
- Hive计算引擎
- Linux安装Hive
- 下载Hive
- 解压及重命名
- 配置hive-env.sh
- 创建hive-site.xml
- 配置日志
- 添加驱动包
- 配置环境变量
- 初始化数据库
- 启动Hive
- Hive的交互方式
- 使用bin/hive
- 使用hiveServer2
- 使用sql语句或者sql脚本
- Hive集群搭建
- 安装一个单节点Hive
- 分发Hive到其他节点
- 修改分发节点配置文件
- 启动Hive集群
Hive是一个构建在Hadoop上的数据仓库框架。最初,Hive是由Facebook开发,后来移交由Apache软件基金会开发,并作为一个Apache开源项目。
Hⅳve是基于 Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SαL査询功能。
Hⅳve能够存储很大的数据集,可以直接访问存储在 Apache HDFS或其他数据存储系统(如 Apache HBase)中的文件。
Hive支持 MapReduce、 Spark、Tez这三种分布式计算引擎
Hive架构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查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。Hive计算引擎
MapReduce
MapReduce将计算分为两个阶段,分别为 Map 和 Reduce。对于应用来说,需要想方设法将应用拆分成多个map、reduce的作业,以完成一个完整的算法。
MapReduce整个计算过程会不断重复地往磁盘里读写中间结果,导致计算速度比较慢,效率比较低
Tez
Tez把Map/Reduce过程拆分成若干个子过程,同时可以把多个Map/Reduce任务组合成一个较大的DAG任务,减少了Map/Reduce之间的文件存储。
Spark
Apache Spark是一个快速的, 多用途的集群计算系统, 相对于 Hadoop MapReduce 将中间结果保存在磁盘中, Spark 使用了内存保存中间结果, 能在数据尚未写入硬盘时在内存中进行运算,同时Spark提供SQL 支持。
Linux安装HiveSpark 实现了一种叫做 RDDs 的 DAG 执行引擎, 其数据缓存在内存中可以进行迭代处理。
安装Hive,确保已安装Mysql数据库和Hadoop
下载Hive进入官网: 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配置hive-env.sh
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创建hive-site.xml
cp hive-default.xml.template hive-site.xml vim hive-site.xml
删除多余的配置文件
配置日志javax.jdo.option.ConnectionURL jdbc:mysql://node001:3306/hive?createDatabaseIfNotExist=true&useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456 datanucleus.schema.autoCreateAll true hive.metastore.schema.verification false hive.cli.print.header true hive.cli.print.current.db true hive.server2.webui.host node001 hive.server2.webui.port 10002 hive.metastore.warehouse.dir /hive/warehouse
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启动Hive
[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)>Hive的交互方式 使用bin/hive
shell交互Hive,用命令hive启动一个hive的shell命令行
cd /usr/local/hive bin/hive使用hiveServer2
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使用sql语句或者sql脚本
直接执行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.sqlHive集群搭建
| 节点 | metastore | hiveserver2 | client |
|---|---|---|---|
| node001 | * | * | |
| node002 | * | ||
| node003 | * |
参考上述操作搭建一个单节点Hive
分发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
启动Hive集群hive.metastore.warehouse.dir /hive/warehouse hive.cli.print.header true hive.cli.print.current.db true hive.metastore.schema.verification false datanucleus.schema.autoCreateAll true hive.metastore.uris thrift://node001:9083
启动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



