Hive入门(大数据)

Hive介绍

在这里插入图片描述
官网:http://hive.apache.org

  • (官方简介)Hive是数据仓库工具,使用sql的方式来读写和管理存储在HDFS中的海量数据。可以将结构投影到已经存储的数据上(先有数据再创建表[外部表]),可以使用命令行工具或者JDBC来操作hive
  • hive是一个基于hadoop的数据仓库工具,他使用sql的方式来处理海量数据,解决了程序猿使用MapReduce来处理海量数据遇见的问题。学习成本较低,内置了非常丰富的函数库供开发者使用,如果现有函数不能满足用户的需求,hive还支持自定义函数(UDF)

使用MapReduce来处理海量数据遇到的问题:

  1. MapReduce开发调试比较复杂,不太适合要求快速得到结果的工作场景。
  2. hadoop使用java开发,MapReduce天生对java支持最好,对其他的开发语言使用者不够友好
  3. 想要开发一个优秀的MR程序,必须对hadoop底层有一定的了解并且熟记大量的API
    Hive职责图
  • hive优点
    避免了MR繁琐的开发调试过程,Hive自动将我们输入的HQL编译为MR运行
    HQL这种类SQL语言对于任何开发语言的程序员来说都比较友好。
    我们不需要对Hadoop底层有太多的理解,也不用记忆大量的API就能实现分布式数据的处理
    Hive也提供了自定义函数的方式来补充自身函数库可能存在的不足。即编写JAVA代码来实现复杂的逻辑并封装为UDF(自定义函数)来供我们重复使用。
    数据仓库

hive的安装

hive底层基于hadoop。所以安装hive必须要有hadoop的环境
在这里插入图片描述

  1. 上传hive安装包到指定位置,当前文章目录在 /home/app
  2. 大环境下(配置JAVA_HOME和HADOOP_HOME)启动hadoop,Jps查看 DataNode、NodeManager、NameNode、SecondaryNameNode、 ResourceManager 五个进程,有则说明启动hadoop成功。
  3. 在 /home/app/apache-hive-2.3.6-bin/conf 路径下添加hive的配置文件 hive-site.xml,自动生效。
如果使用hive默认的derby嵌入关系数据库,跳过3、4、5步骤
vim hive-site.xml 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <property>
  <name>hive.default.fileformat</name>
  <value>TextFile</value>
</property>
<property>
  <!--端口改为你自己的端口,这里是连接数据库中hive数据库-->
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</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>
  <!--连接MySQL的用户名-->
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>
<property>
  <!--连接MySQL的密码-->
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>root</value>
  <description>password to use against metastore database</description>
</property>
</configuration>
  1. 因为上个步骤需要jdbc的驱动包支持,所以需要在 …/lib 包下上传mysql的驱动包(mysql-connector-java-5.1.38-bin.jar)
  2. 进入数据库客户端,对mysql进行权限开放
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;

flush privileges;    
  1. 进入bin目录下初始化
cd ../bin
./schematool -dbType mysql -initSchema

当出现 Initialization script completed证明初始化成功,可以通过 ./hive 进入hive客户端

./hive

执行hive命令:show database出现default证明进入hive客户端成功。(成功生成一个RunJar进程)
进入hive客户端内

  • hive客户端命令(非常类似mysql)
create database jtlog;
use jtlog;
create table tb_book(id int, name string); //没有主键,自增,字符编码设置,外键等(string:char)
show tables;
insert into table tb_book values(1,'mysql drop and run'); //单双引号均可(这样插入很慢)
select * from tb_book; //单独id或者name查询也与mysql一样
drop table tb_book;
drop database test;//hive不支持行级别操作,insert其实是追加的一个文件(因为HDFS不支持行级别)

hive的运算流程

三者关系

  1. 查看hdfs中存储的数据:http://hadoop01:50070/explorer.html#/user
  2. 默认database会存储在HDFS的 user/hive/warehouse/目录下,以数据库名.db的方式来命名,是一个文件夹。可通过修改配置文件修改
  3. table在HDFS里是以文件夹的形式存在对应数据库文件夹下,名称以原表名命名。
  4. hive中表的数据会以文件的形式存放在对应的表目录中
    在这里插入图片描述
    在这里插入图片描述
  5. 在执行insert操作时,hive将sql翻译成mapReduce执行。并且插入insert操作时效率特别低下(实际生产中基本不会使用这种方式插入数据,一般会使用load的方式直接批量加载数据)。
    在这里插入图片描述
    在这里插入图片描述
  6. load方式上传数据到HDFS,效率特别高
    如果想使用load data 的方式上传数据,需要指定文件的分隔符(常见‘逗号’和’空格‘)
    在这里插入图片描述
                                          行  格式化       以 制表符 结尾的行格式分隔字段
create table tb_book(id int,name string) row format delimited fields terminated by '\t';
load data local inpath '/home/data/book1.txt' into table tb_book;
该方式上传本地文件中的数据到HDFS,效率特别块。

hive的元数据只维护到最后一级目录,具体目录下有哪些文件元数据中没有记录,也就是说,hive只认目录结构,文件夹中有哪些内容,不管,也是说通过hdfs命令put到hive拥有表下的文件,也认

表的分类

  • 内部表(托管表 managed_table):先有表后有数据
 创建:create table tb_book1(id int,name string) row format delimtied fields terminated by '\t';
 加载数据:load data local inpath '/home/data/book1.txt' into table tb_book1;
  • 外部表(external_table):先有数据再创建表
hadoop fs -mkdir /book2
hadoop fs -put book2.txt /book2  //在HDFS上的book2目录下放入book2.txt文件
创建:create external table tb_book2(id int,name string) row format delimtied fields terminated by '\t' location '/book2';
创建完毕,select tb_book2下的数据就可以查询到了(前提book2.txt文件能切割成id name格式)

