Hive是基于Hadoop的数据仓库工具,提供了在Hadoop分布式存储上对大数据集使用SQL进行查询、修改、管理数据的功能。
Hive提供标准SQL功能,包括SQL:2003,SQL:2011和SQL:2016分析功能。Hive的SQL也可以通过用户自定义的函数(UDF),用户自定义聚合(UDAF)和用户自定义的表函数(UDTF)使用用户代码进行扩展。
Hive不要求数据存储为某种特定的格式,Hive自带连接器可以构建“,”或者“\t”分隔的CSV,TSV文本文件,Apache Parquet,Apache ORC和其他格式,用户可以为其他格式扩展Hive连接器。
一,概念
Hive是
Hive是基于Hadoop数据仓库工具,来处理结构化数据。Hadoop为Hive提供了大规模扩展和容错功能。
Hive不是
- 用来处理联机事务(OLTP)
- 不是关系数据库
- 不是实时查询和行级更新语言
基于Hadoop,Hive提供了以下功能。
- 通过SQL轻松访问数据的工具,从而实现数据仓库,如(extract/transform/load)ETL,报告,数据分析等。
- 将结构强加于各种数据结构的一种机制。
- 直接访问存储在Apache HDFS中的文件,或者在其他存储系统的文件,如:Hbase
- 通过Apache Tez,Apache Spark或者MapReduce执行查询
- 使用HPL-SQL
- 通过Hive LLAP,Apache Yarn和Apache Slider进行亚秒级查询
Hive最好用于传统的数据仓库。
按照粒度单位,Hive数据分为
- Databases,命名空间,用于避免表,视图,分区,列等命名冲突。还用于用户或用户组权限。
- Tables,具有相同模式的同类数据单元,例如page_views表,每一行包含以下列:
- timestmap,INT类型,对应于查看页面的Unix时间戳
- userId,BIGINT类型,对应于查看页面的用户
- page_url,String类型,页面的资源路径
- referer_url,String类型,用户到达当前页面的页面位置
- ip,String类型,发出请求的用户IP
- Partitions,每一张Table可以有一个或者多个Partition key,Partition key决定了数据是怎们存储的。Partitions,一是作为存储单元,另一个是通过Partition,用户可以识别满足标准的行。例如String类型的date_partition和String类型的county_partition。每一个Partition key唯一键定义了Table的一个partition,例如从2009-12-23开始所有的US数据是page_views表的一个partition。因此,如果仅仅对2009-12-23以后的US数据进行分析,则只在表的相关分区上运行查询,从而可以加快数据分析速度。注意,仅仅因为partition名称为2009-12-23,并不是他包含该日期的全部或者只包含该日期的数据。为了方便理解,partition使用日期命名。partition和数据的关系取决用用户,分区时虚拟的,不是数据的一部分,而是加载时派生的。
- Buckets,每个分区的数据又可以分为Bucket。如page_views表可以根据userId分,userid是表的一个列,或者
结构
Hive组件包括HCatalog和WebHCat。
- HCatalog是Hadoop的表和存储管理层,可以让用户使用不同的数据处理工具(Pig和MapReduce),可以更轻松的读写表格数据。
- WebHCat,提供了一个用来执行Hadoop MapReduce或者YARN,Pig,Hive任务的服务,你也可以执行Hive元数据操作通过Rest风格Http接口。
Hive的结构如下图
单元名称 | 操作 |
用户接口/界面 | Hive是一个数据仓库基础工具软件,可以创建用户和HDFS之间互动。用户界面,Hive支持是Hive的Web UI,Hive命令行,HiveHD洞察(在Windows服务器)。 |
元存储 | Hive选择各自的数据库服务器,用以储存表,数据库,列模式或元数据表,它们的数据类型和HDFS映射。 |
HiveQL处理引擎 | HiveQL类似于SQL的查询上Metastore模式信息。这是传统的方式进行MapReduce程序的替代品之一。相反,使用Java编写的MapReduce程序,可以编写为MapReduce工作,并处理它的查询。 |
执行引擎 | HiveQL处理引擎和MapReduce的结合部分是由Hive执行引擎。执行引擎处理查询并产生结果和MapReduce的结果一样。它采用MapReduce方法。 |
HDFS 或 HBASE | Hadoop的分布式文件系统或者HBASE数据存储技术是用于将数据存储到文件系统。 |
二,安装
2.1,选择版本
根据自己hadoop的版本选择正确的hive版本
在官网https://hive.apache.org/downloads.html页面查看hive版本,以及对应的hadoop版本。
hive2已经不再支持基于Map-Reduce的计算,所以选择1.x版本使用MapReduce进行计算。
2.2,下载解压
[root@ecs-7bc6-0001 hive]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-1.2.2/apache-hive-1.2.2-bin.tar.gz
[root@ecs-7bc6-0001 hive]# tar -zxvf apache-hive-1.2.2-bin.tar.gz
重命名一下
[root@ecs-7bc6-0001 hive]# mv apache-hive-1.2.2-bin hive-1.2.2
2.3,添加环境变量
export HIVE_HOME=/home/work/docker/hive/hive-1.2.2
export PATH=$PATH:$HIVE_HOME/bin
使环境变量生效
source /etc/profile
2.4,运行
2.4.1,准备
必须添加hadoop在环境变量中
2.4.2,修改配置
进入hive安装目录的conf目录下,将配置模板复制一份,命名为hive-site.xml
[root@master2 conf]# cp hive-default.xml.template hive-site.xml
修改配置,主要分为三个方面,
1),metastore对应的数据库配置,包括URL,用户名,密码,JDBC驱动
2),数据存储目录
3),相关日志文件目录
根据自己的情况,修改相应的配置,比如mysql在172.16.0.5:3306,hdfs在172.16.0.2:9000
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://172.16.0.5:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string 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>mysql</value>
<description>password to use against metastore database</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>hive.metastore.warehouse.dir</name>
<value>hdfs://172.16.0.2:9000/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/operation_log/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/tmp/querylog/</value>
<description>Location of Hive run time structured log file</description>
</property>
<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.exec.local.scratchdir</name>
<value>/tmp/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
2.4.3,初始化metastore
连入mysql,创建hive数据库,初始化hive的metastor数据库如下
[root@master2 hive-1.2.2]# schematool -dbType mysql -initSchema
Metastore connection URL: jdbc:mysql://172.16.0.5:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: root
Starting metastore schema initialization to 1.2.0
Initialization script hive-schema-1.2.0.mysql.sql
Initialization script completed
schemaTool completed
2.4.4,运行
执行hive
[root@master2 hive-1.2.2]# hive
Logging initialized using configuration in jar:file:/usr/hive-1.2.2/lib/hive-common-1.2.2.jar!/hive-log4j.properties
hive>
>
创建库
hive> show databases;
OK
default
Time taken: 0.012 seconds, Fetched: 1 row(s)
hive> create database hive1;
OK
Time taken: 0.103 seconds
创建表
hive> use hive1;
OK
Time taken: 0.015 seconds
hive> create table test1(key string, value string);
OK
Time taken: 0.172 seconds
插入数据
hive> insert into test1 values ('weihao','27'),('yangtian','26');
查询
hive> select * from test1;
OK
weihao 27
yangtian 26
Time taken: 0.042 seconds, Fetched: 2 row(s)
load hdfs数据
创建文件test2
[root@master2 work]# cat test2
1001 weihao 18111111111
1002 zhangsan 18888888888
1003 lisi 17777777777
1004 wangwu 15555555555
上传hdfs
[root@master2 work]# hdfs dfs -copyFromLocal test2 /test2
创建表并加载数据
hive> create table test2(user_id bigint, username string, phone string) row format DELIMITED FIELDS TERMINATED BY '\t';
OK
Time taken: 0.335 seconds
hive> load data inpath 'hdfs://172.16.0.2:9000/test2' overwrite into table hive1.test2;
Loading data to table hive1.test2
Table hive1.test2 stats: [numFiles=1, numRows=0, totalSize=96, rawDataSize=0]
OK
Time taken: 0.443 seconds
hive> select * from hive1.test2;
OK
1001 weihao 18111111111
1002 zhangsan 18888888888
1003 lisi 17777777777
1004 wangwu 15555555555
Time taken: 0.286 seconds, Fetched: 4 row(s)
load本地数据,
load data命令后添加local表示从本地文件系统加载数据,load data可以添加overwrite命令标识是否覆盖源表。
hive> load data local inpath "/data/work/text" overwrite into table hive1.test1;
Loading data to table hive1.test1
Table hive1.test1 stats: [numFiles=1, totalSize=58]
OK
Time taken: 0.167 seconds
hive> select * from test1;
OK
zhangsan 26
lisi 13
wangwu 45
zhaoliu 25
lanal 45
fdsa 34
Time taken: 0.039 seconds, Fetched: 6 row(s)
(完)(^_^)