一、Hive简介
二、Hive下载
三、Hive元数据
四、Hive的使用
五、Hive启动出现的问题
六、思考及作业:
简介:
Hive是一个数据仓库(data warehouse),能够读、写、管理大量数据,它是构建在Hadoop之上的数据仓库。
数据存储在hdfs,用MapReduce执行,运行是yarn。
为什么MapReduce的执行性能不理想
进程运行中jps查看进程会有一个runjar进程,使用jps -l 或jps -m查看该进程。
部署的前提条件:
Requirements:
jdk1.7+
hadoop2.x
linux系统
本次部署使用软件:hive-1.1.0-cdh5.7.0
一、下载:
1、bin目录:存放脚本执行文件.
2、conf目录:存放配置文件,对于Hadoop来说它的conf目录是:HADOOP_HOME/etc/hadoop;对于Hive来说它的conf目录是:HIVE_HOME/conf.
3、习惯配置当前用户环境变量:
vi ~/.bash_profile 配置完后source生效
二、部署
export HIVE_HOME = /home/hadoop/app/hive-1.1.0-cdh5.7.0
PATH=$HIVE_HOME/bin:$PATH
source ~./bash_profile
注意点:新开session(窗口)不需要source生效;已开窗口没有source的话,则环境变量不生效。
第一步:
本地数据准备:在/home/hadoop/data目录下准备一份ruozeinput.txt文件:
cat ruozeinput.txt
ruoze ruoze ruoze
jepson jepson
john
第二步:
第三步:
wordcount的命令:
hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcount/input/ruozeinput.txt /wordcount/output
hadoop 跟上 jar 跟上官方给的这个jar包(hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar) 跟上wordcount 跟上输入路径(计算wordcount文件的路径) 跟上输出路径(结果输出路径)
先确保hdfs启动成功,jps查看到三进程已经启动,使用hive启动hive。
1、在hive中创建d6_wc表,使用建表语句:create table d6_wc(sentence string);
此时表中数据是空的。
2、把本地/home/hadoop/data/ruozeinput.txt这个文件加载至我们创建的d6_wc表。
语法如下:
select word, count(1) c
from xxx
group by word
order by c desc;
可以使用Hive中自带的函数:
select word, count(1) as c
from
(select explode(split(sentence,'\t')) as word from d6_wc) as a //as a这个别名是后加的,不写会报错:missing EOF at 'by' near 'group'
group by word
order by c desc;
注意到如下图,输入完这串命令是跑MapReduce作业的,结果能顺利输出出来。
-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
问题:文本文件有schema信息吗? 。
比如:ruozeinput.txt 就是一个普通的不能再普通的文本文件
解释:我们学习关系型数据库的时候,有数据库、表,在表中:有列的名字和类型(name/type),table/database/column(name/type) 这些叫做schema信息。
eg:对于ruozeinput.txt来说, 它是一行一行的数据,我们之前的sql是把每一行当做一个字段;sentence对于表来说是列的名字,对于元数据来说是字段的一个名称。
假设:cat emp.txt
员工编号 | 员工名字 | 员工岗位 | 员工上级领导编号 | 员工入职时间 | 工资 | 奖金 | 部门编号 |
---|---|---|---|---|---|---|---|
7639 | Smith | clerk | 7902 | 19800205 | 5500 | 20 |
1、此时这份emp.txt表对于hdfs来说并不清楚员工名字是第几个字段;
2、有了schema以后,我们创建一张表会创建字段以及字段类型(create table empid string),这些就是schema信息;此时我们去单独拿出name信息就比较好拿。
3、这个列在这个数据中处于第几位得知道,比如这份数据中我们肉眼观察到第二列才是名字,第一列是员工编号;
4、建表语句
5、schema就是元数据信息里的东西
生产上基本都用mysql做hive信息的存储;意味着我们还要配置MySQL。
问题:如果要访问MySQL,需要哪些东西?
问题:为何存储在Hive中?Hive是数据仓库,它是存储在hdfs上的,访问hdfs的速度和访问关系型数据库的速度?
1、下载
2、解压到~/app
3、把bin添加到环境变量
4、拷贝MySQL的驱动到lib目录下:
5、$HIVE_HOME/conf目录下vi hive-site.xml
我们需要安装MySQL的驱动:
在这个目录下:/home/hadoop/app/hive/lib,把我们本地准备好的mysql驱动包使用rz命令上传上去。
mysql-connector-java-5.1.46-bin.jar 包
链接:https://pan.baidu.com/s/1T0neIzdwAZzNbFSgseAipg
提取码:a7cj
复制这段内容后打开百度网盘手机App,操作更方便哦
特别重要:链接过程中参数不对就会报错,百度而不得解
javax.jdo.option.ConnectionURL 元数据库的链接地址
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8 数据库不用手工创建
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver 指定mysql驱动
javax.jdo.option.ConnectionUserName
hive 指定mysql用户名,我用的是hive用户名
javax.jdo.option.ConnectionPassword
960210 指定mysql密码 请输入自己的MySQL连接密码
1、了解那个环节会存在单点问题:MYSQL单点。
为什么这么说?因为MySQL是存储元数据信息,所有的元数据都拿不到,我们的Hive还能访问么?
进行测试:
原因:
解决方法:MySQL采用主备方法。
MySQL的单点问题,采用“主备”结构,哔哩哔哩搜“若泽数据”有视频;主备的意思是有2个MySQL,一个挂了另一个过来启动。
1、Hive是一个客户端,不存在集群的概念。意味着我们可以把它部署在DataNode、ResourceManager,这台机器挂了还有其它机器能提交。
1、在生产过程中,hive虽然没有集群的概念,也要部署多个;
2、假设我们在三台机器上部署了三个Hive,三台机器上有一个调度系统(schedule),调度系统定时把作业提交到执行机上,执行机上肯定要安装hive(执行机挂掉了,肯定就调用不过来),调用前要事先测试能够成功通信(类似ping通),这样的话Hive就不存在单点问题了。
Answer:一毛钱关系都没有
1、从语法层面来讲:是非常类似的
Hive VS RDBMS
1、面向SQL编程,都是使用SQL
2、关系型数据库更快些 --> 时效性问题,Hive底层是基于mapreduce的,速度不快。
Hive是支持事物的,在离线任务中,大数据的“事物”比较鸡肋
1、关系型数据库底层支持分布式的,hive底层的执行引擎(MapReduce)也是分布式的。
2、分布式就意味着会有很多节点,在hive中,spark可以布很多节点。
3、关系型数据库的集群有限制,布了二三十个就不行了。关系型数据库处理的数据不会太大,到G级别差不多了;而Hive这种大数据框架可以到PB级别,大数据机器只要集群资源够,不怕存储存不下。
4、大数据不怕数据量大,就怕数据倾斜。hive适用于离线批处理(延时性比关系型数据库高一些),有了hive以后可以使用SQL进行处理比mapreduce方便的多。
5、hadoop 、hive部署在廉价的机器上,关系型数据布在专用的机器上,一般是小型机。
Hive是运行在Hadoop集群上的 , 所以在安装Hive之前 , 应先启动Hadoop集群 。
意思是:单节点机器的话就需要使用命令:start-dfs.sh,需要启动三进程NameNode、SecondaryNameNode、DataNode。
Logging initialized using configuration in jar:file:/home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/hive-common-1.1.0-cdh5.7.0.jar!/hive-log4j.properties
Exception in thread “main” java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby.
1)、Hive不难,就是写SQL实现, XXXX
回答:在写SQL过程中整体架构是怎么考虑的,做了哪些功能的调整和优化,数据倾斜是怎么解决的。
思考,单纯写SQL的话已经有那么多框架了,还要Hive干嘛?
2)、架构层面、语法层面、底层执行层面 都需要考虑优化
经典问题:
经典面试题:
在关系型数据库一般用update、insert,Hive中一般使用load,问hive支不支持update insert?
hive高版本支持,但是性能差,insert插入还会产生很多小文件。