目录
Hive概述
基于Hbase的高层语言。类似于SQL --- 访问和处理关系型数据库的计算机语言。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件(例如xml)映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Apache Hive™ 数据仓库软件为分布式存储的大数据集上的读、写、管理提供很大方便,同时还可以用SQL语法在大数据集上查询。Hive是一种以SQL风格进行任何大小数据分析的工具,其特点是采取类似关系数据库的SQL命令。其特点是通过 SQL处理Hadoop的大数据,数据规模可以伸缩扩展到100PB+,数据形式可以是结构或非结构数据。
Hive特点:
通过SQL轻松访问数据的工具,从而使数据仓库任务,如提取/转换/加载(ETL),报告和数据分析变得可行。
一种对各种数据格式结构化的机制。
访问直接存储或在Apache HDFS™的文件,或其他数据存储系统的文件如Apache HBase™
通过Apache TEZ™,Apache Spark™™,或MapReduce采用HPL-SQL执行查询。
通过Apache YARN和Apache Slider实现亚秒级的查询检索。
可扩展:Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
容错:良好的容错性,节点出现问题SQL仍可完成执行。
Hive供标准SQL功能,包括许多后来的SQL:2003和SQL:2011分析功能。
Hive的SQL也可以通过用户自定义函数(UDF)、用户自定义聚合(UDAFs),和用户定义的表的功能(UDTFs))进行扩展。这并不是说有一种HIVE格式,用来存储数据。Hive带有内置的连接器,可以连接逗号、制表符 分隔的文件(CSV/TSV),Apache Parquet™格式文件, Apache ORC™格式文件, 以及其它格式的文件。
用户可以用连接器扩展到其它格式,详细信息请参考开发者指南中的文件格式章节, Hive SerDe 章节。
Hive并不是为联机事务处理(OLTP)设计的,它最适用于传统的数据仓库任务。
Hive设计时考虑了最大限度的提高可测量性(扩展了更多的机器动态添加到Hadoop集群)、性能、可扩展性,容错和弱耦合其输入格式。
总结:Hive是建立在hadoop上的数据仓库基础架构。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储,查询和分析存储在Hadoop中的大规模数据机制。Hive定义了简单的类SQL查询语言,成为HQL,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉MapReduce开发者开发自定义的mapper和reducer来处理内建的mapper和reducer无法完成的,复杂的分析工作。
Hive的组件包括Hcatalog和WebHcat:
HCatalog是Hive的一部分。它是一个Hadoop的表和存储管理层,使用户能够使用不同的数据处理工具-包
括 Pig 和 MapReduce , 更容易地读取和写入网格上的数据。
WebHcat提供了一个服务,使用户可以运行Hadoop MapReduce(或者YARN), Pig,Hive作业,也可以采用
HTTP(REST类型)接口执行Hive元数据。
Hive与传统关系数据库比较有如下几个特点:
1.侧重于分析,而非实时在线交易
2.无事务机制
3.不像关系数据库那样可以随机进行 insert或update.
4.通过Hadoop的map/reduce进行分布式处理,传统数据库则没有
5.传统关系数据库只能拓展最多20个服务器,而Hive可以拓展到上百个服务器。
6.Hive和关系型数据库存储文件的系统不同,Hive使用的是Hdoop的HDFS,关系型数据库则是服务器本地的文件系统
7.关系型数据库都是为实时查询的业务进行设计的,而Hive则是为海量数据做数据挖掘设计的,实时性很差
实时性的区别导致Hive的应用场景和关系型数据库又很大不同
8.Hive很容易扩展自己的存储能力和计算能力,这个是继承Hadoop的,而关系数据库再这方面比Hive差很多
为什么使用Hive??
1)操作接口采用类SQL语法,提供快速开发的能力。
2)避免了去写MapReduce,减少开发人员的学习成本。Hive可以认为是MapReduce的一个封装、包装。
Hive的意义就是在业务分析中将用户容易编写、会写的Sql语言转换为复杂难写的MapReduce程序,从而大大降低了Hadoop学习的门槛,让更多的用户可以利用Hadoop进行数据挖掘分析。
3)扩展功能很方便。
Hive架构
为了让大家容易理解Hive的实质——-“Hive就是一个SQL解析引擎,将SQL语句转化为相应的MapReduce程序”这句话用一个图示进行示例:
从图示可以看出,Hive从某种程度上讲就是很多“SQL—MapReduce”框架的一个封装,可以将用户编写的Sql语言解析成对应的MapReduce程序,最终通过MapReduce运算框架形成运算结果提交给Client。
Hive体系结构的介绍:
Hive的体系结构可以分为以下几个部分:
①用户接口:包括shell命令、Jdbc/Odbc和WebUi,其中最常用的是shell这个客户端方式对Hive进行相应操作。
②Hive解析器(驱动Driver):Hive解析器的核心功能就是根据用户编写的Sql语法匹配出相应的MapReduce模板,形成对应的MapReduce job进行执行。
③Hive元数据库(MetaStore):Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的),Hive中的元数据信息包括表的名字、表的列和分区、表的属性(是否为外部表等)、表的数据所在的目录等。Hive中的解析器在运行的时候会读取元数据库MetaStore中的相关信息。 在这里和大家说一下为什么我们在实际业务当中不用Hive自带的数据库derby,而要重新为其配置一个新的数据库Mysql是因为derby这个数据库具有很大的局限性:derby这个数据库不允许用户打开多个客户端对其进行共享操作,只能有一个客户端打开对其进行操作,即同一时刻只能有一个用户使用它,自然这在工作当中是很不方便的,所以我们要重新为其配置一个数据库。
④Hadoop:Hive用HDFS进行存储,用MapReduce进行计算——-Hive这个数据仓库的数据存储在HDFS中,业务实际分
析计算是利用MapReduce执行的。 从上面的体系结构中可以看出,在Hadoop的HDFS与MapReduce以及MySql的辅助下,Hive其实就是利用Hive解析器将用户的SQl语句解析成对应的MapReduce程序而已,即Hive仅仅是一个客户端工具,这也是为什么我们在Hive的搭建过程中没有分布与伪分布搭建的原因。(Hive就像是刘邦一样,合理的利用了张良、韩信与萧何的辅助,从而成就了一番大事!)
Hive运行机制
创建完表之后,用户只需要根据业务需求编写Sql语句,而后将由Hive框架将Sql语句解析成对应的MapReduce程序,通过MapReduce计算框架运行job,便得到了我们最终的分析结果。在Hive的运行过程中,用户只需要创建表、导入数据、编写Sql分析语句即可,剩下的过程将由Hive框架自动完成,而创建表、导入数据、编写Sql分析语句其实就是数据库的知识了。Hive的运行过程也说明了为什么Hive的存在大大降低了Hadoop的学习门槛以及为什么Hive在Hadoop家族中占有着那么重要的地位。
Hive安装配置
1)Hive安装前需要的环境:jdk+hadoop+mysql+zookeeper
Hive走的是hadoop集群,所以不需要每台机器都安装,本次只安装在hadoop01(master)机器上
2)安装配置Hive(hadoop01仅一台机器即可)
上传离线压缩包到apache-hive-2.3.3-bin.tar.gz到/home/hadoop01
mv /home/hadoop01/apache-hive-2.3.3-bin.tar.gz /usr/software
解压:tar -xzvf apache-hive-3.0.0-bin.tar.gz
创建软连接:ln -s apache-hive-3.0.0-bin hive
设置Hive环境变量
vim /etc/profile
export HIVE_HOME=/usr/software/hive
export PATH=${HIVE_HOME}/bin:$PATH
保存退出后:source /etc/profile
vim ~/.bashrc
export HIVE_HOME=/usr/software/hive
export PATH=${HIVE_HOME}/bin:$PATH
保存退出后:source ~/.bashrc
在运行 Hive 之前需要使用以下命令修改配置文件:
cd /usr/software/hive/conf
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties
编辑hive-env.sh:
因为 Hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:
export JAVA_HOME=/usr/software/java/jdk1.8.0_152
export HADOOP_HOME=/usr/software/hadoop-3.0.1
export HIVE_HOME=/usr/software/hive
创建HDFS目录:
在 Hive 中创建表之前需要创建以下 HDFS 目录并给它们赋相应的权限:
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /user/hive/tmp
hdfs dfs -mkdir -p /user/hive/log
hdfs dfs -chmod g+w /user/hive/warehouse
hdfs dfs -chmod g+w /user/hive/tmp
hdfs dfs -chmod g+w /user/hive/log
配置hive-site.xml
<configuration>
<property>
<name>hive.exec.scratchdir</name> //HDFS路径,用于存储不同map/reduce阶段的执行计划
<value>/user/hive/tmp</value> //和这些阶段的中间输出结果。
</property>
<property>
<name>hive.metastore.warehouse.dir</name> //Hive 默认的数据文件存储路径,通常为 HDFS 可写的路径。
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.querylog.location</name> //Hive 实时查询日志所在的目录,如果该值为空,将不创建实
<value>/user/hive/log</value> //时的查询日志。
</property>
//配置 MySQL 数据库连接信息。
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
//配置hive中支持事务,否则hive中不支持INSERT INTO等操作
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>1</value>
</property>
</configuration>
保存退出
3)安装mysql数据库替换Derby
默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不使用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL作为元数据库,
Hive内部对MySQL提供了很好的支持。
mysql安装步骤已在mysql-cluster中安装完成,此处不再描述
进入mysql shell界面mysql>后,配置mysql数据库允许Hive接入:
新建hive数据库,用来保存hive的元数据
mysql> create database hive;
mysql> use hive;
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
mysql> FLUSH PRIVILEGES;
mysql> quit;
出现错误:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
解决办法:flush privileges;
4)启动Hive
在命令行运行 hive 命令时必须保证以下两点:
HDFS 已经启动。可以使用 start-dfs.sh 脚本来启动 HDFS。
MySQL Java 连接器添加到 $HIVE_HOME/lib 目录下。我安装时使用的是mysql-connector-java-5.1.46.jar
从 Hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。
cd /usr/software/hive/
bin/schematool -dbType mysql -initSchema
初始化成功后
查看Hive在HDFS创建目录/usr/software/hadoop-3.0.1/bin/hdfs dfs -ls /
cd /usr/software/hive/
bin/hive
第一次执行出错说tmp没有写权限,那么添加写权限
hdfs dfs -chmod 777 /user/hive/tmp
hive> create table test(id int, name string)row format delimited fields terminated by ',';
创建数据库表,上传的文件以","逗号分隔
hive> show tables;
在hdfs的目录:/user/ceshi/hive上传hive.txt
load data inpath '/user/test/hive/hive.txt' into table test;
因为创建表时候指定需要用逗号分隔,所以创建的hive.txt数据中需要以逗号分隔上传后才能识别
hive的退出用:exit;
select count(*) from test;
hive3.0.0没有jar包冲突,版本匹配正确之后没有任何问题!!!
bin/hive --hiveconf hive.root.logger=DEBUG,console
set hive.execution.engine=tez;
bin/hive --hiveconf hive.execution.engine=tez