Hive和数据库
Hive有自己的语言,叫HQL(近似于SQL),Hive是基于Hadoop的一个数据仓库,不是数据库.
1. 像mysql,oracle之类的数据库,他们更关注业务交易处理(OLTP),追求交易的速度,交易完整性,数据的一致性等。
2. 数据仓库更关注数据分析层面(OLAP),强调数据分析的效率,复杂查询的速度,数据之间的相关性分析,所以使用的多维模型,从而提高数据分析的效率。
3. Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
4. Hive必须要依赖一个数据库,因为Hive要做一个元数据到原来的映射,每一个原本的数据都需要存到数据库的,假如相对于的数据库被删了,那Hive就没了映射的源头了,就没法用
Hive的优点
1. 操作接口采用类SQL语法,提供快速开发的能力。
2. 避免了去写MapReduce,减少开发人员的效率和心灵上的创伤
3. Hive的执行延迟比较高,因此hive常用于数据分析,对实时性要求不高的场合
4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高
5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
Hive的缺点
1. 完全不会MR的话,无法处理性能的优化
2. MR太慢,太笨重...
3. Spark Core强于MR100倍...Spark SQL底层走的Spark Core,它可以对接Hive...
4. 不适合关系型处理,不适合实时查询和行情分析,延迟比较高
Hive的架构
Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。
1. 用户接口:Client 2. 元数据:Metastore 3. 驱动器:Driver
Hive解决了什么问题
Hive解决了大数据的查询功能,让不会写MR的人也能使用MR,它的本质就是将HQL转换为MR. 它的底层走的是MR,写MR效率低,而且痛苦,Hive的出现就为JAVAEE的兄弟带来了捷径和福音.
Hive环境搭建
Hive是MapReduce的客户端,因此不需要在每个节点上都配置。在操作Hive的同时,需要将Hadoop的HDFS开启,Yarn开启,MapReduce配置好。
1. hive官网下载hive后,将hive解压后,进入hive,将hive-env.sh.*修改为hive-env.sh.
2. 编辑hive-env.sh, 在里面找到JAVA-HOME,并配置安装在集群上java.home的路径
3. 找到export HIVE_CONF_DIR,在其后面配置hive下面的conf的路径
4. 在HDFS上创建/tmp和user/hive/warehouse两个目录,并改变他们的组的权限
5. 如果你想远程提供元数据表的服务,就在hive-site.xm配置hive.metastore属性
Hive的基本操作
注: 要操作Hive的话,要启动HDFS和Yarn
启动hive1: bin/hive
启动hive2: 如果在hive-site.xml里配置了hive.metastore,那启动:bin/hive --service metastore 再bin/hive
查看数据库: show databases; 切换数据库: use 数据库名 显示数据库中的表: show tables;
创建表: create table employee(id int, name string); 查看表的结构: desc employee
向表中插入数据: insert into student values(1000,"ss"); 查询表中数据: select * from student;
将本地文件导入hive: load data local inpath '/opt/module/datas/student.txt' into table employee;
MySQL的安装
hive为什么要依赖某一个数据库: 因为hive要做一个原本的数据到字段的映射,并且每一个原本的数据它所存储的信息和序列都要保存到数据库中进行说明,而原数据保存在mysql的数据库中,叫做metastore,一旦metastore被删掉了,hive仓库就没有数据了.
mysql在linux上要安装三个:客户端,服务器,还有一个连接的
前面两个默认安装好了...
1. 我安装的是这个版本mysql-connector-java-5.1.27 cd进入里面
2. 将里面默认提供的唯一的jar包cp到hive的lib目录下.
3. 启动hive,就可以创建表了,且数据映射到mysql里面了
4. mysql -uroot -p密码, 查看数据库,就可以看到metastore数据库了,如果不小心drop了,hive就没有数据了...GG
Hive之数据导入
基本加载数据
加载本地文件到hive: load data local inpath '/opt/module/datas/student.txt' into table default.student;
加载HDFS文件到hive中: dfs -put /opt/module/datas/student.txt /user/admin/hive;
通过查询语句向表中插入数据
插入数据: insert into table student partition(month='123') values('1004','wangwu');
用location指定加载数据路径
上传数据到hdfs上: dfs -put /opt/module/datas/student.txt /user/hive/warehouse/student5;
import数据到指定hive表中: import table student2 partition(month='201709') from '/user/hive/warehouse/export/student';
Hive之数据导出
insert导出到本地: insert overwrite local directory '/opt/module/datas/export/student' select * from student;
将查询的结果格式化导出到本地: insert overwrite local directory '/opt/module/datas/export/student1' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n' select * from student;
将查询的结果导出到HDFS上(没有local): insert overwrite directory '/user/admin/hive/warehouse/student2'ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY '\n'select * from student;
Hadoop命令导出到本地: dfs -get /user/hive/warehouse/student/month=201709/000000_0 /opt/module/datas/export/student3.txt;
hive shell 命令导出: bin/hive -e 'select * from default.student;' > /opt/module/datas/export/student4.txt;
export导出到HDFS上: export table default.student to '/user/hive/warehouse/export/student';
待续..