区别:删除表时,内部表的元数据(mysql中映射)和表数据(HDFS中数据)都会被删除,而外部表的元数据会被删除,表数据原本就不属于hive所以不会被删除。

  • 分区表
    hive作为数据仓库实现面向主题的唯一方式就是通过分区表来实现
创建分区表                原文档分割列                      自定义主题信息绑定(该字段不属于列,但可以通过该字段查询)
create table tb_par (id int,name string) partitioned by (country string,gender string)row format delimited fields terminated by '\t';
按分区格式加载本地 /home/data/CHN_male.txt中的数据到HDFS                                 自定义绑定信息
load data local inpath '/home/data/CHN_male.txt' into table tb_par partition(country='CHN',gender='male');

原磁盘数据
HDFS中数据

  • 通过hadoop命令创建相同的目录时并录入数据,查询表下的数据时根本查不到,原因是mysql中没有相关元数据记载。
hadoop fs -mkdir /user/hive/warehouse/jtlog.db/tb_par/country=JPA
hadoop fs -mkdir /user/hive/warehouse/jtlog.db/tb_par/country=JPA/gender=male
hadoop fs -mkdir /user/hive/warehouse/jtlog.db/tb_par/country=JPA/gender=female
hadoop fs -put JPA_male.txt /user/hive/warehouse/jtlog.db/tb_par/country=JPA/gender=male
select * from tb_par;
country为JPA的数据为0,原因是mysql中的hive元数据中没有相关country为JPA的记录。解决方法为:
alter table tb_par add partition (country='JPA') location '/user/hive/warehouse/jtlog.db/tb_par/country=JPA/gender=male;
删除mysql中的元数据 
alter table tb_par drop partition(country='JPA');
  • 分桶表
    在测试过程中,每次都将全表数据加载进来会花费非常多的时间,而随意截取部分数据进行测试又不具有代表性,这时我们可以使用分桶的方法,来减少测试数据量,并使结果具有较高的代表性。
    分桶表
    创建分桶表的原数据表并加载数据
    在这里插入图片描述
create table tb_data(id int,name string) row format delimited fields terminated by ',';
load data local inpath '/home/data/teachers.txt' into table tb_data;
创建分桶表
create table tb_buc (id int,name string) clustered by (id) into 4 buckets row format delimited fields terminated by ',';
开启分桶模式:Hive默认未开启多个reduce,分桶需要多个reduce同时工作,所以这里要开启分桶模式:
set hive.enforce bucketing=true;
原表数据分桶到分桶表
insert into table tb_buc select * from tb_data;
分桶查询数据(数据分为四桶,查询第一桶数据)
select * from tb_buc tablesample(bucket 1 out of 4 on id);
查询分桶表中的前百分之30的数据
select * from tb_data tablesample (30 peicent);

总结

数据仓库和关系型数据库的区别

在这里插入图片描述

hive常见面试

所有的离线数据处理场景都适用hive吗?

并不是所有场景都适合,逻辑简单又要求快速出结果的场景Hive优势更大。但是在业务逻辑非常复杂的情况下还是需要开发MapReduce程序更加直接有效。

Hive能作为业务系统的数据库使用吗?

不能。传统数据库要求能够为系统提供实时的增删改查,而Hive不支持行级别的增删改,查询的速度也不比传统关系型数据库,而是胜在吞吐量高,所以不能作为关系型数据库来使用。

Hive与传统MR方式处理数据相比能够提高运行效率吗?能够提高工作效率吗?

Hive的使用中需要将HQL编译为MR来运行,所以在执行效率上要低于直接运行MR程序。但是对于我们来说,由于只需要编写调试HQL,而不用开发调试复杂的MR程序,所以工作效率能够大大提高。

Hive为什么不支持行级别的增删改?

Hive不支持行级别的增删改的根本原因在于他的底层HDFS本身不支持。在HDFS中如果对整个文件的某一段或某一行内容进行增删改,势必会影响整个文件在集群中的存放布局。需要对整个集群中的数据进行汇总,重新切块,重新发送数据到每个节点,并备份,这样的情况是得不偿失的。所以HDFS的设计模式使他天生不适合做这个事

sqoop(数据互导)

官网:http://sqoop.apache.org/
sqoop可以将HDFS中的数据导入关系型数据库,也可以将关系型数据库中的数据导入HDFS

  • sqoop的使用必须建立在jdk和hadoop的前提上,通过JAVA_HOME找到JDK,通过HADOOP_HOME找到hadoop,除了在sqoop的lib包添加数据库的驱动包外不需要其他多余的配置。
    在这里插入图片描述
  • HDFS中表字段需与关系型数据库中的表字段一一对应,否则报错。
create table tongji(reportTime string,pv int,uv int,vv int, br double,newip int, newcust int, avgtime double,avgdeep double) row format delimited fields terminated by '|';
CREATE TABLE jtdata (reportTime varchar(100),pv bigint(20),uv bigint(20),vv bigint(20),br double,newip bigint(20),newcust bigint(20),avgtime double,avgdeep double);
  • 互导操作(sqoop的bin目录下执行)
//数据库到hdfs
./sqoop import --connect jdbc:mysql://192.168.65.1:3306/jtlog --username root --password root --table jtdata -m 1 --target-dir '/sqoop/jtlog' --fields-terminated-by '|';
//hdfs到数据库
./sqoop export --connect jdbc:mysql://192.168.65.1:3306/jtlog --username root --password root --export-dir '/user/hive/warehouse/jtlogdb.db/tongji' --table jtdata -m 1 --fields-terminated-by '|';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值