一句话:学习 Hive 有毛用?
那么解释一下 毛用:
* 操作接口采用类 SQL 语法,提供快速开发的能力(不会 Java 也可以玩运算)
* 避免了去写 MapReduce,减少开发人员的学习成本(MapReduce 运算写断手)
* 扩展功能很方便
* 数据库不等同于数据仓库
数据库有很多,例如:mysql,oracle,DB2,sqlserver,但 hive 并不是数据库.
Hive 是 FaceBook 的开源项目,Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件,映射成一张表,并提供类似 SQL 查询功能, hive 的 HQL 语言(类似 SQL)可以将任务翻译成 Java 语言并直接在 MapReduce 上运行,支持 Yarn 资源调度.hive 一般不会直接接入到业务中使用,从某种意义上来讲呢,相当于一个 Hadoop 的客户端,Hive 在集群中并不需要每一台服务器都安装 Hive.
** Hive 的一些重要特性
* 本质:将 HQL 转化成 MapReduce 任务
* 底层存储使用 HDFS
* 适合离线批量处理,延迟比较大(用于周期性的执行分析),不适合用于在线的需要实时分析结果的场景
* Hive 体系结构
* 用户接口: Client
* 终端命令行 CLI -- 主要的一种使用方式,JDBC 的方式一般不使用,比较麻烦.
* 元数据:metastore
* 默认 apache 使用的是 derby 数据库 (只能有一个客户端使用),CDH 使用 postgreDB
* 元数据包括:表名,表所属的数据库(默认是 default),表的拥有者,列 / 分区字段,表的类型(是否是外部表),表的数据所在目录等,并没有存储 Hive 表的真实数据
* 使用 HDFS 进行存储
* 使用 MapReduce 进行计算
* 解析器: 解析 Hql 语句
* 编译器: 把 sql 语句翻译成 MapReduce 程序
* 优化器: 优化 sql 语句
* 执行器: 在 yarn 平台运行 MapReduce 程序
* Hive 在 Hadoop 中的位置,如图:
** Hive 部署
* 安装 JDK(此步骤省略,请查看之前内容)* 安装 Hadoop
此步骤要确保 Hadoop 可以正常使用,比如上传文件,运行 jar 任务等等
* 安装 Hive
Hive 下载地址传送门:链接:http://pan.baidu.com/s/1eSFuTWm 密码:k5xo
安装过程涉及命令:
$ tar -zxf apache-hive-0.13.1-bin.tar.gz -C /opt/modules/
进入 Hive 根目录下的 conf 目录,进行如下操作,到这个阶段应该无需解释了吧?
$ cp -a hive-env.sh.template hive-env.sh,如图:
$ cp -a hive-default.xml.template hive-site.xml,如图:
* 修改 hive-env.sh
如图:
JAVA_HOME=/opt/modules/jdk1.8.0_121
HADOOP_HOME=/opt/modules/hadoop-2.5.0
export HIVE_CONF_DIR=/opt/modules/apache-hive-0.13.1-bin/conf
* 安装 mysql,依次涉及命令:
* 成功安装之后启动 mysql 服务
$ su - root
# yum -y install mysql mysql-server mysql-devel
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum -y install mysql-community-server
# systemctl start mysqld.service,centOS7 以下版本使用:# service mysqld start
注意,初次安装 mysql 是 root 账户是没有密码的
* 设置密码
方案一:
# mysqladmin -uroot password '123456'
方案二:
* 给用户授权
# mysql -uroot -p
mysql> update user set password=password("123456") where user='root';
mysql> flush privileges;
mysql> exit;
注释:
# mysql -uroot -p
mysql>grant all on *.* to root@'z01' identified by '123456' ;
mysql> flush privileges;
mysql> exit;
(grant 权限 1, 权限 2,... 权限 n on 数据库名称. 表名称 to 用户名 @用户地址 identified by '连接口令';)
* mysql 数据库默认只允许 root 用户通过 localhost/127.0.0.1 来登录使用
* 上面带有 grant 的那条语句中:
all:表示所有权限;
*.*:表示数据库. 数据表;
root:表示授权给哪个用户,用户名可以任意指定,如果没有会自动创建;
'z01' :授权给哪台主机
'123456':授权给用户来登录的密码
(尖叫提示:如果你需要让所有的分布式机器都有权限访问 mysql,在此例子中,还需要执行 grant all on *.* to root@'z02'identified by'123456'; 以及 grant all on *.* to root@'z03'identified by'123456'; 留意 @符号后边的主机名)
* 配置 hive-site.xml
打开之后,该文件中显示的全部为默认的配置,其中如下 4 项做出相应修改:
* 安装驱动包
涉及命令:
操作如图所示:
$ tar -zxf mysql-connector-java-5.1.27.tar.gz -C /opt/modules
$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/
* 修改目录权限
首先确保 HDFS 正常运行,之后涉及命令:
(注意:/tmp 存放临时文件;/user/hive/warehouse 具体的 Hive 仓库目录)
$ bin/hadoop fs -chmod g+w /tmp
$ bin/hadoop fs -chmod g+w /user/hive/warehouse
没有对应目录,则创建对应目录
* 启动 Hive 客户端
$ bin/hive,如图:
* 中场小结:hive,hadoop 的关系,mysql 三者之间的关系
* hive 数据存储在 HDFS 的 / user/hive/warehouse 目录中,我们通过查看 hive-site.xml 中的 hive.metastore.warehouse.dir 属性即可发现如图:
* Hive 基本操作
* 显示所有数据库
hive> show databases;
* 创建数据库语法:
hive (default)> create database 数据库名称 ;
例如:
创建一个数据库 d1:
hive> create databases d1;
* 删除数据库
hive (default)> drop database 数据库名称 ;
* 进入 d1 数据库
hive> use d1;
* 创建表语法:
例如:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type ...)]
[PARTITIONED BY (col_name data_type , ...)]
[ROW FORMAT row_format]
[LOCATION hdfs_path]
[AS select_statement];
在当前数据库中创建表 staff,其中包含字段:id,name,sex
hive> create table staff(id int, name string, sex string) row format delimited fields terminated by '\t';
(注意:最后那一句英文表明数据字段之间用 table 制表符分割)
* 格式化输出表 staff 的结构
hive> desc formatted staff;
如图:
* 向表中插入数据语法:load data local inpath '文件路径' [overwrite] into table 数据库名. 表名 ;
解释:
** local 表示加载本地文件
** 文件加载模式:append 追加(默认使用)或 overwrite 覆盖
** load data 加载只是进行了简单的位置转移(如果 load 一个 HDFS 上的数据,比如从 HDFS 中的一个位置移动到 HDFS 中的另一个位置,会发生数据转移,转移之后,原来目录的数据就没有了,如果是从 local 到 HDFS,则不会删除原来的数据)
** 加载数据过程中不会去判断字段分隔符是否正确,只有在用户查询数据的时候, 会发现错误
例如:
首先,在 hive 的本地安装目录下,创建文件 staff.txt,该文件内容如下:
接着,将本地文件中的数据导入到 table 中,使用命令:
hive> load data local inpath 'staff.txt' into table staff;
最后查看导入后的效果
hive> select * from staff;
如图:
* 修改 Hive 日志信息
** 重命名配置文件
$ mv hive-log4j.properties.template hive-log4j.properties
** 创建文件夹
$ mkdir logs
** 编辑 hive-log4j.properties 文件,并修改日志存储目录
hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
如图:
* 设置 hive 在操作时是否显示数据库名称和列名
如图:
改为 true 即可
* Hive 任务
hive 任务有两种:
走 mapreduce:
hive (default)> select name from d1.staff;
如图:
不走 mapreduce:
hive (default)> select * from d1.staff;
如图:
* Hive 的调试
在调试 Hive 任务时,一般会加入如下参数:
$ bin/hive --hiveconf hive.root.logger=DEBUG,console
* mysql 数据库备份与还原
备份与还原的数据库名称均为:metastore,如图:
** 备份:
$ mysqldump -uroot -p metastore > metastore.sql
如图:
** 还原:方案 1:
$ mysql -uroot -p metastore < metastore.sql
如图:
方案 2:
* 拓展:mysql 存储中 innodb 和 MYISAM 区别
$ mysql -uroot -p
mysql> source /path/metastore.sql ;
InnoDB 和 MyISAM 是许多人在使用 MySQL 时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持.MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快,但是不提供事务支持,而 InnoDB 提供事务支持以及外部键等高级数据库功能.
** innodb
新版本 5.5 + 中默认使用;
.frm 结构文件;
.ibdata1 数据文件;
** MYISAM
/var/lib/mysql;
.frm 结构文件;
.MYI 索引文件;
.MYD 数据文件;
* Hive 命令两个重要参数
执行 sql 语句:-e
$ bin/hive -e "select * from d1.staff",如图:
执行 sql 语句文件:-f
首先创建一个带有 sql 语句的文件 p1.hql,如图:
$ bin/hive -f p1.hql,如图:
* Hive 历史命令的存放
存放位置:~/.hivehistory
查看该文件,如图:
* Hive 中临时设置配置并生效
例如:hive > set hive.cli.print.current.db=true;
(注意,此方式为临时生效)
* 总结
本节主要讲解如何配置并使用 Hive,并观察 hive 任务在 mapreduce 中的运行以及结果的输出.
个人微博:http://weibo.com/seal13
QQ 大数据技术交流群(广告勿入):476966007
来源: http://www.bubuko.com/infodetail-2459058.html