Hive Day01
hive
数据仓库
产生的背景
处理结构化数据;数据量小的时候,使用sql是最好的解决方案;但是一旦数据量变大,那么此时就需要使用Mapreduce了,而Mapreduce开发的成本高;用人成本;时间成本;
此时如果有一个组件,提供sql编程和分布式运行计算程序;name就是hive了;
hive就是对外提供hql编程,将hql转换为Mapreduce任务的;
hive底层数据存放在hdfs上;计算使用的是Mapreduce;hive就相当于对hadoop做了一层上层封装;hive可以看做是hadoop的另外一种模式的客户端;
hive可以极大的降低结构化数据分析的成本;
对于半结构化或非结构化的数据;hive是不可以分析的
hive的介绍
- Hive由 Facebook实现并开源;也是apache基金会的一个顶级项目;
- 是基于hadoop的一个数据仓库工具;
- 可以将结构化的数据映射为一张数据库表;在hive中指定一份结构化的数据,就可以用hive中的表进行关联;数据文件的一行数据对应---hive表中的一行;数据文件中的一个字段---hive表中的一列;
- 提供HQL查询功能; hive对外提供hql查询;
- 底层数据是存储在HDFS上; hive的原始数据存储在HDFS的;在HDFS上有一个hive的默认目录;称为hive的家目录;hive中存储所有的表数据就会默认存储在hive的家目录下;
- Hive的本质是将SQL语句转换为MapReduce任务运行;在hive底层会保存很多map和reduce模板;hive最后将hql语句翻译成Mapreduce任务;
- 使不熟系Mapreduce的用户很方便的利用HQL处理和计算HDFS上的数据;处理和计算HDFS上的结构化的数据;
- 适用于离线的批量的数据计算。依赖于hadoop
数据库与数据仓库的比较
- 概念
- 数据仓库:更倾向于数据管理;管理的数据可以不是存储在自己本地的数据;通常用于大批量的数据管理;
- 数据库:存储的数据一般在自己的本地;通常用于存储小批量的数据;一般用于存储结果数据
- 使用:
数据仓库: hql, 方言版sql
数据库:mysql 标准sql;nosql 数据库 自己的一套shell - 应用场景上:
OLAP:on line analysis processing 联机分析处理 (查询) 数据仓库
OLTP:on line transaction Processing 联机事务处理 (增删改) 数据库 - 模式上
数据仓库:hive, 写模式
数据库:关系型数据库一般都是写模式;分布式的数据库的模式不确定;
hive中不支持事务的;在hive中甚至不支持update,delete操作;支持insert,但是性能比较低。
hive的优缺点
优点:延展性;hive支持自定义函数
缺点:
- 不支持事务
- 不支持行级别的update和delete操作;但是支持insert操作,性能低
- 查询的延时性很高;不适合实时;
hive的架构
- 用户接口层:
- CLI shell访问
- ODBC/JDBC 代码访问
- WEB UI 网页访问,一般不用;因为配置复杂;界面不友好;
- Thrift Server:跨语言服务层;将各个语言最终翻译成hive识别的操作符;
- 元数据库层
- 元数据库存储的是用于描述hive中的库或表或表字段的信息的数据;
- hive的元数据是结构化数据存储的;hive的元数据存储在关系型数据库的;默认存储在Derby的数据库的;一般情况下我们会改为mysql;
- 元数据存储的是 表名,表的字段,字段的顺序,字段的类型
- 原始数据存储的是 表中的数据;
- 驱动层
- 解释器:是将HiveSQL语句转换为抽象语法树
- 编译器:将语法树编译为逻辑执行计划 初步构思
- 优化器:对逻辑执行计划进行优化 将相同的任务进行合并;
- 执行器:调用底层的运行框架执行逻辑执行计划;
hive的安装
安装准备: jdk,hadoop,mysql
安装节点:一个节点
安装的版本:hive-2.3.2版本; 1.2.1版本;
下载安装包的镜像站:
http://mirror.bit.edu.cn/apache/hive/
http://mirrors.hust.edu.cn/apache/hive/
http://mirrors.shu.edu.cn/apache/hive/
http://mirrors.tuna.tsinghua.edu.cn/apache/hive/
元数据使用自带的derby数据库;
-
上传安装包
-
解压
-
配置环境变量
[hadoop@hdp02 apps]$ cat /etc/profile.d/hive.sh export HIVE_HOME=/home/hadoop/apps/hive export PATH=$HIVE_HOME/bin:$PATH [hadoop@hdp02 ~]$ . /etc/profile.d/hive.sh [hadoop@hdp02 ~]$ echo $HIVE_HOME /home/hadoop/apps/hive -
为了方便集群的版本升级。可以先创建软链接
[hadoop@hdp02 ~]$ ln -s apache-hive-2.3.2-bin hive -
元数据库初始化
schematool -dbType derby -initSchema
SchemaTool completed证明初始化成功
注意:元数据初始化不成功的时候不要启动hive;
初始化完成后会发现在初始化的目录下,会多几个文件
derby.log derby的日志文件
metastore_db 元数据库文件 -
启动
[hadoop@hdp02 apps]$ hive which: no hbase in (/home/hadoop/apps/hive/bin:/usr/lib64/qt-3.3/bin:/usr/java/jdk1.8.0_191-amd64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/apps/hadoop-2.7.6/bin:/home/hadoop/apps/hadoop-2.7.6/sbin:/home/hadoop/bin) SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Logging initialized using configuration in jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-common-2.3.2.jar!/hive-log4j2.properties Async: true Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. hive> # hive的客户端操作界面,可以执行hive的shell;对于hive来说sql的绝大多数是可以使用的 -
异常;直接启动会报错,元数据报错;
启动之前需要初始化元数据库;
这个方式在哪一个目录初始化,在哪一个目录启动,没有问题;
一旦切换目录;就报错;
原因是derby这种方式在启动的时候只会读取启动目录下的元数据库;切换目录后启动目录下没有元数据库信息了,就会报错;
缺陷:元数据信息无法共享;本目录只能访问本目录下元数据信息;只适合单用户使用;不适合多用户使用;
元数据库为mysql的安装方式
-
安装mysql;并配置好mysql的用户名和密码;
yum安装mysql
配置yum源: 在/mnt创建目录cdrom
挂载:sudo mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
配置本地yum源
cd /etc/yum.repo.d/sudo rename .repo .repo.bak * sudo cp CentOS-Media.repo.bak CentOS-Media.repo vim CentOS-Media.repo file:///mnt/cdrom # 本地文件路径 sudo yum clean all sudo yum repolise安装mysql
sudo yum install -y mysql-server
启动mysql
sudo service mysqld start修改mysql的用户名和密码;密码为空
mysql -uroot -pdelete from user where user=""; update user set host="%" where host="localhost"; update user set password=PASSWORD("123456") where user="root"; flush privileges; exit;重启mysql服务
-
上传hive的安装包
-
解压hive的安装包
-
修改环境变量
-
修改hive配置文件
/home/hadoop/apps/hive/conf touch hive-site.xml [hadoop@hdp02 conf]$ cat hive-site.xml <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value> <description>JDBC connect string for a JDBC metastore,myhive表示存储hive元数据在mysql中的数据库名</description> <!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost --> </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>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property> </configuration> -
将mysql的驱动包放在hive的依赖库中;lib目录下
-
初始化hive
[hadoop@hdp02 lib]$ schematool -dbType mysql -initSchema -
启动hive
[hadoop@hdp02 lib]$ hive which: no hbase in (/home/hadoop/apps/hive/bin:/usr/lib64/qt-3.3/bin:/usr/java/jdk1.8.0_191-amd64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/apps/hadoop-2.7.6/bin:/home/hadoop/apps/hadoop-2.7.6/sbin:/home/hadoop/bin) SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Logging initialized using configuration in jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-common-2.3.2.jar!/hive-log4j2.properties Async: true Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. hive>
hive的命令
create database test;
use test;
create table stu(course string ,name string score int) row format delimited fields terminated by ',';
row format 行格式化
delimited 分界
fields terminated 列分界符
lines terminated by '\n' 行分隔符;
本地数据加载到表中
load data local inpath "/home/hadoop/tmpdata/score" into table stu;


浙公网安备 33010602011771号