参考http://www.hainiubl.com/topics/103
Hive介绍
Hive是一个机遇Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据。提供了类似于SQL语法的HQL语句作为数据访问接口。
Hive优缺点
优点:
- Hive使用类SQL查询语法,最大限度的实现了和SQL标准的兼容
- 使用JDBC接口/ODBC接口,开发人员更易开发应用
- 以MapReduce作为计算引擎、HDFS作为存储系统,为超大数据集提供计算和扩展能力。
- 有统一的元数据管理(Derby、MySql等),可以与Pig和Spark共享
缺点:
- HQL表达能力有限,不支持UPDATE、非等值连接、DELETE、INSERT单条等
- Hive自动生成MapReduce作业,HQL调优困难
- 粒度较粗,可控性差
Hive与传统数据库的区别
- 存储文件的系统不同:Hive使用的是HDFS,传统数据库使用的是服务器本地的文件系统
- Hive使用mapreduce做运算,比传统数据库相比运算规模要大很多
- 关系数据库是为了实时查询的业务进行设计的,Hive是为了海量数据做数据挖掘设计的,实时性很差。实时性的区别导师Hive的应用场景和关系数据库有非常大的不同
- Hive很容易扩展自己的存储能力和计算能力,而关系型数据库在这方面比数据库差很多
Hive组成
Hive由服务端组件和客户端组件构成。
服务端组件包括:
- Driver组件:包括Compiler、Optimizer和Executor。作用是将HQL语句进行解析,编译优化,生成执行计划。然后调用底层的mapreduce计算框架。
- Metastore组件:元数据服务组件,这个组件存储Hive的元数据。Hive元数据存储在关系型数据库中,Hive支持Derby和MySql。Hive支持把Metastore服务独立出来,安装到远程的服务器集群中,从而解耦Hive服务和Metastore服务,保证Hive运行的健壮性。
- Thrift服务:Thrift是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive集成这项服务可以用不同的编程语言调用Hive接口
客户端组件:
- CLI:Command Line Interface命令行接口
- JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在Thrift客户端之上的。
- WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI(Hive Web Interface),使用前要启动HWI服务。
Hive安装
环境MacOS
安装MySql
这一步我的系统之前已经安装过了MySql。
解压配置环境变量
- 将bin压缩包解压至/usr/local/路径
- 配置环境变量/etc/profile
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=/usr/local/hive/conf
本地环境安装hive
- mysql建立新的用户(注意我使用的是mysql8.0,在grant all privileges语句中可能有版本差异)
1
2
3
4
5
6#命令行进入mysql
mysql -u root -p
#数据库用户配置
create user 'hive'@'localhost' identified by '000000';
grant all privileges on *.* to 'hive'@'localhost' with grant option;
flush privileges; - 下载Mysql-connector-Java 8.0 并解压放到hive/lib目录
- 配置hive-site.xml
注意以下的配置需要自行搜索寻找,不在同一个地方1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46<!-- 数据库地址 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive</value>
<description>JDBC connect string for a JDBC metastore</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>hive</value>
<description>Username to use against metastore database</description>
</property>
<!-- 数据库密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>000000</value>
<description>password to use against metastore database</description>
</property>
<!-- 下面--四个---的配置都是临时存储目录,自己新建然后填上绝对路径-->
<!-- 我设置的是/Users/shaoguoliang/hiveIOtmp-->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/Hadoop/hive/iotmp</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/Hadoop/hive/iotmp</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/Hadoop/hive/iotmp</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/Hadoop/hive/iotmp</value>
<description>Location of Hive run time structured log file</description>
</property> - 配置hive-env.sh,从template复制文件到本地目录
1
2# 在末尾添加,其实不添加也可以
export HIVE_CONF_DIR=/usr/local/hive/conf - 配置hive-log4j.properties,从template复制文件到本地目录
- 在/hive/bin目录下,新建元数据schema
./schematool -initSchema -dbType mysql
这里出现了问题是:
- 报错出现找不到mysql Driver,发现是解压之后要把jar包包含在/hive/lib路径下
- 报错出现找不到hive database,通过mysql创建
create database hive
- 启动hadoop,启动mysql
注意这里一定要确认hadoop是否成功启动,是否成功启动namenode和datanode(单机模式)
如果发现namenode挂了,去查看Hadoop HDFS 初始与操作
在hdfs-site.xml中添加1
2
3
4
5
6
7
8
9
10
11<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
<description>namenode上存储hdfs名字空间元数据 </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
<description>datanode上数据块的物理存储位置</description>
</property> - 在hive/bin下运行hive