Hive是什么?一个建立在分布式存储系统(这里指HDFS)上的SQL引擎。
使用Hive主要是用于离线批量计算,或者称为数据仓储的工具。
因为它最主要的特点是,能够将SQL自动转换成MapReduce任务。而MapReduce又是运行在HDFS上的,有YARN管理的多个MapReduce任务的集合。
官方网址:Home - Apache Hive - Apache Software Foundation
概述Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。
它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。
- 在Hive中,Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
- Hive的表其实就是HDFS的目录/文件,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/RJob里使用这些数据。
最初,Hive是由Facebook开发,后来由Apache软件基金会开发,并作为进一步将它作为名义下ApacheHive为一个开源项目。它用在好多不同的公司。例如,亚马逊使用它在Amazon Elastic、MapReduce。
其它的SQL on Hadoophive是最常见的SQL on Hadoop , 还包括其他的几个常见的SQL on Hadoop框架
- Presto:最早有Facebook开源,国内京东使用比较广泛
- Drill
- impala:由Cloudera公司提供,基于内存,Hive是基于硬盘的
- Spark SQL-----可以和Hive做整合cuiyaonan2000@163.com
- 操作使用类SQL语法,提供快速开发的能力
- 避免了开发MapReduce,减少开发成本
- Hive的执行延迟比较高,不适合在线事务处理,适合传统的数据仓库任务
- Hive优势在于大数据,处理小数据没有优势
- Hive的效率较低的原因:自动生成的MapReduce作业,通常情况下不够智能化--------------hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。
- Hive的调优比较困难,力度较粗
- 支持创建索引,优化数据查询。
- 支持不同的存储类型,例如,纯文本文件、HBase 中的文件。
- 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
- 可以直接使用存储在Hadoop 文件系统中的数据。
- 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
- 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
Hive体系如下所示.
用户接口(我们连接Hive的方式)
用户接口主要有三个:
- CLI:其中最常用的是 Cli,Cli 启动的时候,会同时启动一个 hive 副本(在Hive的bin目录下执行命令hive 就会创建一个Cli.这种连接方式主要用于学习、调试、生产cuiyaonan2000@163.com)
- Client: Client 是 hive 的客户端,用户连接至 hive Server。在启动 Client 模式的时候,需要指出 hive Server 所在节点,并且在该节点启动 hive Server。即通过JDBC/ODBC连接到Hive.JDBC/ODBC:是 Hive 的 Java 实现,与传统数据库 JDBC 类似, 用户(开发员、运维人员) 通过这连接至 Hive Server
- WUI:WUI 是通过浏览器访问 hive。
该模块主要用于支持各种语言通过Client方式连接到Hive.这也是我们程序的部署方式,所需要的一个模块.
元数据存储hive 将元数据存储在数据库中,如 mysql、derby。hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
解释器、编译器、优化器、执行器解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
Hadoophive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(不包含 * 的查询,比如 select * from tbl 不会生成 MapReduce 任务)。
数据存储模型Hive数据库在hdfs中表现为hive.metastore.warehouse.dir目录下的一个文件夹
表(Table):在hdfs中表现所属db目录下一个文件夹
hive中的Table和数据库中的Table在概念上是类似的。在hive中每一个Table都有一个相应的目录存储数据。-------即MySQL存储Hive的元数据,用于与HDFS中的数据进行关联
外部表(External Table):数据存放位置可以在HDFS任意指定路径
外部表是一个已经存储在HDFS中,并具有一定格式的数据。使用外部表意味着hive表内的数据不在hive的数据仓库内,它会到仓库目录以外的位置访问数据。
- 普通表的创建:创建普通表的操作分为两个步骤,即表的创建步骤和数据装入步骤(可以分开也可以同时完成)。在数据的装入过程中,实际数据会移动到数据表所在的hive数据仓库文件目录中,其后对该数据表的访问将直接访问装入所对应文件目录中的数据。删除表时,该表的元数据和在数据仓库目录下的实际数据将同时删除。
- 外部表创建:创建表和装入数据同时完成。外部表的实际数据存储在创建语句。LOCATION参数指定的外部HDFS文件路径中,但这个数据并不会移动到hive数据仓库的文件目录中。删除外部表时,仅删除其元数据,保存在外部HDFS文件目录中的数据不会被删除。
在hdfs中表现为table目录下的子目录
分区对应于数据库中的分区列的密集索引,但是hive中分区的组织方式和数据库中的很不相同。
在hive中,表中的一个分区对应于表下的一个目录,所有的分区的数据都存储在对应的目录中。 ----hdfs就是分布式文件系统,数据的存储肯定是放在目录下的cuiyaonan2000
桶(Bucket):在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
桶对指定列进行哈希(hash)计算,会根据哈希值切分数据,目的是为了并行,每一个桶对应一个文件。-------同上
集群类型Hive中搭建分为三中方式如下所示: 三种方式归根到底就是元数据的存储位置不一样。
- 内嵌Derby方式: 使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库。
- Local方式:这种存储方式需要在本地运行一个mysql服务器,即metastore service 和 hive客户端在一起.
- Remote方式: 这种方式其实是Local方式的拆解,即连接Mysql作为服务端:即MetaStore Server,客户端就是需要连接MetaStore Server将数据存入Mysql中的hive客户端.
服务端配置文件(因为服务端需要和Mysql通信,所以服务端需要Mysql的lib安装包到Hive_Home/conf目录下)
启动hive服务端程序 (其它Hive客户端就不需要连接Mysql直接连接,服务端来操作数据库)
hive --service metastore 2>&1 >> /dev/null &
hive.metastore.warehouse.dir
/user/hive/warehouse
javax.jdo.option.ConnectionURL
jdbc:mysql://192.168.57.6:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
123456
客户端配置文件(即不配置mysql的相关信息,而是连接到metastore的服务来间接获取mysql内的信息)
客户端配置文件(由于客户端需要和Hadoop通信,所以需要更改Hadoop中jline的版本。从hive的lib包中拷贝到Hadoop中lib位置为/opt/soft/hadoop-2.6.5/share/hadoop/yarn/lib) 留一个高版本的jline jar包.------该步骤是不需要的,单是如果有问题就需要看一下
客户端直接使用hive命令即可
hive.metastore.warehouse.dir
/user/hive/warehouse
hive.metastore.local
false
hive.metastore.uris
thrift://192.168.57.5:9083
验证
当服务端启动后通过命令jps查看到多了一个服务即RunJar代表的是Hive锦城
通过命令./hive 启动客户端命令就会有个客户端进程RunJar(服务端和客户端的进程名字一样cuiyaonan2000@163.com)
同时启动了多少个客户端就有多少个./hive进程,他们的都会连接MeatStore Service,并将元数据信息存入Mysql数据库.当退出客户端的时候就会退出./hive进程.
同理从这里我们可以理解到 在实际应用中,我们的程序就是一个hive客户端需要连接到hive的服务端.cuiyaonan2000@163.com
如下是启动了多个客户端的情况
准备工作
- . 一个可连接的关系型数据库,如 Mysql,postgresql 等,用于存储元数据
- hadoop,并启动 hdfs
- HBase,非必须,但是如果不装,会有警告,不过不影响使用
- java,1.8 以上版本
下载后的Hive的安装包目录所含说明如下:
- bin:包含hive的命令shell脚本
- binary-package-licenses:包含了LICENSE说明文件
- conf:包含hive配置文件
- examples:包含了示例
- hcatalog:Metastore操作的元数据目录
- jdbc:提供了hive-jdbc-2.3.0-standalone.jar包
- scripts:提供了sql脚本
#下载hive
[root@cuiyaonan2000 hive] wget https://mirrors.bfsu.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
[root@cuiyaonan2000 hive] tar -zxvf apache-hive-3.1.2-bin.tar.gz
[root@cuiyaonan2000 hive] vi /etc/profile
#增加如下的内容:
export HIVE_HOME=/soft/hive/apache-hive-3.1.2-bin
export PATH=$PATH:$HIVE_HOME/bin
[root@cuiyaonan2000 hive] source /etc/profile
#如果安装成功则会正常返回
#如果爆出异常:Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
#hive和hadoop的lib下面的guava.jar版本不一致造成的。
#hive的lib下面的为guava-19.0.jar
#hadoop的目录share/hadoop/common/lib下面的为guava-27.0.jar
#将hive的低版本删除,把hadoop的高版本移动过去就可以了
[root@cuiyaonan2000 hive] hive --version
#在修改配置文件之前,需要现在root目录下建立一些文件夹
[root@cuiyaonan2000 hive] mkdir hive
[root@cuiyaonan2000 hive] mkdir warehouse
#然后在hadoop上建立相同层级的文件夹
[root@cuiyaonan2000 hive] hadoop fs -mkdir -p /root/hive
[root@cuiyaonan2000 hive] hadoop fs -mkdir -p /root/hive/warehouse
#给hadoop创建的文件夹赋予权限
[root@cuiyaonan2000 hive] hadoop fs -chmod 777 /root/hive
[root@cuiyaonan2000 hive] hadoop fs -chmod 777 /root/hive/warehouse
#检查刚才的hadoop的文件夹是否创建成功
[root@cuiyaonan2000 hive] hadoop fs -ls /root
[root@cuiyaonan2000 hive] hadoop fs -ls /root/hive/
hive-env.sh
[root@cuiyaonan2000 hive] cp hive-env.sh.template hive-env.sh
[root@cuiyaonan2000 hive] vi hive-env.sh
#增加如下内容
export JAVA_HOME=/soft/jdk/jdk1.8.0_271
export HADOOP_HOME=/soft/hadoop/hadoop-3.2.2
export HIVE_HOME=/soft/hive/apache-hive-3.1.2-bin
hive-site.xml
注意hive- default.xml.template这个要复制二份:
- hive-default.xml : 为全局配置;
- hive-site.xml : 其中 hive-site.xml为用户自定义配置,hive-site.xml自定义配置会覆盖 hive-default.xml全局配置的相同配置项。
修改如下的配置信息:
javax.jdo.option.ConnectionURL
jdbc:mysql://192.168.100.103:3306/ccx_hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc:postgresql://172.16.89.80:5432/db?ssl=true;databaseName=metastore_db;create=true
jdbc:postgresql://172.16.89.80:5432/ball
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
org.postgresql.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
u_ccx_hive
javax.jdo.option.ConnectionPassword
123456
hive.execution.engine
mr
spark
Expects one of [mr, tez, spark].
Chooses execution engine. Options are: mr (Map reduce, default), tez, spark. While MR
remains the default engine for historical reasons, it is itself a historical engine
and is deprecated in Hive 2 line. It may be removed without further warning.
hive.metastore.schema.verification
False
Enforce metastore schema version consistency.
True: Verify that version information stored in is compatible with one from Hive jars. Also disable automatic
schema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensures
proper metastore schema migration. (Default)
False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
hive.metastore.warehouse.dir
/root/hive/warehouse
location of default database for the warehouse
hive.exec.scratchdir
/root/hive
hive.metastore.uris
hive.querylog.location
/user/hive/log/hadoop
Location of Hive run time structured logfile
hive.exec.local.scratchdir
/usr/local/hive/iotmp
hive.metastore.db.type
mysql
继续修改hive-site.xml
- ${system:java.io.tmpdir} :全部替换为 :/root/hive/tmp/ ------并将此文件夹赋予读写权限cuiyaonan2000@163.com
- ${system:user.name} :全部替换为:root
#在bin目录下初始化mysql
[root@cuiyaonan2000 bin]# ./schematool -dbType mysql -initSchema
启动Hive
执行命令:/usr/local/software/apache-hive-2.3.0-bin/bin/hive
在输入命令hive进入shell客户端后
创建数据库hive> create database db_hive;
创建表说明: terminated by '\t' 表示文本分隔符要使用Tab,行与行直接不能有空格。
hive> create table db_hive.student(cui string ,yao string ,nan string) row format delimited fields terminated by '\t';
插入数据因为hive 不支持写,所以添加数据使用load加载文本获取。
通过vi datatest来编辑如下的内容,其中不同字段之间使用tab来Tab来分隔。后保存并退出
导入本地数据:
hive> load data local inpath '/soft/hive/apache-hive-3.1.2-bin/bin/datatest' into table db_hive.student;
查询导入结果
hive> select *from db_hive.student;
结果如下所示