赞
踩
上图为Hive的体系架构图,主要由如下几部分组成
用户接口:Client
Cli(Command-line shell),及shell 命令行,hive1的客户端,hive server2 提供了新的命令beeline
JDBC/ODBC,通过Java来访问hive,与传统数据库JDBC的方式类型,比如我们使用Java通过JDBC访问操作MySQL
WebUI,浏览器中访问hive
元数据:metastore
Hive 将元数据存储在数据库中(metastore),数据库可以为关系型数据库中的任意一种,元数据包括:表名、表所属数据库、表的拥有者、列/分区字段、表的类型、表数据所在目录。
驱动器:driver
包含:解析器、编译器、优化器、执行器
完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成,生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行
Hadoop
使用hdfs进行数据存储,运行在yarn上,使用mapreduce进行计算
Hive 是构建在Hadoop之上的一个数据仓库,实际工作中,我们的Hadoop是肯定是集群,但Hive我们只需要装在一台服务上即可,元数据默认存放在Derby中,Derby是一个单用户,使用起来不是很方便,建议我们自己装一个mysql数据库,专门用于存放hive的元数据信息。
生产环境中与测试环境不相同的之处就是mysql用的是主备,当一台mysql服务挂掉了,通过某种机制它会自动切换到另一台,其实这样做的好处就是为了容错,保证高可用,防止hive的元数据丢失
hive的优缺点
优点:
容易上手、易用,比用MapReduce编程简单很多
数据离线处理,比如日志分析,海量数据结构化分析
底层基于hadoop,易于扩展,支持自定义函数UDF
缺点:
Hive执行延迟比较高,不适合实时查询
Hive优势在于处理大数据集,对于小数据集没有优势
Hive中的元数据默认存放在Derby中,Derby是单用户的,使用起来不方便,我们使用MySQL来存储Hive的元数据信息,元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。
直接使用yum -y install 命令安装mysql是无法安装mysql的高级版本, 需要先安装带有可用的mysql5系列社区版资源的rpm包,去mysql的官网下载即可
MySQL官网:https://dev.mysql.com/downloads/file/?id=470281
MySQL安装教程官网:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
下载完成后使用xshell上传到linux,输入如下命令安装
$ sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
安装完成后,查看mysql安装版本列表
$ yum repolist all | grep mysql
安装mysql,只需要安装mysql-community-server即可,yum会自动检测安装依赖包
$ sudo yum -y install mysql-community-server
安装完成后,启动mysql
$ sudo systemctl start mysqld
mysql安装完成后会有一个初始的密码,输入如下命令查看
$ sudo grep 'temporary password' /var/log/mysqld.log
使用刚刚查看到的密码登录
$ mysql -uroot -p
修改密码
注意,该版本的MySQL对用户密码安全性有所加强,所以设置的密码必须包含至少一个数字、一个大写字母、一个小写字母和一个特殊符号的组合,密码长度至少8个字符。
ALTER USER 'root'@'localhost' IDENTIFIED BY '输入你的密码';
修改完成后,输入exit退出shell界面,使用新密码登录即可
从官网下载hive的安装包,官网地址:http://apache.fayea.com/hive/
笔者下载版本为2.3.0,下载完成后上传到linux,输入如下命令解压
$ tar -zvxf apache-hive-2.3.0-bin.tar.gz
配置hive-site.xml文件
进入hive的conf目录下,拷贝文件hive-default.xml.template命名为hive-site.xml
$ cd /home/hadoop/hive
$ cp hive-default.xml.template hive-site.xml
创建hive的临时目录
$ mkdir tmp
hive-site.xml配置如下,更多请参考hive 官网
<configuration> <property> <name>hive.exec.local.scratchdir</name> <value>/home/hadoop/hive/tmp/hive</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/home/hadoop/hive/tmp/${hive.session.id}_resources</value> <description>hive下载资源的存储目录</description> </property> <property> <name>hive.querylog.location</name> <value>/home/hadoop/hive/tmp/hive</value> <description>hive结构日志存储目录</description> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/home/hadoop/hive/tmp/hive/operation_logs</value> <description>hive的操作日志目录</description> </property> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> <description>hive用于存储不同阶段map/reduce的执行计划及存储中间输出结果的目录</description> </property> <property> <name>hive.scratch.dir.permission</name> <value>700</value> <description>hive访问hadoop文件权限设置</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>P@ssw0rd</value> <description>元数据存储的数据库的密码</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>元数据存储数据库的用户名</description> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive_metadata?createDatabaseIfNotExist=true&characterEncoding=utf8</value> <description>元数据存储的数据库的url</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>元数据存储的数据库的驱动</description> </property> <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> <description>开启自动创建(生产环境中不推荐使用)</description> </property> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <!-- 配置hive的事务 start --> <property> <name>hive.optimize.sort.dynamic.partition</name> <value>false</value> </property> <property> <name>hive.support.concurrency</name> <value>true</value> </property> <property> <name>hive.enforce.bucketing</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> <property> <name>hive.in.test</name> <value>true</value> </property> <!-- 配置hive的事务 end --> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> </configuration>
注意:在启动前需要将mysql的驱动包复制到hive安装目录的lib目录下,否则在启动时,会报如下错误
DatastoreDriverNotFoundException: The specified datastore
driver (“com.mysql.jdbc.Driver”) was not found in the CLASSPATH
笔者安装的hive版本为2.3.0,既支持hive1,也支持hive2,hive1和2的启动是不一样的,分别如下
hive1
$ schematool -dbType mysql -initSchema # 第一次启动时执行,进行初始化
$ hive
hive2
$ hiveserver2
$ beeline -u jdbc:hive2://
启动成功后登录mysql,可以看到创建了一个数据库hive_metadata(在hive-site.xml参数javax.jdo.option.ConnectionURL中配置)
查看数据库hive_metadata
hive启动成功后,查看hive的临时目录下会生成如下文件
$ cd /home/hadoop/hive/tmp/
输入hive(hive1)进入客户端,查看所有数据库,默认的数据库default
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。