前言
本人大三大数据专业,配置的虚拟机为Centos6.7系统,hadoop版本为2.6.0版本,先前已经完成搭建CentOS部署Hbase、CentOS6.7搭建Zookeeper和编写MapReduce前置插件Hadoop-Eclipse-Plugin 安装。在此基础上进行Hive下的部署以及mysql的一个连接,完成Hive的应用
一、什么是Hive?
根据我们整体的Hadoop的架构来看,Hive是建立在hadoop整体运行机制上作为数据仓库的存在。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
二、为什么要使用Hive
如果直接越过Hive操作hadoop的话有以下不便之处:
人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大
而当我们直接使用Hive的话有以下方便之处:
操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。
支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。
为数据操作提供了良好的伸缩性和可扩展性。
统一的元数据管理,可与impala/spark等共享元数据。
但是Hive的话也有以下缺点:
Hive不适合用于联机(online)事务处理,也不提供实时查询功能。(它最适合应用在基于大量不可变数据的批处理作业。)
Hive 并不能够在大规模数据集上实现低延迟快速的查询。(例如,hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。)
Hive 并不适合那些需要高实时性的应用。(例如,联机事务处理(OLTP)。)
Hive的特点是:
1.可扩展
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
2.延展性
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
3.容错
良好的容错性,节点出现问题SQL仍可完成执行。
4.输入格式的松散耦合。
三、Hive的架构
> 用户接口:Client
CLI(hive shell)、JDBC/ODBC(java访问hive),WEBUI(web访问hive)
> Hive服务器
Hive应用可以以JDBC、ODBC和Thirft(基于socket通讯)接口访问指定地址和端口的Hive服务器。
> 元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的 derby数据库中,推荐使用采用MySQL存储Metastore;
>Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
> 驱动器: Driver
负责处理Hive语句,完成编译、 优化和执行的工作。
生成相应的MapReduce任务与 HDFS节点进行数据交互。
包含:解析器、编译器、优化器、执行器;
解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第二方工具库完成,比如antlr;对AST进行方法分析,比如表是否存在、字段是否存在、SQL语义是否有误(比如select中被判定为聚合的字段在group by 中是否有出现);
编译器:将AST编译成逻辑执行计划;
优化器:对逻辑执行计划进行优化;
执行器:把逻辑执行计划转换成可以运行的物理计划。对Hive来说,就是MR/TEZ/Spark;
四、Hive sql编译过程
Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
遍历AST Tree,抽象出查询的基本组成单元QueryBlock
遍历QueryBlock,翻译为执行操作树OperatorTree
逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
遍历OperatorTree,翻译为MapReduce任务
物理层优化器进行MapReduce任务的变换,生成最终的执行计划
这里推荐美团技术博客,里面写的相当详细了:
五、部署Hive以及Mysql
1.查看版本兼容性
先查看一下自己的Hadoop版本能否兼容其他版本的Hive:
我的hadoop版本为2.6.0版本,我选择Hive的版本是2.3.7的版本:
2.安装Hive
1.获取安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.3.7/apache-hive-2.3.7-bin.tar.gz
2.解压缩
tar zxvf apache-hive-2.3.7-bin.tar.gz
mv apache-hive-2.3.7-bin hive-2.3.7
mv hive-2.3.7 /usr/local/
3.添加运行路径
vi /etc/profile.d/hive.sh export HIVE_HOME=/usr/local/hive-2.3.7 export PATH=$PATH:$HIVE_HOME/bin
hive.sh需要自己创建
执行生效:
source /etc/profile.d/hive.sh
4.查看hive是否能启动
hive Logging initialized using configuration in jar:file:/usr/local/hive-2.3.7/lib/hive-common-2.3.7.jar!/hive-log4j.properties hive> quit;
3.安装MYSQL
查看一下本机MYsql版本:
rpm -qa |grep mysql
mysql-libs-5.1.73-5.el6_6.x86_64
yum list |grep mysql mysql.x86_64 5.1.73-8.el6_8 @base mysql-libs.x86_64 5.1.73-8.el6_8 @base mysql-server.x86_64 5.1.73-8.el6_8 @base mysql57-community-release.noarch el7-8 installed apr-util-mysql.x86_64 1.3.9-3.el6_0.1 base bacula-director-mysql.x86_64 5.0.0-13.el6 base bacula-storage-mysql.x86_64 5.0.0-13.el6 base dovecot-mysql.x86_64 1:2.0.9-22.el6_10.1 updates freeradius-mysql.x86_64 2.2.6-7.el6_9 base libdbi-dbd-mysql.x86_64 0.8.3-5.1.el6 base mod_auth_mysql.x86_64 1:3.0.0-11.el6_0.1 base mysql-bench.x86_64 5.1.73-8.el6_8 base mysql-community-release.noarch el7-5 mysql-connectors-community mysql-connector-c++.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-c++-debuginfo.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-c++-devel.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-c++-jdbc.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-java.noarch 1:8.0.22-1.el7 mysql-connectors-community mysql-connector-odbc.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-odbc-debuginfo.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-odbc-setup.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-python.noarch 2.0.4-1.el7 mysql-connectors-community mysql-connector-python.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-python-cext.x86_64 8.0.21-1.el7 mysql-connectors-community mysql-connector-python-debuginfo.x86_64 2.1.7-1.el7 mysql-connectors-community mysql-connector-python3.x86_64 8.0.22-1.el7 mysql-connectors-community mysql-connector-python3-cext.x86_64 8.0.21-1.el7 mysql-connectors-community mysql-devel.i686 5.1.73-8.el6_8 base mysql-devel.x86_64 5.1.73-8.el6_8 base mysql-embedded.i686 5.1.73-8.el6_8 base mysql-embedded.x86_64 5.1.73-8.el6_8 base mysql-embedded-devel.i686 5.1.73-8.el6_8 base mysql-embedded-devel.x86_64 5.1.73-8.el6_8 base mysql-libs.i686 5.1.73-8.el6_8 base mysql-router.x86_64 8.0.12-1.el7 mysql-tools-community mysql-router-community.x86_64 8.0.22-1.el7 mysql-tools-community mysql-router-debuginfo.x86_64 8.0.12-1.el7 mysql-tools-community mysql-shell.x86_64 8.0.22-1.el7 mysql-tools-community mysql-shell-debuginfo.x86_64 8.0.22-1.el7 mysql-tools-community mysql-test.x86_64 5.1.73-8.el6_8 base mysql-utilities.noarch 1.6.5-1.el7 mysql-tools-community mysql-utilities-extra.noarch 1.5.6-1.el7 mysql-tools-community mysql-workbench-community.x86_64 8.0.22-1.el7 mysql-tools-community mysql-workbench-community-debuginfo.x86_64 8.0.22-1.el7 mysql-tools-community pcp-pmda-mysql.x86_64 3.10.9-9.el6 base php-mysql.x86_64 5.3.3-50.el6_10 updates qt-mysql.i686 1:4.6.2-28.el6_5 base qt-mysql.x86_64 1:4.6.2-28.el6_5 base rsyslog-mysql.x86_64 5.8.10-12.el6 base rsyslog7-mysql.x86_64 7.4.10-7.el6 base
yum install mysql-server.x86_64 rpm -qa |grep -i mysql mysql-5.1.73-7.el6.x86_64 mysql-libs-5.1.73-7.el6.x86_64 mysql-server-5.1.73-7.el6.x86_64 perl-DBD-MySQL-4.013-3.el6.x86_64
这里直接使用hadoop自带的mysql就好了,一般测试够用了。
4.Hive和mysql连接
将MySQL的JDBC驱动文件mysql-connector-java-5.1.40-bin.jar复制到Hive的依赖库中,也可自行下载。
wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.40.tar.gz
解压:
tar zxvf mysql-connector-java-5.1.40.tar.gz cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/hive-2.3.7/lib/
设置Mysql:
先启动mysql:
/etc/init.d/mysqld start
以root的身份进入mysql,不需要密码直接enter进入:
mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.73 Source distribution
创建一个hiveDB的账户:
mysql> create database hiveDB;
修改root密码,将root的密码也设置为root,当然你也可以自己设定一个密码格式为update user set password=password('密码') where user='用户名';:
mysql> use mysql; mysql> update user set password=password('root') where user='root';
刷新系统权限表
mysql> FLUSH PRIVILEGES; mysql> quit;
重新登录mysql
mysql -u root –p
在root用户下授权root用户于hivedb数据库于登陆身份为root主机:
mysql> grant all privileges on hiveDB.* to 'root'@'%' identified by 'root'; mysql> flush privileges; mysql> quit;
配置Hive:
vi /usr/local/hive-2.3.7/conf/hive-env.sh.templat
修改
# HADOOP_HOME=${bin}/../../hadoop 为 HADOOP_HOME=/usr/lib/hadoop mv /usr/local/hive-2.3.7/conf/hive-env.sh.template /usr/local/hive-2.3.7/conf/hive-env.sh hdfs dfs -ls /
查看hdfs目录下是否存在hive存储的目录,没有的话创建
hdfs dfs -mkdir /tmp/hive hdfs dfs -mkdir /user/hive hdfs dfs -mkdir /user/hive/warehouse
文件hive-site.xml内保存Hive运行时所需要的相关配置信息,没有就建一个。
vi /usr/local/hive-2.3.7/conf/hive-site.xml
在里面添加
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <configuration> <!-- Hive Execution Parameters --> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>hdfs://hadoop1:9000/hive/warehouse</value> <description>location of default database for the warehouse</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> <property> <name>javax.jdo.option.Multithreaded</name> <value>true</value> <description>Set this to true if multiple threads access metastore through JDO concurrently.</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop1:3306/hiveDB?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore</description> </property> </configuration>
属性hive.exec.scratchdir:执行Hive操作访问HDFS时用于存储临时数据的目录,默认为/tmp/目录,通常设置为/tmp/hive/。
属性hive.metastore.warehouse.dir:执行Hive数据仓库操作的数据存储目录,设置为HDFS存储路径hdfs://master_hostname:port/hive/warehouse,这里设为hdfs://hadoop1:9000/hive/warehouse。
属性javax.jdo.option.ConnectionDriverName:设置Hive连接MySQL的驱动名称,属性值为com.mysql.jdbc.Driver。
属性javax.jdo.option.ConnectionUserName:Hive连接存储metastore内容的数据库的用户名。
属性javax.jdo.option.ConnectionPassword:Hive连接存储metastore内容的数据库的密码。
属性javax.jdo.option.Multithreaded:是否允许Hive与MySQL之间存在多条连接,设置为true,表示允许。
属性javax.jdo.option.ConnectionURL:设置Hive通过JDBC模式连接MySQL数据库存储metastore内容,属性值为jdbc:mysql://host/database_name?createDatabaseIfNotExist=true,这里设为jdbc:mysql://hadoop1:3306/hiveDB?createDatabaseIfNotExist=true。
配置完之后测试一下hive是否可用:
hive Logging initialized using configuration in jar:file:/usr/local/hive-2.3.7/lib/hive-common-2.3.7.jar!/hive-log4j.properties hive> SHOW TABLES; hive> SHOW TABLES; OK Time taken: 1.637 seconds hive> quit;
配置完成!